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.c41
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
- */