Skip to content

Commit

Permalink
Don't use IMMUTABLE flag to decide whether mutable_data is used
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
nikic committed Jul 27, 2021
1 parent b354184 commit 5a7e1a7
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 15 deletions.
19 changes: 7 additions & 12 deletions Zend/zend_API.c
Original file line number Diff line number Diff line change
Expand Up @@ -1378,7 +1378,8 @@ ZEND_API zend_result zend_update_class_constants(zend_class_entry *class_type) /
return SUCCESS;
}

if (ce_flags & ZEND_ACC_IMMUTABLE) {
bool uses_mutable_data = ZEND_MAP_PTR(class_type->mutable_data) != NULL;
if (uses_mutable_data) {
mutable_data = ZEND_MAP_PTR_GET_IMM(class_type->mutable_data);
if (mutable_data) {
ce_flags = mutable_data->ce_flags;
Expand All @@ -1399,7 +1400,7 @@ ZEND_API zend_result zend_update_class_constants(zend_class_entry *class_type) /
if (ce_flags & ZEND_ACC_HAS_AST_CONSTANTS) {
HashTable *constants_table;

if (ce_flags & ZEND_ACC_IMMUTABLE) {
if (uses_mutable_data) {
constants_table = mutable_data->constants_table;
if (!constants_table) {
constants_table = zend_separate_class_constants_table(class_type);
Expand All @@ -1426,8 +1427,7 @@ ZEND_API zend_result zend_update_class_constants(zend_class_entry *class_type) /
}

default_properties_table = class_type->default_properties_table;
if ((ce_flags & ZEND_ACC_IMMUTABLE)
&& (ce_flags & ZEND_ACC_HAS_AST_PROPERTIES)) {
if (uses_mutable_data && (ce_flags & ZEND_ACC_HAS_AST_PROPERTIES)) {
zval *src, *dst, *end;

default_properties_table = mutable_data->default_properties_table;
Expand Down Expand Up @@ -1475,15 +1475,10 @@ ZEND_API zend_result zend_update_class_constants(zend_class_entry *class_type) /
ce_flags |= ZEND_ACC_CONSTANTS_UPDATED;
ce_flags &= ~ZEND_ACC_HAS_AST_CONSTANTS;
ce_flags &= ~ZEND_ACC_HAS_AST_PROPERTIES;
if (class_type->ce_flags & ZEND_ACC_IMMUTABLE) {
ce_flags &= ~ZEND_ACC_HAS_AST_STATICS;
if (mutable_data) {
mutable_data->ce_flags = ce_flags;
}
ce_flags &= ~ZEND_ACC_HAS_AST_STATICS;
if (uses_mutable_data) {
mutable_data->ce_flags = ce_flags;
} else {
if (!(ce_flags & ZEND_ACC_PRELOADED)) {
ce_flags &= ~ZEND_ACC_HAS_AST_STATICS;
}
class_type->ce_flags = ce_flags;
}

Expand Down
3 changes: 0 additions & 3 deletions ext/opcache/ZendAccelerator.c
Original file line number Diff line number Diff line change
Expand Up @@ -4664,9 +4664,6 @@ static int accel_preload(const char *config, bool in_child)
ZEND_ASSERT(ce->ce_flags & ZEND_ACC_PRELOADED);
if (ce->default_static_members_count) {
zend_cleanup_internal_class_data(ce);
if (ce->ce_flags & ZEND_ACC_HAS_AST_STATICS) {
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
}
}
if (ce->ce_flags & ZEND_HAS_STATIC_IN_METHODS) {
zend_op_array *op_array;
Expand Down

0 comments on commit 5a7e1a7

Please sign in to comment.