diff options
Diffstat (limited to 'Zend/zend_object_handlers.c')
-rw-r--r-- | Zend/zend_object_handlers.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 1c06f1ea5e..be9f50bfd4 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -82,8 +82,11 @@ ZEND_API void rebuild_object_properties(zend_object *zobj) /* {{{ */ zobj->properties->nInternalPointer = 0; ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) { if (/*prop_info->ce == ce &&*/ - (prop_info->flags & ZEND_ACC_STATIC) == 0 && - Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) != IS_UNDEF) { + (prop_info->flags & ZEND_ACC_STATIC) == 0) { + + if (UNEXPECTED(Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) == IS_UNDEF)) { + zobj->properties->u.v.flags |= HASH_FLAG_HAS_EMPTY_IND; + } _zend_hash_append_ind(zobj->properties, prop_info->name, OBJ_PROP(zobj, prop_info->offset)); @@ -94,10 +97,13 @@ ZEND_API void rebuild_object_properties(zend_object *zobj) /* {{{ */ ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) { if (prop_info->ce == ce && (prop_info->flags & ZEND_ACC_STATIC) == 0 && - (prop_info->flags & ZEND_ACC_PRIVATE) != 0 && - Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) != IS_UNDEF) { + (prop_info->flags & ZEND_ACC_PRIVATE) != 0) { zval zv; + if (UNEXPECTED(Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) == IS_UNDEF)) { + zobj->properties->u.v.flags |= HASH_FLAG_HAS_EMPTY_IND; + } + ZVAL_INDIRECT(&zv, OBJ_PROP(zobj, prop_info->offset)); zend_hash_add(zobj->properties, prop_info->name, &zv); } @@ -882,6 +888,9 @@ static void zend_std_unset_property(zval *object, zval *member, void **cache_slo if (Z_TYPE_P(slot) != IS_UNDEF) { zval_ptr_dtor(slot); ZVAL_UNDEF(slot); + if (zobj->properties) { + zobj->properties->u.v.flags |= HASH_FLAG_HAS_EMPTY_IND; + } goto exit; } } else if (EXPECTED(zobj->properties != NULL)) { |