summaryrefslogtreecommitdiff
path: root/Zend/zend_objects.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_objects.c')
-rw-r--r--Zend/zend_objects.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c
index 0051ce8438..19d17dc9e9 100644
--- a/Zend/zend_objects.c
+++ b/Zend/zend_objects.c
@@ -57,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);
+ 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);
}
@@ -195,6 +204,13 @@ ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object,
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);