diff options
Diffstat (limited to 'Zend/zend_objects.c')
-rw-r--r-- | Zend/zend_objects.c | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index 6f44ee22a1..80efb8c895 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2018 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -25,7 +25,7 @@ #include "zend_interfaces.h" #include "zend_exceptions.h" -ZEND_API void ZEND_FASTCALL zend_object_std_init(zend_object *object, zend_class_entry *ce) +static zend_always_inline void _zend_object_std_init(zend_object *object, zend_class_entry *ce) { GC_SET_REFCOUNT(object, 1); GC_TYPE_INFO(object) = IS_OBJECT | (GC_COLLECTABLE << GC_FLAGS_SHIFT); @@ -37,6 +37,11 @@ ZEND_API void ZEND_FASTCALL zend_object_std_init(zend_object *object, zend_class } } +ZEND_API void ZEND_FASTCALL zend_object_std_init(zend_object *object, zend_class_entry *ce) +{ + _zend_object_std_init(object, ce); +} + ZEND_API void zend_object_std_dtor(zend_object *object) { zval *p, *end; @@ -52,7 +57,16 @@ ZEND_API void zend_object_std_dtor(zend_object *object) if (EXPECTED(object->ce->default_properties_count)) { end = p + object->ce->default_properties_count; do { - i_zval_ptr_dtor(p ZEND_FILE_LINE_CC); + if (Z_REFCOUNTED_P(p)) { + if (UNEXPECTED(Z_ISREF_P(p)) && + (ZEND_DEBUG || ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(p)))) { + zend_property_info *prop_info = zend_get_property_info_for_slot(object, p); + if (prop_info->type) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info); + } + } + i_zval_ptr_dtor(p); + } p++; } while (p != end); } @@ -174,7 +188,7 @@ ZEND_API zend_object* ZEND_FASTCALL zend_objects_new(zend_class_entry *ce) { zend_object *object = emalloc(sizeof(zend_object) + zend_object_properties_size(ce)); - zend_object_std_init(object, ce); + _zend_object_std_init(object, ce); object->handlers = &std_object_handlers; return object; } @@ -187,9 +201,16 @@ ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object, zval *end = src + old_object->ce->default_properties_count; do { - i_zval_ptr_dtor(dst ZEND_FILE_LINE_CC); + i_zval_ptr_dtor(dst); ZVAL_COPY_VALUE(dst, src); zval_add_ref(dst); + if (UNEXPECTED(Z_ISREF_P(dst)) && + (ZEND_DEBUG || ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(dst)))) { + zend_property_info *prop_info = zend_get_property_info_for_slot(new_object, dst); + if (prop_info->type) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(dst), prop_info); + } + } src++; dst++; } while (src != end); @@ -286,13 +307,3 @@ ZEND_API zend_object *zend_objects_clone_obj(zval *zobject) return new_object; } - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * indent-tabs-mode: t - * End: - * vim600: sw=4 ts=4 fdm=marker - * vim<600: sw=4 ts=4 - */ |