1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

Zend: Make EG(fake_scope) a const zend_class_entry* (#19060)

This commit is contained in:
Tim Düsterhus
2025-07-09 11:55:53 +02:00
committed by GitHub
parent 64e2832bc8
commit b43a7ac0e7
9 changed files with 34 additions and 34 deletions

View File

@@ -65,6 +65,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

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);

View File

@@ -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 {

View File

@@ -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 @@ cleanup_args:
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);

View File

@@ -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 */

View File

@@ -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 @@ dynamic:
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 @@ dynamic:
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);

View File

@@ -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);