diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index d84a59105dcf4..04c013c6790af 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -58,6 +58,7 @@ PHP 8.5 INTERNALS UPGRADE NOTES * zend_register_double_constant() * zend_register_string_constant() * zend_register_stringl_constant() + . EG(fake_scope) now is a _const_ zend_class_entry*. ======================== 2. Build system changes diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index fc6b9b421b628..f146a741439d5 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -2409,7 +2409,7 @@ static const zend_property_info *lookup_prop_info(const zend_class_entry *ce, ze /* If the class is linked, reuse the precise runtime logic. */ if ((ce->ce_flags & ZEND_ACC_LINKED) && (!scope || (scope->ce_flags & ZEND_ACC_LINKED))) { - zend_class_entry *prev_scope = EG(fake_scope); + const zend_class_entry *prev_scope = EG(fake_scope); EG(fake_scope) = scope; prop_info = zend_get_property_info(ce, name, 1); EG(fake_scope) = prev_scope; diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 5daff69a60b0a..5262cc0b6c95f 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1400,13 +1400,14 @@ ZEND_API void zend_merge_properties(zval *obj, HashTable *properties) /* {{{ */ { zend_object *zobj = Z_OBJ_P(obj); zend_object_write_property_t write_property = zobj->handlers->write_property; - zend_class_entry *old_scope = EG(fake_scope); zend_string *key; zval *value; if (HT_IS_PACKED(properties)) { return; } + + const zend_class_entry *old_scope = EG(fake_scope); EG(fake_scope) = Z_OBJCE_P(obj); ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(properties, key, value) { if (key) { @@ -1746,7 +1747,7 @@ ZEND_API void object_properties_load(zend_object *object, HashTable *properties) size_t prop_name_len; if (zend_unmangle_property_name_ex(key, &class_name, &prop_name, &prop_name_len) == SUCCESS) { zend_string *pname = zend_string_init(prop_name, prop_name_len, 0); - zend_class_entry *prev_scope = EG(fake_scope); + const zend_class_entry *prev_scope = EG(fake_scope); if (class_name && class_name[0] != '*') { zend_string *cname = zend_string_init(class_name, strlen(class_name), 0); EG(fake_scope) = zend_lookup_class(cname); @@ -5001,7 +5002,7 @@ ZEND_API void zend_declare_class_constant_string(zend_class_entry *ce, const cha ZEND_API void zend_update_property_ex(zend_class_entry *scope, zend_object *object, zend_string *name, zval *value) /* {{{ */ { - zend_class_entry *old_scope = EG(fake_scope); + const zend_class_entry *old_scope = EG(fake_scope); EG(fake_scope) = scope; @@ -5014,7 +5015,7 @@ ZEND_API void zend_update_property_ex(zend_class_entry *scope, zend_object *obje ZEND_API void zend_update_property(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, zval *value) /* {{{ */ { zend_string *property; - zend_class_entry *old_scope = EG(fake_scope); + const zend_class_entry *old_scope = EG(fake_scope); EG(fake_scope) = scope; @@ -5038,7 +5039,7 @@ ZEND_API void zend_update_property_null(zend_class_entry *scope, zend_object *ob ZEND_API void zend_unset_property(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length) /* {{{ */ { zend_string *property; - zend_class_entry *old_scope = EG(fake_scope); + const zend_class_entry *old_scope = EG(fake_scope); EG(fake_scope) = scope; @@ -5110,7 +5111,6 @@ ZEND_API zend_result zend_update_static_property_ex(zend_class_entry *scope, zen { zval *property, tmp; zend_property_info *prop_info; - zend_class_entry *old_scope = EG(fake_scope); if (UNEXPECTED(!(scope->ce_flags & ZEND_ACC_CONSTANTS_UPDATED))) { if (UNEXPECTED(zend_update_class_constants(scope) != SUCCESS)) { @@ -5118,6 +5118,7 @@ ZEND_API zend_result zend_update_static_property_ex(zend_class_entry *scope, zen } } + const zend_class_entry *old_scope = EG(fake_scope); EG(fake_scope) = scope; property = zend_std_get_static_property_with_info(scope, name, BP_VAR_W, &prop_info); EG(fake_scope) = old_scope; @@ -5210,7 +5211,7 @@ ZEND_API zend_result zend_update_static_property_stringl(zend_class_entry *scope ZEND_API zval *zend_read_property_ex(zend_class_entry *scope, zend_object *object, zend_string *name, bool silent, zval *rv) /* {{{ */ { zval *value; - zend_class_entry *old_scope = EG(fake_scope); + const zend_class_entry *old_scope = EG(fake_scope); EG(fake_scope) = scope; @@ -5236,7 +5237,7 @@ ZEND_API zval *zend_read_property(zend_class_entry *scope, zend_object *object, ZEND_API zval *zend_read_static_property_ex(zend_class_entry *scope, zend_string *name, bool silent) /* {{{ */ { zval *property; - zend_class_entry *old_scope = EG(fake_scope); + const zend_class_entry *old_scope = EG(fake_scope); EG(fake_scope) = scope; property = zend_std_get_static_property(scope, name, silent ? BP_VAR_IS : BP_VAR_R); diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index 7366eeaa2dd57..99c4a48a9482f 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -274,7 +274,7 @@ static void zend_update_property_num_checked(zend_class_entry *scope, zend_objec return; } #if ZEND_DEBUG - zend_class_entry *old_scope = EG(fake_scope); + const zend_class_entry *old_scope = EG(fake_scope); EG(fake_scope) = i_get_exception_base(object); const zend_property_info *prop_info = zend_get_property_info(object->ce, member, true); ZEND_ASSERT(OBJ_PROP_TO_NUM(prop_info->offset) == prop_num); diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index e1593cadce7d0..734494d252da0 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -932,7 +932,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_object_released_while_assigning_to_pr ZEND_API ZEND_COLD void ZEND_FASTCALL zend_asymmetric_visibility_property_modification_error( const zend_property_info *prop_info, const char *operation ) { - zend_class_entry *scope; + const zend_class_entry *scope; if (EG(fake_scope)) { scope = EG(fake_scope); } else { diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 18e7028957f71..6d2a6195cd52c 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -814,7 +814,6 @@ zend_result zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_ zend_function *func; uint32_t call_info; void *object_or_called_scope; - zend_class_entry *orig_fake_scope; ZVAL_UNDEF(fci->retval); @@ -1003,7 +1002,7 @@ zend_result zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_ fci_cache->function_handler = NULL; } - orig_fake_scope = EG(fake_scope); + const zend_class_entry *orig_fake_scope = EG(fake_scope); EG(fake_scope) = NULL; if (func->type == ZEND_USER_FUNCTION) { uint32_t orig_jit_trace_num = EG(jit_trace_num); diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index 079bfb99caccf..b4e94ec1f9892 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -198,7 +198,7 @@ struct _zend_executor_globals { size_t vm_stack_page_size; struct _zend_execute_data *current_execute_data; - zend_class_entry *fake_scope; /* used to avoid checks accessing properties */ + const zend_class_entry *fake_scope; /* used to avoid checks accessing properties */ uint32_t jit_trace_num; /* Used by tracing JIT to reference the currently running trace */ diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index df58906881fd3..732b7e8f2bd96 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -350,7 +350,7 @@ static ZEND_COLD zend_never_inline void zend_readonly_property_unset_error( ZSTR_VAL(ce->name), ZSTR_VAL(member)); } -static zend_always_inline zend_class_entry *get_fake_or_executed_scope(void) +static zend_always_inline const zend_class_entry *get_fake_or_executed_scope(void) { if (UNEXPECTED(EG(fake_scope))) { return EG(fake_scope); @@ -391,7 +391,7 @@ static zend_always_inline uintptr_t zend_get_property_offset(zend_class_entry *c flags = property_info->flags; if (flags & (ZEND_ACC_CHANGED|ZEND_ACC_PRIVATE|ZEND_ACC_PROTECTED)) { - zend_class_entry *scope = get_fake_or_executed_scope(); + const zend_class_entry *scope = get_fake_or_executed_scope(); if (property_info->ce != scope) { if (flags & ZEND_ACC_CHANGED) { @@ -491,7 +491,7 @@ ZEND_API zend_property_info *zend_get_property_info(const zend_class_entry *ce, flags = property_info->flags; if (flags & (ZEND_ACC_CHANGED|ZEND_ACC_PRIVATE|ZEND_ACC_PROTECTED)) { - zend_class_entry *scope = get_fake_or_executed_scope(); + const zend_class_entry *scope = get_fake_or_executed_scope(); if (property_info->ce != scope) { if (flags & ZEND_ACC_CHANGED) { zend_property_info *p = zend_get_parent_private_property(scope, ce, member); @@ -583,7 +583,7 @@ ZEND_API zend_result zend_check_property_access(const zend_object *zobj, zend_st ZEND_API bool ZEND_FASTCALL zend_asymmetric_property_has_set_access(const zend_property_info *prop_info) { ZEND_ASSERT(prop_info->flags & ZEND_ACC_PPP_SET_MASK); ZEND_ASSERT(!(prop_info->flags & ZEND_ACC_PUBLIC_SET)); - zend_class_entry *scope = get_fake_or_executed_scope(); + const zend_class_entry *scope = get_fake_or_executed_scope(); if (prop_info->ce == scope) { return true; } @@ -2030,7 +2030,7 @@ ZEND_API zval *zend_std_get_static_property_with_info(zend_class_entry *ce, zend } if (!(property_info->flags & ZEND_ACC_PUBLIC)) { - zend_class_entry *scope = get_fake_or_executed_scope(); + const zend_class_entry *scope = get_fake_or_executed_scope(); if (property_info->ce != scope) { if (UNEXPECTED(property_info->flags & ZEND_ACC_PRIVATE) || UNEXPECTED(!is_protected_compatible_scope(property_info->ce, scope))) { @@ -2114,7 +2114,7 @@ ZEND_API zend_function *zend_std_get_constructor(zend_object *zobj) /* {{{ */ if (constructor) { if (UNEXPECTED(!(constructor->common.fn_flags & ZEND_ACC_PUBLIC))) { - zend_class_entry *scope = get_fake_or_executed_scope(); + const zend_class_entry *scope = get_fake_or_executed_scope(); ZEND_ASSERT(!(constructor->common.fn_flags & ZEND_ACC_PUBLIC)); if (!zend_check_method_accessible(constructor, scope)) { zend_bad_constructor_call(constructor, scope); diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 78817152904fb..74dcd772dc716 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -4190,7 +4190,7 @@ ZEND_METHOD(ReflectionClass, getStaticProperties) ZEND_METHOD(ReflectionClass, getStaticPropertyValue) { reflection_object *intern; - zend_class_entry *ce, *old_scope; + zend_class_entry *ce; zend_string *name; zval *prop, *def_value = NULL; @@ -4204,7 +4204,7 @@ ZEND_METHOD(ReflectionClass, getStaticPropertyValue) RETURN_THROWS(); } - old_scope = EG(fake_scope); + const zend_class_entry *old_scope = EG(fake_scope); EG(fake_scope) = ce; prop = zend_std_get_static_property(ce, name, BP_VAR_IS); EG(fake_scope) = old_scope; @@ -4231,7 +4231,7 @@ ZEND_METHOD(ReflectionClass, getStaticPropertyValue) ZEND_METHOD(ReflectionClass, setStaticPropertyValue) { reflection_object *intern; - zend_class_entry *ce, *old_scope; + zend_class_entry *ce; zend_property_info *prop_info; zend_string *name; zval *variable_ptr, *value; @@ -4245,7 +4245,7 @@ ZEND_METHOD(ReflectionClass, setStaticPropertyValue) if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) { RETURN_THROWS(); } - old_scope = EG(fake_scope); + const zend_class_entry *old_scope = EG(fake_scope); EG(fake_scope) = ce; variable_ptr = zend_std_get_static_property_with_info(ce, name, BP_VAR_W, &prop_info); EG(fake_scope) = old_scope; @@ -4998,7 +4998,7 @@ ZEND_METHOD(ReflectionClass, isInstance) ZEND_METHOD(ReflectionClass, newInstance) { reflection_object *intern; - zend_class_entry *ce, *old_scope; + zend_class_entry *ce; zend_function *constructor; GET_REFLECTION_OBJECT_PTR(ce); @@ -5007,7 +5007,7 @@ ZEND_METHOD(ReflectionClass, newInstance) return; } - old_scope = EG(fake_scope); + const zend_class_entry *old_scope = EG(fake_scope); EG(fake_scope) = ce; constructor = Z_OBJ_HT_P(return_value)->get_constructor(Z_OBJ_P(return_value)); EG(fake_scope) = old_scope; @@ -5065,7 +5065,7 @@ ZEND_METHOD(ReflectionClass, newInstanceWithoutConstructor) ZEND_METHOD(ReflectionClass, newInstanceArgs) { reflection_object *intern; - zend_class_entry *ce, *old_scope; + zend_class_entry *ce; int argc = 0; HashTable *args = NULL; zend_function *constructor; @@ -5084,7 +5084,7 @@ ZEND_METHOD(ReflectionClass, newInstanceArgs) return; } - old_scope = EG(fake_scope); + const zend_class_entry *old_scope = EG(fake_scope); EG(fake_scope) = ce; constructor = Z_OBJ_HT_P(return_value)->get_constructor(Z_OBJ_P(return_value)); EG(fake_scope) = old_scope; @@ -5908,7 +5908,7 @@ ZEND_METHOD(ReflectionProperty, getValue) } } - zend_class_entry *old_scope = EG(fake_scope); + const zend_class_entry *old_scope = EG(fake_scope); EG(fake_scope) = intern->ce; member_p = Z_OBJ_P(object)->handlers->read_property(Z_OBJ_P(object), ref->unmangled_name, BP_VAR_R, ref->cache_slot, &rv); @@ -5967,7 +5967,7 @@ ZEND_METHOD(ReflectionProperty, setValue) Z_PARAM_ZVAL(value) ZEND_PARSE_PARAMETERS_END(); - zend_class_entry *old_scope = EG(fake_scope); + const zend_class_entry *old_scope = EG(fake_scope); EG(fake_scope) = intern->ce; object->handlers->write_property(object, ref->unmangled_name, value, ref->cache_slot); EG(fake_scope) = old_scope; @@ -6026,7 +6026,7 @@ ZEND_METHOD(ReflectionProperty, getRawValue) if (!prop || !prop->hooks || !prop->hooks[ZEND_PROPERTY_HOOK_GET]) { zval rv; - zend_class_entry *old_scope = EG(fake_scope); + const zend_class_entry *old_scope = EG(fake_scope); EG(fake_scope) = intern->ce; zval *member_p = Z_OBJ_P(object)->handlers->read_property( Z_OBJ_P(object), ref->unmangled_name, BP_VAR_R, @@ -6052,7 +6052,7 @@ static void reflection_property_set_raw_value(zend_property_info *prop, zend_object *object, zval *value) { if (!prop || !prop->hooks || !prop->hooks[ZEND_PROPERTY_HOOK_SET]) { - zend_class_entry *old_scope = EG(fake_scope); + const zend_class_entry *old_scope = EG(fake_scope); EG(fake_scope) = intern->ce; object->handlers->write_property(object, unmangled_name, value, cache_slot); EG(fake_scope) = old_scope; @@ -6275,7 +6275,6 @@ ZEND_METHOD(ReflectionProperty, isInitialized) } RETURN_FALSE; } else { - zend_class_entry *old_scope; int retval; if (!object) { @@ -6298,7 +6297,7 @@ ZEND_METHOD(ReflectionProperty, isInitialized) } } - old_scope = EG(fake_scope); + const zend_class_entry *old_scope = EG(fake_scope); EG(fake_scope) = intern->ce; retval = Z_OBJ_HT_P(object)->has_property(Z_OBJ_P(object), ref->unmangled_name, ZEND_PROPERTY_EXISTS, ref->cache_slot);