Skip to content

Commit 054fdfa

Browse files
committed
Implement ZEND_ACC_HAS_RC_PROPS
1 parent 7d551a8 commit 054fdfa

File tree

3 files changed

+12
-5
lines changed

3 files changed

+12
-5
lines changed

Zend/zend_API.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1609,15 +1609,16 @@ static zend_always_inline void _object_properties_init(zend_object *object, zend
16091609
zval *dst = object->properties_table;
16101610
zval *end = src + class_type->default_properties_count;
16111611

1612-
if (UNEXPECTED(class_type->type == ZEND_INTERNAL_CLASS)) {
1612+
if (EXPECTED(class_type->ce_flags & ZEND_ACC_HAS_RC_PROPS)) {
16131613
do {
1614-
ZVAL_COPY_OR_DUP_PROP(dst, src);
1614+
ZVAL_COPY_PROP(dst, src);
16151615
src++;
16161616
dst++;
16171617
} while (src != end);
16181618
} else {
1619+
/* zend_declare_typed_property() disallows refcounted default property values in internal classes */
16191620
do {
1620-
ZVAL_COPY_PROP(dst, src);
1621+
ZVAL_COPY_VALUE_PROP(dst, src);
16211622
src++;
16221623
dst++;
16231624
} while (src != end);
@@ -4378,6 +4379,9 @@ ZEND_API zend_property_info *zend_declare_typed_property(zend_class_entry *ce, z
43784379
ce->properties_info_table[ce->default_properties_count - 1] = property_info;
43794380
}
43804381
}
4382+
if (Z_REFCOUNTED_P(property)) {
4383+
ce->ce_flags |= ZEND_ACC_HAS_RC_PROPS;
4384+
}
43814385
property_default_ptr = &ce->default_properties_table[OBJ_PROP_TO_NUM(property_info->offset)];
43824386
ZVAL_COPY_VALUE(property_default_ptr, property);
43834387
Z_PROP_FLAG_P(property_default_ptr) = Z_ISUNDEF_P(property) ? IS_PROP_UNINIT : 0;

Zend/zend_compile.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ typedef struct _zend_oparray_context {
239239
/* or IS_CONSTANT_VISITED_MARK | | | */
240240
#define ZEND_CLASS_CONST_IS_CASE (1 << 6) /* | | | X */
241241
/* | | | */
242-
/* Class Flags (unused: 30,31) | | | */
242+
/* Class Flags (unused: 31) | | | */
243243
/* =========== | | | */
244244
/* | | | */
245245
/* Special class types | | | */
@@ -304,6 +304,8 @@ typedef struct _zend_oparray_context {
304304
/* | | | */
305305
/* Class cannot be serialized or unserialized | | | */
306306
#define ZEND_ACC_NOT_SERIALIZABLE (1 << 29) /* X | | | */
307+
/* Class has refcounted props | | | */
308+
#define ZEND_ACC_HAS_RC_PROPS (1 << 30) /* X | | | */
307309
/* | | | */
308310
/* Function Flags (unused: 29-30) | | | */
309311
/* ============== | | | */

Zend/zend_inheritance.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1672,7 +1672,7 @@ ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *par
16721672
ce->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS;
16731673
}
16741674
}
1675-
ce->ce_flags |= parent_ce->ce_flags & (ZEND_HAS_STATIC_IN_METHODS | ZEND_ACC_HAS_TYPE_HINTS | ZEND_ACC_HAS_READONLY_PROPS | ZEND_ACC_USE_GUARDS | ZEND_ACC_NOT_SERIALIZABLE | ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES);
1675+
ce->ce_flags |= parent_ce->ce_flags & (ZEND_HAS_STATIC_IN_METHODS | ZEND_ACC_HAS_TYPE_HINTS | ZEND_ACC_HAS_READONLY_PROPS | ZEND_ACC_USE_GUARDS | ZEND_ACC_NOT_SERIALIZABLE | ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES | ZEND_ACC_HAS_RC_PROPS);
16761676
}
16771677
/* }}} */
16781678

@@ -2537,6 +2537,7 @@ static void zend_do_traits_property_binding(zend_class_entry *ce, zend_class_ent
25372537
}
25382538
}
25392539
} ZEND_HASH_FOREACH_END();
2540+
ce->ce_flags |= traits[i]->ce_flags & ZEND_ACC_HAS_RC_PROPS;
25402541
}
25412542
}
25422543
/* }}} */

0 commit comments

Comments
 (0)