From 9462cc3d2f6eb27998a575fc1de338c6b93d0472 Mon Sep 17 00:00:00 2001 From: Alexey Toptygin Date: Thu, 2 Aug 2018 11:54:19 -0700 Subject: [PATCH] Add a runtime option to raise notices when reading dynamic props. Summary: Add a runtime option that causes a notice to be raised any time a dynamic property is read from an object. Like the option for creates of dynamic properties, this one intentionally differentiates between property names that came from static strings and those that didn't, and it intentionally ignores instances of stdClass and __PHP_Incomplete_Class. Reviewed By: markw65 Differential Revision: D9129623 fbshipit-source-id: 260f54f3c90b728f2b66b9affabad810ec9a7239 --- hphp/runtime/base/object-data.cpp | 76 +++- hphp/runtime/base/object-data.h | 7 +- hphp/runtime/base/runtime-option.h | 1 + hphp/runtime/ext/reflection/ext_reflection.cpp | 21 +- hphp/runtime/ext/std/ext_std_classobj.cpp | 3 + .../slow/object_property/dynprop_read_notice.php | 113 +++++ .../dynprop_read_notice.php.expectf | 463 +++++++++++++++++++++ .../object_property/dynprop_read_notice.php.opts | 1 + ...dynprop_notice.php => dynprop_write_notice.php} | 0 ...hp.expectf => dynprop_write_notice.php.expectf} | 72 ++-- ...tice.php.opts => dynprop_write_notice.php.opts} | 0 11 files changed, 693 insertions(+), 64 deletions(-) create mode 100644 hphp/test/slow/object_property/dynprop_read_notice.php create mode 100644 hphp/test/slow/object_property/dynprop_read_notice.php.expectf create mode 100644 hphp/test/slow/object_property/dynprop_read_notice.php.opts rename hphp/test/slow/object_property/{dynprop_notice.php => dynprop_write_notice.php} (100%) rename hphp/test/slow/object_property/{dynprop_notice.php.expectf => dynprop_write_notice.php.expectf} (72%) rename hphp/test/slow/object_property/{dynprop_notice.php.opts => dynprop_write_notice.php.opts} (100%) diff --git a/hphp/runtime/base/object-data.cpp b/hphp/runtime/base/object-data.cpp index 882e63c7f43..98ba7bac299 100644 --- a/hphp/runtime/base/object-data.cpp +++ b/hphp/runtime/base/object-data.cpp @@ -437,7 +437,7 @@ void ObjectData::o_set(const String& propName, const Variant& v, bool useSet = m_cls->rtAttribute(Class::UseSet); - auto const lookup = getPropImpl(ctx, propName.get()); + auto const lookup = getPropImpl(ctx, propName.get()); auto prop = lookup.val; if (prop && lookup.accessible) { if (!useSet || type(prop) != KindOfUninit) { @@ -489,6 +489,12 @@ void ObjectData::o_getArray(Array& props, bool pubOnly /* = false */) const { // Fast path for classes with no declared properties if (!m_cls->numDeclProperties() && getAttribute(HasDynPropArr)) { props = dynPropArray(); + if (RuntimeOption::EvalNoticeOnReadDynamicProp) { + IterateKV(props.get(), [&](Cell k, TypedValue) { + auto const key = tvCastToString(k); + raiseReadDynamicProp(key.get()); + }); + } return; } // The declared properties in the resultant array should be a permutation of @@ -514,11 +520,13 @@ void ObjectData::o_getArray(Array& props, bool pubOnly /* = false */) const { // Iterate over dynamic properties and insert {name --> prop} pairs. if (UNLIKELY(getAttribute(HasDynPropArr))) { auto& dynProps = dynPropArray(); - if (!dynProps.empty()) { - for (ArrayIter it(dynProps.get()); !it.end(); it.next()) { - props.setWithRef(it.first(), it.secondVal(), true); + IterateKV(dynProps.get(), [&](Cell k, TypedValue v) { + props.setWithRef(k, v, true); + if (RuntimeOption::EvalNoticeOnReadDynamicProp) { + auto const key = tvCastToString(k); + raiseReadDynamicProp(key.get()); } - } + }); } } @@ -597,8 +605,15 @@ size_t getPropertyIfAccessible(ObjectData* obj, Array ObjectData::o_toIterArray(const String& context, IterMode mode) { if (mode == PreserveRefs && !m_cls->numDeclProperties()) { if (getAttribute(HasDynPropArr)) { + auto const props = dynPropArray(); + if (RuntimeOption::EvalNoticeOnReadDynamicProp) { + IterateKV(props.get(), [&](Cell k, TypedValue) { + auto const key = tvCastToString(k); + raiseReadDynamicProp(key.get()); + }); + } // not returning Array&; makes a copy - return dynPropArray(); + return props; } return Array::Create(); } @@ -652,6 +667,11 @@ Array ObjectData::o_toIterArray(const String& context, IterMode mode) { auto const key = ad->nvGetKey(iter); iter = ad->iter_advance(iter); + if (RuntimeOption::EvalNoticeOnReadDynamicProp) { + auto const k = tvCastToString(key); + raiseReadDynamicProp(k.get()); + } + // You can get this if you cast an array to object. These // properties must be dynamic because you can't declare a // property with a non-string name. @@ -1111,7 +1131,7 @@ void ObjectData::throwBindImmutable(Slot prop) const { ); } -template +template ALWAYS_INLINE ObjectData::PropLookup ObjectData::getPropImpl( const Class* ctx, @@ -1151,6 +1171,9 @@ ObjectData::PropLookup ObjectData::getPropImpl( if (UNLIKELY(getAttribute(HasDynPropArr))) { auto& arr = dynPropArray(); if (auto const rval = arr->rval(key)) { + if (forRead && RuntimeOption::EvalNoticeOnReadDynamicProp) { + raiseReadDynamicProp(key); + } // Returning a non-declared property. We know that it is accessible and // not immutable since all dynamic properties are. If we may write to // the property we need to allow the array to escalate. @@ -1166,7 +1189,7 @@ ObjectData::PropLookup ObjectData::getPropImpl( } tv_lval ObjectData::getPropLval(const Class* ctx, const StringData* key) { - auto const lookup = getPropImpl(ctx, key); + auto const lookup = getPropImpl(ctx, key); if (UNLIKELY(lookup.immutable) && !isBeingConstructed()) { throwMutateImmutable(lookup.slot); } @@ -1175,12 +1198,12 @@ tv_lval ObjectData::getPropLval(const Class* ctx, const StringData* key) { tv_rval ObjectData::getProp(const Class* ctx, const StringData* key) const { auto const lookup = const_cast(this) - ->getPropImpl(ctx, key); + ->getPropImpl(ctx, key); return lookup.val && lookup.accessible ? lookup.val : nullptr; } tv_lval ObjectData::vGetProp(const Class* ctx, const StringData* key) { - auto const lookup = getPropImpl(ctx, key); + auto const lookup = getPropImpl(ctx, key); auto prop = lookup.val; if (UNLIKELY(lookup.immutable)) throwBindImmutable(lookup.slot); if (lookup.accessible && prop && type(prop) != KindOfUninit) { @@ -1191,7 +1214,7 @@ tv_lval ObjectData::vGetProp(const Class* ctx, const StringData* key) { } tv_lval ObjectData::vGetPropIgnoreAccessibility(const StringData* key) { - auto const lookup = getPropImpl(nullptr, key); + auto const lookup = getPropImpl(nullptr, key); auto prop = lookup.val; if (UNLIKELY(lookup.immutable)) throwBindImmutable(lookup.slot); if (prop && type(prop) != KindOfUninit) { @@ -1390,7 +1413,9 @@ tv_lval ObjectData::propImpl(TypedValue* tvRef, const Class* ctx, const StringData* key, MInstrPropState* pState) { auto constexpr write = (mode == PropMode::DimForWrite) || (mode == PropMode::Bind); - auto const lookup = getPropImpl(ctx, key); + auto constexpr read = (mode == PropMode::ReadNoWarn) || + (mode == PropMode::ReadWarn); + auto const lookup = getPropImpl(ctx, key); auto const prop = lookup.val; if (prop) { @@ -1590,7 +1615,7 @@ bool ObjectData::propEmpty(const Class* ctx, const StringData* key) { } void ObjectData::setProp(Class* ctx, const StringData* key, Cell val) { - auto const lookup = getPropImpl(ctx, key); + auto const lookup = getPropImpl(ctx, key); auto const prop = lookup.val; if (prop && lookup.accessible) { @@ -1634,7 +1659,7 @@ tv_lval ObjectData::setOpProp(TypedValue& tvRef, SetOpOp op, const StringData* key, Cell* val) { - auto const lookup = getPropImpl(ctx, key); + auto const lookup = getPropImpl(ctx, key); auto prop = lookup.val; if (prop && lookup.accessible) { @@ -1730,7 +1755,7 @@ tv_lval ObjectData::setOpProp(TypedValue& tvRef, } Cell ObjectData::incDecProp(Class* ctx, IncDecOp op, const StringData* key) { - auto const lookup = getPropImpl(ctx, key); + auto const lookup = getPropImpl(ctx, key); auto prop = lookup.val; if (prop && lookup.accessible) { @@ -1817,7 +1842,7 @@ Cell ObjectData::incDecProp(Class* ctx, IncDecOp op, const StringData* key) { } void ObjectData::unsetProp(Class* ctx, const StringData* key) { - auto const lookup = getPropImpl(ctx, key); + auto const lookup = getPropImpl(ctx, key); auto const prop = lookup.val; if (prop && lookup.accessible && type(prop) != KindOfUninit) { @@ -1872,12 +1897,12 @@ void ObjectData::raiseAbstractClassError(Class* cls) { cls->preClass()->name()->data()); } -void ObjectData::raiseUndefProp(const StringData* key) { +void ObjectData::raiseUndefProp(const StringData* key) const { raise_notice("Undefined property: %s::$%s", m_cls->name()->data(), key->data()); } -void ObjectData::raiseCreateDynamicProp(const StringData* key) { +void ObjectData::raiseCreateDynamicProp(const StringData* key) const { if (m_cls == SystemLib::s_stdclassClass || m_cls == SystemLib::s___PHP_Incomplete_ClassClass) { // these classes (but not classes derived from them) don't get notices @@ -1892,6 +1917,21 @@ void ObjectData::raiseCreateDynamicProp(const StringData* key) { } } +void ObjectData::raiseReadDynamicProp(const StringData* key) const { + if (m_cls == SystemLib::s_stdclassClass || + m_cls == SystemLib::s___PHP_Incomplete_ClassClass) { + // these classes (but not classes derived from them) don't get notices + return; + } + if (key->isStatic()) { + raise_notice("Read dynamic property with static name %s::%s", + m_cls->name()->data(), key->data()); + } else { + raise_notice("Read dynamic property with dynamic name %s::%s", + m_cls->name()->data(), key->data()); + } +} + void ObjectData::getProp(const Class* klass, bool pubOnly, const PreClass::Prop* prop, diff --git a/hphp/runtime/base/object-data.h b/hphp/runtime/base/object-data.h index 46eecb0af2b..b706af26cce 100644 --- a/hphp/runtime/base/object-data.h +++ b/hphp/runtime/base/object-data.h @@ -474,7 +474,7 @@ struct ObjectData : Countable, type_scan::MarkCollectable { bool immutable; }; - template + template ALWAYS_INLINE PropLookup getPropImpl(const Class*, const StringData*); @@ -534,8 +534,9 @@ struct ObjectData : Countable, type_scan::MarkCollectable { static void raiseObjToIntNotice(const char*); static void raiseObjToDoubleNotice(const char*); static void raiseAbstractClassError(Class*); - void raiseUndefProp(const StringData*); - void raiseCreateDynamicProp(const StringData*); + void raiseUndefProp(const StringData*) const; + void raiseCreateDynamicProp(const StringData*) const; + void raiseReadDynamicProp(const StringData*) const; static constexpr ptrdiff_t getVMClassOffset() { return offsetof(ObjectData, m_cls); diff --git a/hphp/runtime/base/runtime-option.h b/hphp/runtime/base/runtime-option.h index 113edad1fa8..f9647cab326 100644 --- a/hphp/runtime/base/runtime-option.h +++ b/hphp/runtime/base/runtime-option.h @@ -861,6 +861,7 @@ struct RuntimeOption { F(bool, IsExprEnableUnresolvedWarning, false) \ /* Switches on miscellaneous junk. */ \ F(bool, NoticeOnCreateDynamicProp, false) \ + F(bool, NoticeOnReadDynamicProp, false) \ F(bool, CreateInOutWrapperFunctions, true) \ F(bool, ReffinessInvariance, false) \ F(bool, NoticeOnBuiltinDynamicCalls, false) \ diff --git a/hphp/runtime/ext/reflection/ext_reflection.cpp b/hphp/runtime/ext/reflection/ext_reflection.cpp index 6faeff11308..6bd34cb142d 100644 --- a/hphp/runtime/ext/reflection/ext_reflection.cpp +++ b/hphp/runtime/ext/reflection/ext_reflection.cpp @@ -281,7 +281,7 @@ static void set_instance_prop_info(Array& ret, static void set_dyn_prop_info( Array &ret, - const Variant& name, + Cell name, const StringData* className) { ret.set(s_name, name); set_attrs(ret, get_modifiers(AttrPublic, false, true) & ~0x66); @@ -1575,13 +1575,17 @@ static Array HHVM_METHOD(ReflectionClass, getDynamicPropertyInfos, return empty_array(); } - auto const dynPropArrayData = obj_data->dynPropArray().get(); - ArrayInit ret(dynPropArrayData->size(), ArrayInit::Mixed{}); - for (ArrayIter it(dynPropArrayData); !it.end(); it.next()) { + auto const dynPropArray = obj_data->dynPropArray(); + ArrayInit ret(dynPropArray->size(), ArrayInit::Mixed{}); + IterateKV(dynPropArray.get(), [&](Cell k, TypedValue) { + if (RuntimeOption::EvalNoticeOnReadDynamicProp) { + auto const key = tvCastToString(k); + obj_data->raiseReadDynamicProp(key.get()); + } Array info = Array::Create(); - set_dyn_prop_info(info, it.first(), cls->name()); - ret.setValidKey(*it.first().asTypedValue(), VarNR(info).tv()); - } + set_dyn_prop_info(info, k, cls->name()); + ret.setValidKey(k, VarNR(info).tv()); + }); return ret.toArray(); } @@ -1770,6 +1774,9 @@ static void HHVM_METHOD(ReflectionProperty, __construct, assertx(cls == obj->getVMClass()); if (obj->getAttribute(ObjectData::HasDynPropArr) && obj->dynPropArray().exists(prop_name)) { + if (RuntimeOption::EvalNoticeOnReadDynamicProp) { + obj->raiseReadDynamicProp(prop_name.get()); + } data->setDynamicProp(); this_->setProp(nullptr, s_class.get(), make_tv(cls->name())); diff --git a/hphp/runtime/ext/std/ext_std_classobj.cpp b/hphp/runtime/ext/std/ext_std_classobj.cpp index 04c697d1305..e9e9ce45493 100644 --- a/hphp/runtime/ext/std/ext_std_classobj.cpp +++ b/hphp/runtime/ext/std/ext_std_classobj.cpp @@ -312,6 +312,9 @@ Variant HHVM_FUNCTION(property_exists, const Variant& class_or_object, if (obj && UNLIKELY(obj->getAttribute(ObjectData::HasDynPropArr)) && obj->dynPropArray()->rval(property.get())) { + if (RuntimeOption::EvalNoticeOnReadDynamicProp) { + obj->raiseReadDynamicProp(property.get()); + } return true; } auto const propInd = cls->lookupSProp(property.get()); diff --git a/hphp/test/slow/object_property/dynprop_read_notice.php b/hphp/test/slow/object_property/dynprop_read_notice.php new file mode 100644 index 00000000000..93fdee0cc63 --- /dev/null +++ b/hphp/test/slow/object_property/dynprop_read_notice.php @@ -0,0 +1,113 @@ +dynprop = 3; + $discard = $thing->dynprop; + + echo "== read (dynamic name) ==\n"; + $propname = __hhvm_intrinsics\launder_value("dyn") . "prop"; + $discard = $thing->$propname; + + echo "== setOp ==\n"; + $thing->dynprop += 2; + + echo "== incDec ==\n"; + $thing->dynprop++; + + echo "== dim for read ==\n"; + $thing->dynprop = array('a' => 'b'); + $discard = $thing->dynprop['a']; + + echo "== dim for read (quiet) ==\n"; + $discard = $thing->dynprop['z'] ?? 'w'; + $thing->dynprop = 3; // set prop back to an int + + echo "== cast to array ==\n"; + $discard = (array)$thing; + + echo "== get_object_vars ==\n"; + $discard = get_object_vars($thing); + + echo "== foreach ==\n"; + foreach ($thing as $k => $v) { } + + echo "== foreach by reference ==\n"; + foreach ($thing as $k => &$v) { } + unset($v); // unbind + + echo "== ReflectionProperty ==\n"; + $discard = new ReflectionProperty($thing, 'dynprop'); + + // TODO: ReflectionClass constructor fatals on instances of + // __PHP_Incomplete_Class + if (!$thing instanceof __PHP_Incomplete_Class) { + echo "== ReflectionClass::getProperties ==\n"; + $rc = new ReflectionClass($thing); + $discard = $rc->getProperties(); + } + + echo "== property_exists ==\n"; + $discard = property_exists($thing, 'dynprop'); + + echo "== print_r ==\n"; + $discard = print_r($thing, true); + + echo "== var_export ==\n"; + $discard = var_export($thing, true); + + echo "== var_dump ==\n"; + var_dump($thing); + + echo "== debug_zval_dump ==\n"; + debug_zval_dump($thing); + + echo "== json_encode ==\n"; + $discard = json_encode($thing); + + echo "== serialize ==\n"; + $discard = serialize($thing); + + echo "== apc_store ==\n"; + apc_store('dynamic', $thing); + + echo "==== " . get_class($thing) . " never notice ====\n"; + + echo "== dim for write ==\n"; + $thing->dynprop = array('a' => 'b'); + $thing->dynprop['c'] = 'd'; + $thing->dynprop = 3; // set prop back to an int + + echo "== vget ==\n"; + $discard =& $thing->dynprop; + unset($discard); // unbind it + + echo "== bind ==\n"; + $local = 3; + $thing->dynprop =& $local; + unset($local); // unbind it + + echo "== clone ==\n"; + $discard = clone $thing; + + echo "== unset ==\n"; + unset($thing->dynprop); +} + +class C {} +class D { public $x = 1; } +class Extends_stdClass extends stdClass {} +class Extends___PHP_Incomplete_Class extends __PHP_Incomplete_Class {} + +function main() { + test(new C()); + test(new D()); + test(gmp_init(0)); + test(new stdClass()); + test(unserialize('O:4:"Nope":0:{}')); // __PHP_Incomplete_Class + test(new Extends_stdClass()); + test(new Extends___PHP_Incomplete_Class()); +} +main(); diff --git a/hphp/test/slow/object_property/dynprop_read_notice.php.expectf b/hphp/test/slow/object_property/dynprop_read_notice.php.expectf new file mode 100644 index 00000000000..81b8d68e871 --- /dev/null +++ b/hphp/test/slow/object_property/dynprop_read_notice.php.expectf @@ -0,0 +1,463 @@ +==== C may notice ==== +== read == + +Notice: Read dynamic property with static name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 8 +== read (dynamic name) == + +Notice: Read dynamic property with dynamic name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 12 +== setOp == + +Notice: Read dynamic property with static name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 15 +== incDec == + +Notice: Read dynamic property with static name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 18 +== dim for read == + +Notice: Read dynamic property with static name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 22 +== dim for read (quiet) == + +Notice: Read dynamic property with static name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 25 +== cast to array == + +Notice: Read dynamic property with static name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 29 +== get_object_vars == + +Notice: Read dynamic property with static name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 32 +== foreach == + +Notice: Read dynamic property with static name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 35 +== foreach by reference == + +Notice: Read dynamic property with static name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 38 +== ReflectionProperty == + +Notice: Read dynamic property with static name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 42 +== ReflectionClass::getProperties == + +Notice: Read dynamic property with static name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 49 + +Notice: Read dynamic property with static name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 49 +== property_exists == + +Notice: Read dynamic property with static name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 53 +== print_r == + +Notice: Read dynamic property with static name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 56 +== var_export == + +Notice: Read dynamic property with static name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 59 +== var_dump == + +Notice: Read dynamic property with static name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 62 +object(C)#1 (1) { + ["dynprop"]=> + %r&?%rint(3) +} +== debug_zval_dump == + +Notice: Read dynamic property with static name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 65 +object(C)#1 (1) refcount(%d){ + ["dynprop"]=> + %r&?%rlong(3) refcount(%d) +} +== json_encode == + +Notice: Read dynamic property with static name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 68 +== serialize == + +Notice: Read dynamic property with static name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 71 +== apc_store == + +Notice: Read dynamic property with static name C::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 74 +==== C never notice ==== +== dim for write == +== vget == +== bind == +== clone == +== unset == +==== D may notice ==== +== read == + +Notice: Read dynamic property with static name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 8 +== read (dynamic name) == + +Notice: Read dynamic property with dynamic name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 12 +== setOp == + +Notice: Read dynamic property with static name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 15 +== incDec == + +Notice: Read dynamic property with static name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 18 +== dim for read == + +Notice: Read dynamic property with static name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 22 +== dim for read (quiet) == + +Notice: Read dynamic property with static name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 25 +== cast to array == + +Notice: Read dynamic property with static name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 29 +== get_object_vars == + +Notice: Read dynamic property with static name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 32 +== foreach == + +Notice: Read dynamic property with static name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 35 +== foreach by reference == + +Notice: Read dynamic property with static name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 38 +== ReflectionProperty == + +Notice: Read dynamic property with static name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 42 +== ReflectionClass::getProperties == + +Notice: Read dynamic property with static name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 49 + +Notice: Read dynamic property with static name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 49 +== property_exists == + +Notice: Read dynamic property with static name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 53 +== print_r == + +Notice: Read dynamic property with static name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 56 +== var_export == + +Notice: Read dynamic property with static name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 59 +== var_dump == + +Notice: Read dynamic property with static name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 62 +object(D)#5 (2) { + ["x"]=> + %r&?%rint(1) + ["dynprop"]=> + %r&?%rint(3) +} +== debug_zval_dump == + +Notice: Read dynamic property with static name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 65 +object(D)#5 (2) refcount(%d){ + ["x"]=> + %r&?%rlong(1) refcount(%d) + ["dynprop"]=> + %r&?%rlong(3) refcount(%d) +} +== json_encode == + +Notice: Read dynamic property with static name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 68 +== serialize == + +Notice: Read dynamic property with static name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 71 +== apc_store == + +Notice: Read dynamic property with static name D::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 74 +==== D never notice ==== +== dim for write == +== vget == +== bind == +== clone == +== unset == +==== GMP may notice ==== +== read == + +Notice: Read dynamic property with static name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 8 +== read (dynamic name) == + +Notice: Read dynamic property with dynamic name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 12 +== setOp == + +Notice: Read dynamic property with static name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 15 +== incDec == + +Notice: Read dynamic property with static name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 18 +== dim for read == + +Notice: Read dynamic property with static name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 22 +== dim for read (quiet) == + +Notice: Read dynamic property with static name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 25 +== cast to array == + +Notice: Read dynamic property with static name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 29 +== get_object_vars == + +Notice: Read dynamic property with static name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 32 +== foreach == + +Notice: Read dynamic property with static name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 35 +== foreach by reference == + +Notice: Read dynamic property with static name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 38 +== ReflectionProperty == + +Notice: Read dynamic property with static name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 42 +== ReflectionClass::getProperties == + +Notice: Read dynamic property with static name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 49 + +Notice: Read dynamic property with static name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 49 +== property_exists == + +Notice: Read dynamic property with static name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 53 +== print_r == + +Notice: Read dynamic property with static name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 56 +== var_export == + +Notice: Read dynamic property with static name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 59 +== var_dump == + +Notice: Read dynamic property with static name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 62 +object(GMP)#10 (2) { + ["dynprop"]=> + %r&?%rint(3) + ["num"]=> + string(1) "0" +} +== debug_zval_dump == + +Notice: Read dynamic property with static name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 65 +object(GMP)#10 (1) refcount(%d){ + ["dynprop"]=> + %r&?%rlong(3) refcount(%d) +} +== json_encode == + +Notice: Read dynamic property with static name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 68 +== serialize == + +Notice: Read dynamic property with static name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 71 +== apc_store == + +Notice: Read dynamic property with static name GMP::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 74 +==== GMP never notice ==== +== dim for write == +== vget == +== bind == +== clone == +== unset == +==== stdClass may notice ==== +== read == +== read (dynamic name) == +== setOp == +== incDec == +== dim for read == +== dim for read (quiet) == +== cast to array == +== get_object_vars == +== foreach == +== foreach by reference == +== ReflectionProperty == +== ReflectionClass::getProperties == +== property_exists == +== print_r == +== var_export == +== var_dump == +object(stdClass)#14 (1) { + ["dynprop"]=> + %r&?%rint(3) +} +== debug_zval_dump == +object(stdClass)#14 (1) refcount(%d){ + ["dynprop"]=> + %r&?%rlong(3) refcount(%d) +} +== json_encode == +== serialize == +== apc_store == +==== stdClass never notice ==== +== dim for write == +== vget == +== bind == +== clone == +== unset == +==== __PHP_Incomplete_Class may notice ==== +== read == +== read (dynamic name) == +== setOp == +== incDec == +== dim for read == +== dim for read (quiet) == +== cast to array == +== get_object_vars == +== foreach == +== foreach by reference == +== ReflectionProperty == +== property_exists == +== print_r == +== var_export == +== var_dump == +object(__PHP_Incomplete_Class)#18 (2) { + ["__PHP_Incomplete_Class_Name"]=> + %r&?%rstring(4) "Nope" + ["dynprop"]=> + %r&?%rint(3) +} +== debug_zval_dump == +object(__PHP_Incomplete_Class)#18 (2) refcount(%d){ + ["__PHP_Incomplete_Class_Name"]=> + %r&?%rstring(4) "Nope" refcount(%d) + ["dynprop"]=> + %r&?%rlong(3) refcount(%d) +} +== json_encode == +== serialize == +== apc_store == +==== __PHP_Incomplete_Class never notice ==== +== dim for write == +== vget == +== bind == +== clone == +== unset == +==== Extends_stdClass may notice ==== +== read == + +Notice: Read dynamic property with static name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 8 +== read (dynamic name) == + +Notice: Read dynamic property with dynamic name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 12 +== setOp == + +Notice: Read dynamic property with static name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 15 +== incDec == + +Notice: Read dynamic property with static name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 18 +== dim for read == + +Notice: Read dynamic property with static name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 22 +== dim for read (quiet) == + +Notice: Read dynamic property with static name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 25 +== cast to array == + +Notice: Read dynamic property with static name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 29 +== get_object_vars == + +Notice: Read dynamic property with static name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 32 +== foreach == + +Notice: Read dynamic property with static name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 35 +== foreach by reference == + +Notice: Read dynamic property with static name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 38 +== ReflectionProperty == + +Notice: Read dynamic property with static name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 42 +== ReflectionClass::getProperties == + +Notice: Read dynamic property with static name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 49 + +Notice: Read dynamic property with static name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 49 +== property_exists == + +Notice: Read dynamic property with static name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 53 +== print_r == + +Notice: Read dynamic property with static name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 56 +== var_export == + +Notice: Read dynamic property with static name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 59 +== var_dump == + +Notice: Read dynamic property with static name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 62 +object(Extends_stdClass)#18 (1) { + ["dynprop"]=> + %r&?%rint(3) +} +== debug_zval_dump == + +Notice: Read dynamic property with static name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 65 +object(Extends_stdClass)#18 (1) refcount(%d){ + ["dynprop"]=> + %r&?%rlong(3) refcount(%d) +} +== json_encode == + +Notice: Read dynamic property with static name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 68 +== serialize == + +Notice: Read dynamic property with static name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 71 +== apc_store == + +Notice: Read dynamic property with static name Extends_stdClass::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 74 +==== Extends_stdClass never notice ==== +== dim for write == +== vget == +== bind == +== clone == +== unset == +==== Extends___PHP_Incomplete_Class may notice ==== +== read == + +Notice: Read dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 8 +== read (dynamic name) == + +Notice: Read dynamic property with dynamic name Extends___PHP_Incomplete_Class::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 12 +== setOp == + +Notice: Read dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 15 +== incDec == + +Notice: Read dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 18 +== dim for read == + +Notice: Read dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 22 +== dim for read (quiet) == + +Notice: Read dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 25 +== cast to array == + +Notice: Read dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 29 +== get_object_vars == + +Notice: Read dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 32 +== foreach == + +Notice: Read dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 35 +== foreach by reference == + +Notice: Read dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 38 +== ReflectionProperty == + +Notice: Read dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 42 +== property_exists == + +Notice: Read dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 53 +== print_r == + +Notice: Read dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 56 +== var_export == + +Notice: Read dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 59 +== var_dump == + +Notice: Read dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 62 +object(Extends___PHP_Incomplete_Class)#22 (2) { + ["__PHP_Incomplete_Class_Name"]=> + %r&?%rNULL + ["dynprop"]=> + %r&?%rint(3) +} +== debug_zval_dump == + +Notice: Read dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 65 +object(Extends___PHP_Incomplete_Class)#22 (2) refcount(%d){ + ["__PHP_Incomplete_Class_Name"]=> + %r&?%rNULL refcount(%d) + ["dynprop"]=> + %r&?%rlong(3) refcount(%d) +} +== json_encode == + +Notice: Read dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 68 +== serialize == + +Notice: Read dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 71 +== apc_store == + +Notice: Read dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/test/slow/object_property/dynprop_read_notice.php on line 74 +==== Extends___PHP_Incomplete_Class never notice ==== +== dim for write == +== vget == +== bind == +== clone == +== unset == diff --git a/hphp/test/slow/object_property/dynprop_read_notice.php.opts b/hphp/test/slow/object_property/dynprop_read_notice.php.opts new file mode 100644 index 00000000000..c9032d47aa3 --- /dev/null +++ b/hphp/test/slow/object_property/dynprop_read_notice.php.opts @@ -0,0 +1 @@ +-vEval.NoticeOnReadDynamicProp=true diff --git a/hphp/test/slow/object_property/dynprop_notice.php b/hphp/test/slow/object_property/dynprop_write_notice.php similarity index 100% rename from hphp/test/slow/object_property/dynprop_notice.php rename to hphp/test/slow/object_property/dynprop_write_notice.php diff --git a/hphp/test/slow/object_property/dynprop_notice.php.expectf b/hphp/test/slow/object_property/dynprop_write_notice.php.expectf similarity index 72% rename from hphp/test/slow/object_property/dynprop_notice.php.expectf rename to hphp/test/slow/object_property/dynprop_write_notice.php.expectf index 84a6f88a082..d747db688ea 100644 --- a/hphp/test/slow/object_property/dynprop_notice.php.expectf +++ b/hphp/test/slow/object_property/dynprop_write_notice.php.expectf @@ -1,10 +1,10 @@ ==== C ==== -Notice: Created dynamic property with static name C::dynprop in %s/dynprop_notice.php on line 5 +Notice: Created dynamic property with static name C::dynprop in %s/dynprop_write_notice.php on line 5 -Notice: Created dynamic property with dynamic name C::dynprop2 in %s/dynprop_notice.php on line 7 +Notice: Created dynamic property with dynamic name C::dynprop2 in %s/dynprop_write_notice.php on line 7 -Notice: Created dynamic property with static name C::dynprop3 in %s/dynprop_notice.php on line 8 +Notice: Created dynamic property with static name C::dynprop3 in %s/dynprop_write_notice.php on line 8 object(C)#1 (3) { ["dynprop"]=> int(3) @@ -14,11 +14,11 @@ object(C)#1 (3) { int(1) } -Notice: Created dynamic property with dynamic name C::dynprop in %s/dynprop_notice.php on line 10 +Notice: Created dynamic property with dynamic name C::dynprop in %s/dynprop_write_notice.php on line 10 -Notice: Created dynamic property with dynamic name C::dynprop2 in %s/dynprop_notice.php on line 10 +Notice: Created dynamic property with dynamic name C::dynprop2 in %s/dynprop_write_notice.php on line 10 -Notice: Created dynamic property with dynamic name C::dynprop3 in %s/dynprop_notice.php on line 10 +Notice: Created dynamic property with dynamic name C::dynprop3 in %s/dynprop_write_notice.php on line 10 object(C)#2 (3) { ["dynprop"]=> int(3) @@ -28,11 +28,11 @@ object(C)#2 (3) { int(1) } -Notice: Created dynamic property with static name C::dynprop in %s/dynprop_notice.php on line 12 +Notice: Created dynamic property with static name C::dynprop in %s/dynprop_write_notice.php on line 12 -Notice: Created dynamic property with dynamic name C::dynprop2 in %s/dynprop_notice.php on line 12 +Notice: Created dynamic property with dynamic name C::dynprop2 in %s/dynprop_write_notice.php on line 12 -Notice: Created dynamic property with static name C::dynprop3 in %s/dynprop_notice.php on line 12 +Notice: Created dynamic property with static name C::dynprop3 in %s/dynprop_write_notice.php on line 12 object(C)#2 (3) { ["dynprop"]=> int(3) @@ -43,11 +43,11 @@ object(C)#2 (3) { } ==== GMP ==== -Notice: Created dynamic property with static name GMP::dynprop in %s/dynprop_notice.php on line 5 +Notice: Created dynamic property with static name GMP::dynprop in %s/dynprop_write_notice.php on line 5 -Notice: Created dynamic property with dynamic name GMP::dynprop2 in %s/dynprop_notice.php on line 7 +Notice: Created dynamic property with dynamic name GMP::dynprop2 in %s/dynprop_write_notice.php on line 7 -Notice: Created dynamic property with static name GMP::dynprop3 in %s/dynprop_notice.php on line 8 +Notice: Created dynamic property with static name GMP::dynprop3 in %s/dynprop_write_notice.php on line 8 object(GMP)#1 (4) { ["dynprop"]=> int(3) @@ -59,11 +59,11 @@ object(GMP)#1 (4) { string(1) "0" } -Notice: Created dynamic property with dynamic name GMP::dynprop in %s/dynprop_notice.php on line 10 +Notice: Created dynamic property with dynamic name GMP::dynprop in %s/dynprop_write_notice.php on line 10 -Notice: Created dynamic property with dynamic name GMP::dynprop2 in %s/dynprop_notice.php on line 10 +Notice: Created dynamic property with dynamic name GMP::dynprop2 in %s/dynprop_write_notice.php on line 10 -Notice: Created dynamic property with dynamic name GMP::dynprop3 in %s/dynprop_notice.php on line 10 +Notice: Created dynamic property with dynamic name GMP::dynprop3 in %s/dynprop_write_notice.php on line 10 object(GMP)#2 (4) { ["dynprop"]=> int(3) @@ -75,11 +75,11 @@ object(GMP)#2 (4) { string(1) "0" } -Notice: Created dynamic property with dynamic name GMP::dynprop in %s/dynprop_notice.php on line 12 +Notice: Created dynamic property with dynamic name GMP::dynprop in %s/dynprop_write_notice.php on line 12 -Notice: Created dynamic property with dynamic name GMP::dynprop2 in %s/dynprop_notice.php on line 12 +Notice: Created dynamic property with dynamic name GMP::dynprop2 in %s/dynprop_write_notice.php on line 12 -Notice: Created dynamic property with dynamic name GMP::dynprop3 in %s/dynprop_notice.php on line 12 +Notice: Created dynamic property with dynamic name GMP::dynprop3 in %s/dynprop_write_notice.php on line 12 object(GMP)#2 (4) { ["dynprop"]=> int(3) @@ -148,11 +148,11 @@ object(__PHP_Incomplete_Class)#2 (4) { } ==== Extends_stdClass ==== -Notice: Created dynamic property with static name Extends_stdClass::dynprop in %s/dynprop_notice.php on line 5 +Notice: Created dynamic property with static name Extends_stdClass::dynprop in %s/dynprop_write_notice.php on line 5 -Notice: Created dynamic property with dynamic name Extends_stdClass::dynprop2 in %s/dynprop_notice.php on line 7 +Notice: Created dynamic property with dynamic name Extends_stdClass::dynprop2 in %s/dynprop_write_notice.php on line 7 -Notice: Created dynamic property with static name Extends_stdClass::dynprop3 in %s/dynprop_notice.php on line 8 +Notice: Created dynamic property with static name Extends_stdClass::dynprop3 in %s/dynprop_write_notice.php on line 8 object(Extends_stdClass)#1 (3) { ["dynprop"]=> int(3) @@ -162,11 +162,11 @@ object(Extends_stdClass)#1 (3) { int(1) } -Notice: Created dynamic property with dynamic name Extends_stdClass::dynprop in %s/dynprop_notice.php on line 10 +Notice: Created dynamic property with dynamic name Extends_stdClass::dynprop in %s/dynprop_write_notice.php on line 10 -Notice: Created dynamic property with dynamic name Extends_stdClass::dynprop2 in %s/dynprop_notice.php on line 10 +Notice: Created dynamic property with dynamic name Extends_stdClass::dynprop2 in %s/dynprop_write_notice.php on line 10 -Notice: Created dynamic property with dynamic name Extends_stdClass::dynprop3 in %s/dynprop_notice.php on line 10 +Notice: Created dynamic property with dynamic name Extends_stdClass::dynprop3 in %s/dynprop_write_notice.php on line 10 object(Extends_stdClass)#2 (3) { ["dynprop"]=> int(3) @@ -176,11 +176,11 @@ object(Extends_stdClass)#2 (3) { int(1) } -Notice: Created dynamic property with static name Extends_stdClass::dynprop in %s/dynprop_notice.php on line 12 +Notice: Created dynamic property with static name Extends_stdClass::dynprop in %s/dynprop_write_notice.php on line 12 -Notice: Created dynamic property with dynamic name Extends_stdClass::dynprop2 in %s/dynprop_notice.php on line 12 +Notice: Created dynamic property with dynamic name Extends_stdClass::dynprop2 in %s/dynprop_write_notice.php on line 12 -Notice: Created dynamic property with static name Extends_stdClass::dynprop3 in %s/dynprop_notice.php on line 12 +Notice: Created dynamic property with static name Extends_stdClass::dynprop3 in %s/dynprop_write_notice.php on line 12 object(Extends_stdClass)#2 (3) { ["dynprop"]=> int(3) @@ -191,11 +191,11 @@ object(Extends_stdClass)#2 (3) { } ==== Extends___PHP_Incomplete_Class ==== -Notice: Created dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/dynprop_notice.php on line 5 +Notice: Created dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/dynprop_write_notice.php on line 5 -Notice: Created dynamic property with dynamic name Extends___PHP_Incomplete_Class::dynprop2 in %s/dynprop_notice.php on line 7 +Notice: Created dynamic property with dynamic name Extends___PHP_Incomplete_Class::dynprop2 in %s/dynprop_write_notice.php on line 7 -Notice: Created dynamic property with static name Extends___PHP_Incomplete_Class::dynprop3 in %s/dynprop_notice.php on line 8 +Notice: Created dynamic property with static name Extends___PHP_Incomplete_Class::dynprop3 in %s/dynprop_write_notice.php on line 8 object(Extends___PHP_Incomplete_Class)#1 (4) { ["__PHP_Incomplete_Class_Name"]=> NULL @@ -207,11 +207,11 @@ object(Extends___PHP_Incomplete_Class)#1 (4) { int(1) } -Notice: Created dynamic property with dynamic name Extends___PHP_Incomplete_Class::dynprop in %s/dynprop_notice.php on line 10 +Notice: Created dynamic property with dynamic name Extends___PHP_Incomplete_Class::dynprop in %s/dynprop_write_notice.php on line 10 -Notice: Created dynamic property with dynamic name Extends___PHP_Incomplete_Class::dynprop2 in %s/dynprop_notice.php on line 10 +Notice: Created dynamic property with dynamic name Extends___PHP_Incomplete_Class::dynprop2 in %s/dynprop_write_notice.php on line 10 -Notice: Created dynamic property with dynamic name Extends___PHP_Incomplete_Class::dynprop3 in %s/dynprop_notice.php on line 10 +Notice: Created dynamic property with dynamic name Extends___PHP_Incomplete_Class::dynprop3 in %s/dynprop_write_notice.php on line 10 object(Extends___PHP_Incomplete_Class)#2 (4) { ["__PHP_Incomplete_Class_Name"]=> NULL @@ -223,11 +223,11 @@ object(Extends___PHP_Incomplete_Class)#2 (4) { int(1) } -Notice: Created dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/dynprop_notice.php on line 12 +Notice: Created dynamic property with static name Extends___PHP_Incomplete_Class::dynprop in %s/dynprop_write_notice.php on line 12 -Notice: Created dynamic property with dynamic name Extends___PHP_Incomplete_Class::dynprop2 in %s/dynprop_notice.php on line 12 +Notice: Created dynamic property with dynamic name Extends___PHP_Incomplete_Class::dynprop2 in %s/dynprop_write_notice.php on line 12 -Notice: Created dynamic property with static name Extends___PHP_Incomplete_Class::dynprop3 in %s/dynprop_notice.php on line 12 +Notice: Created dynamic property with static name Extends___PHP_Incomplete_Class::dynprop3 in %s/dynprop_write_notice.php on line 12 object(Extends___PHP_Incomplete_Class)#2 (4) { ["__PHP_Incomplete_Class_Name"]=> NULL diff --git a/hphp/test/slow/object_property/dynprop_notice.php.opts b/hphp/test/slow/object_property/dynprop_write_notice.php.opts similarity index 100% rename from hphp/test/slow/object_property/dynprop_notice.php.opts rename to hphp/test/slow/object_property/dynprop_write_notice.php.opts -- 2.11.4.GIT