Skip to content

Commit 5a7e1a7

Browse files
committed
Don't use IMMUTABLE flag to decide whether mutable_data is used
mutable_data may be used for IMMUTABLE classes, internal classes and to-be-preloaded classes. Check whether the mutable_data map_ptr is set rather than only the IMMUTABLE flag.
1 parent b354184 commit 5a7e1a7

File tree

2 files changed

+7
-15
lines changed

2 files changed

+7
-15
lines changed

Zend/zend_API.c

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1378,7 +1378,8 @@ ZEND_API zend_result zend_update_class_constants(zend_class_entry *class_type) /
13781378
return SUCCESS;
13791379
}
13801380

1381-
if (ce_flags & ZEND_ACC_IMMUTABLE) {
1381+
bool uses_mutable_data = ZEND_MAP_PTR(class_type->mutable_data) != NULL;
1382+
if (uses_mutable_data) {
13821383
mutable_data = ZEND_MAP_PTR_GET_IMM(class_type->mutable_data);
13831384
if (mutable_data) {
13841385
ce_flags = mutable_data->ce_flags;
@@ -1399,7 +1400,7 @@ ZEND_API zend_result zend_update_class_constants(zend_class_entry *class_type) /
13991400
if (ce_flags & ZEND_ACC_HAS_AST_CONSTANTS) {
14001401
HashTable *constants_table;
14011402

1402-
if (ce_flags & ZEND_ACC_IMMUTABLE) {
1403+
if (uses_mutable_data) {
14031404
constants_table = mutable_data->constants_table;
14041405
if (!constants_table) {
14051406
constants_table = zend_separate_class_constants_table(class_type);
@@ -1426,8 +1427,7 @@ ZEND_API zend_result zend_update_class_constants(zend_class_entry *class_type) /
14261427
}
14271428

14281429
default_properties_table = class_type->default_properties_table;
1429-
if ((ce_flags & ZEND_ACC_IMMUTABLE)
1430-
&& (ce_flags & ZEND_ACC_HAS_AST_PROPERTIES)) {
1430+
if (uses_mutable_data && (ce_flags & ZEND_ACC_HAS_AST_PROPERTIES)) {
14311431
zval *src, *dst, *end;
14321432

14331433
default_properties_table = mutable_data->default_properties_table;
@@ -1475,15 +1475,10 @@ ZEND_API zend_result zend_update_class_constants(zend_class_entry *class_type) /
14751475
ce_flags |= ZEND_ACC_CONSTANTS_UPDATED;
14761476
ce_flags &= ~ZEND_ACC_HAS_AST_CONSTANTS;
14771477
ce_flags &= ~ZEND_ACC_HAS_AST_PROPERTIES;
1478-
if (class_type->ce_flags & ZEND_ACC_IMMUTABLE) {
1479-
ce_flags &= ~ZEND_ACC_HAS_AST_STATICS;
1480-
if (mutable_data) {
1481-
mutable_data->ce_flags = ce_flags;
1482-
}
1478+
ce_flags &= ~ZEND_ACC_HAS_AST_STATICS;
1479+
if (uses_mutable_data) {
1480+
mutable_data->ce_flags = ce_flags;
14831481
} else {
1484-
if (!(ce_flags & ZEND_ACC_PRELOADED)) {
1485-
ce_flags &= ~ZEND_ACC_HAS_AST_STATICS;
1486-
}
14871482
class_type->ce_flags = ce_flags;
14881483
}
14891484

ext/opcache/ZendAccelerator.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4664,9 +4664,6 @@ static int accel_preload(const char *config, bool in_child)
46644664
ZEND_ASSERT(ce->ce_flags & ZEND_ACC_PRELOADED);
46654665
if (ce->default_static_members_count) {
46664666
zend_cleanup_internal_class_data(ce);
4667-
if (ce->ce_flags & ZEND_ACC_HAS_AST_STATICS) {
4668-
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
4669-
}
46704667
}
46714668
if (ce->ce_flags & ZEND_HAS_STATIC_IN_METHODS) {
46724669
zend_op_array *op_array;

0 commit comments

Comments
 (0)