From 211f873f542504d0a0f72b6b5cb23908a1c99a2d Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 8 Dec 2015 12:28:38 +0300 Subject: [PATCH] Embed zend_class_constant.flags into zend_class_constants.value.u2.access_flags --- Zend/zend_API.c | 2 +- Zend/zend_compile.h | 3 +-- Zend/zend_constants.c | 10 +++++----- Zend/zend_inheritance.c | 6 +++--- Zend/zend_types.h | 4 ++++ Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 6 +++--- ext/opcache/Optimizer/pass1_5.c | 2 +- ext/reflection/php_reflection.c | 6 +++--- 9 files changed, 22 insertions(+), 19 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 460829ffeb4..fc49f3369e7 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3759,7 +3759,7 @@ ZEND_API int zend_declare_class_constant_ex(zend_class_entry *ce, zend_string *n c = zend_arena_alloc(&CG(arena), sizeof(zend_class_constant)); } ZVAL_COPY_VALUE(&c->value, value); - c->flags = access_type; + Z_ACCESS_FLAGS(c->value) = access_type; c->doc_comment = doc_comment; c->ce = ce; if (Z_CONSTANT_P(value)) { diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index da8b2ce0467..c4a5053ba6f 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -311,8 +311,7 @@ typedef struct _zend_property_info { ((offset - OBJ_PROP_TO_OFFSET(0)) / sizeof(zval)) typedef struct _zend_class_constant { - zval value; - uint32_t flags; + zval value; /* access flags are stored in reserved: zval.u2.access_flags */ zend_string *doc_comment; zend_class_entry *ce; } zend_class_constant; diff --git a/Zend/zend_constants.c b/Zend/zend_constants.c index 046f1610747..d539445be74 100644 --- a/Zend/zend_constants.c +++ b/Zend/zend_constants.c @@ -253,12 +253,12 @@ static zend_constant *zend_get_special_constant(const char *name, size_t name_le ZEND_API int zend_verify_const_access(zend_class_constant *c, zend_class_entry *scope) /* {{{ */ { - if (c->flags & ZEND_ACC_PUBLIC) { + if (Z_ACCESS_FLAGS(c->value) & ZEND_ACC_PUBLIC) { return 1; - } else if (c->flags & ZEND_ACC_PRIVATE) { + } else if (Z_ACCESS_FLAGS(c->value) & ZEND_ACC_PRIVATE) { return (c->ce == scope); } else { - ZEND_ASSERT(c->flags & ZEND_ACC_PROTECTED); + ZEND_ASSERT(Z_ACCESS_FLAGS(c->value) & ZEND_ACC_PROTECTED); return zend_check_protected(c->ce, scope); } } @@ -374,16 +374,16 @@ ZEND_API zval *zend_get_constant_ex(zend_string *cname, zend_class_entry *scope, if (ce) { zend_class_constant *c = zend_hash_find_ptr(&ce->constants_table, constant_name); if (c == NULL) { - ret_constant = NULL; if ((flags & ZEND_FETCH_CLASS_SILENT) == 0) { zend_throw_error(NULL, "Undefined class constant '%s::%s'", ZSTR_VAL(class_name), ZSTR_VAL(constant_name)); zend_string_release(class_name); zend_string_free(constant_name); return NULL; } + ret_constant = NULL; } else { if (!zend_verify_const_access(c, scope)) { - zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(c->flags), ZSTR_VAL(class_name), ZSTR_VAL(constant_name)); + zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(Z_ACCESS_FLAGS(c->value)), ZSTR_VAL(class_name), ZSTR_VAL(constant_name)); zend_string_release(class_name); zend_string_free(constant_name); return NULL; diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 17ab8fb0e36..d9367d82f53 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -703,11 +703,11 @@ static void do_inherit_class_constant(zend_string *name, zend_class_constant *pa zend_class_constant *c = zend_hash_find_ptr(&ce->constants_table, name); if (c != NULL) { - if (UNEXPECTED((c->flags & ZEND_ACC_PPP_MASK) > (parent_const->flags & ZEND_ACC_PPP_MASK))) { + if (UNEXPECTED((Z_ACCESS_FLAGS(c->value) & ZEND_ACC_PPP_MASK) > (Z_ACCESS_FLAGS(parent_const->value) & ZEND_ACC_PPP_MASK))) { zend_error_noreturn(E_COMPILE_ERROR, "Access level to %s::%s must be %s (as in class %s)%s", - ZSTR_VAL(ce->name), ZSTR_VAL(name), zend_visibility_string(parent_const->flags), ZSTR_VAL(ce->parent->name), (parent_const->flags&ZEND_ACC_PUBLIC) ? "" : " or weaker"); + ZSTR_VAL(ce->name), ZSTR_VAL(name), zend_visibility_string(Z_ACCESS_FLAGS(parent_const->value)), ZSTR_VAL(ce->parent->name), (Z_ACCESS_FLAGS(parent_const->value) & ZEND_ACC_PUBLIC) ? "" : " or weaker"); } - } else if (!(parent_const->flags & ZEND_ACC_PRIVATE)) { + } else if (!(Z_ACCESS_FLAGS(parent_const->value) & ZEND_ACC_PRIVATE)) { if (Z_CONSTANT(parent_const->value)) { ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; } diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 805ea6d8c72..4155f7530d0 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -138,6 +138,7 @@ struct _zval_struct { uint32_t num_args; /* arguments number for EX(This) */ uint32_t fe_pos; /* foreach position */ uint32_t fe_iter_idx; /* foreach iterator index */ + uint32_t access_flags; /* class constant access flags */ } u2; }; @@ -361,6 +362,9 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) { #define Z_FE_ITER(zval) (zval).u2.fe_iter_idx #define Z_FE_ITER_P(zval_p) Z_FE_ITER(*(zval_p)) +#define Z_ACCESS_FLAGS(zval) (zval).u2.access_flags +#define Z_ACCESS_FLAGS_P(zval_p) Z_ACCESS_FLAGS(*(zval_p)) + #define Z_COUNTED(zval) (zval).value.counted #define Z_COUNTED_P(zval_p) Z_COUNTED(*(zval_p)) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 8a6be4d780f..e4ec00a45c0 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -5206,7 +5206,7 @@ ZEND_VM_HANDLER(181, ZEND_FETCH_CLASS_CONSTANT, VAR|CONST|UNUSED, CONST) if (EXPECTED((c = zend_hash_find_ptr(&ce->constants_table, Z_STR_P(EX_CONSTANT(opline->op2)))) != NULL)) { if (!zend_verify_const_access(c, EG(scope))) { - zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(c->flags), ZSTR_VAL(ce->name), Z_STRVAL_P(EX_CONSTANT(opline->op2))); + zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(Z_ACCESS_FLAGS(c->value)), ZSTR_VAL(ce->name), Z_STRVAL_P(EX_CONSTANT(opline->op2))); HANDLE_EXCEPTION(); } value = &c->value; diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 75949d6f07d..f466dc12dbb 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5867,7 +5867,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_CONS if (EXPECTED((c = zend_hash_find_ptr(&ce->constants_table, Z_STR_P(EX_CONSTANT(opline->op2)))) != NULL)) { if (!zend_verify_const_access(c, EG(scope))) { - zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(c->flags), ZSTR_VAL(ce->name), Z_STRVAL_P(EX_CONSTANT(opline->op2))); + zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(Z_ACCESS_FLAGS(c->value)), ZSTR_VAL(ce->name), Z_STRVAL_P(EX_CONSTANT(opline->op2))); HANDLE_EXCEPTION(); } value = &c->value; @@ -17592,7 +17592,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_ if (EXPECTED((c = zend_hash_find_ptr(&ce->constants_table, Z_STR_P(EX_CONSTANT(opline->op2)))) != NULL)) { if (!zend_verify_const_access(c, EG(scope))) { - zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(c->flags), ZSTR_VAL(ce->name), Z_STRVAL_P(EX_CONSTANT(opline->op2))); + zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(Z_ACCESS_FLAGS(c->value)), ZSTR_VAL(ce->name), Z_STRVAL_P(EX_CONSTANT(opline->op2))); HANDLE_EXCEPTION(); } value = &c->value; @@ -24018,7 +24018,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUS if (EXPECTED((c = zend_hash_find_ptr(&ce->constants_table, Z_STR_P(EX_CONSTANT(opline->op2)))) != NULL)) { if (!zend_verify_const_access(c, EG(scope))) { - zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(c->flags), ZSTR_VAL(ce->name), Z_STRVAL_P(EX_CONSTANT(opline->op2))); + zend_throw_error(NULL, "Cannot access %s const %s::%s", zend_visibility_string(Z_ACCESS_FLAGS(c->value)), ZSTR_VAL(ce->name), Z_STRVAL_P(EX_CONSTANT(opline->op2))); HANDLE_EXCEPTION(); } value = &c->value; diff --git a/ext/opcache/Optimizer/pass1_5.c b/ext/opcache/Optimizer/pass1_5.c index 28606bdad9d..a4c030aff82 100644 --- a/ext/opcache/Optimizer/pass1_5.c +++ b/ext/opcache/Optimizer/pass1_5.c @@ -329,7 +329,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) if ((cc = zend_hash_find_ptr(&ce->constants_table, Z_STR(ZEND_OP2_LITERAL(opline)))) != NULL && - (cc->flags & ZEND_ACC_PPP_MASK) == ZEND_ACC_PUBLIC) { + (Z_ACCESS_FLAGS(cc->value) & ZEND_ACC_PPP_MASK) == ZEND_ACC_PUBLIC) { c = &cc->value; if (Z_TYPE_P(c) == IS_CONSTANT_AST) { break; diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 64dedb7f690..51ed11710d2 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -634,7 +634,7 @@ static void _const_string(string *str, char *name, zval *value, char *indent) static void _class_const_string(string *str, char *name, zend_class_constant *c, char *indent) { char *type = zend_zval_type_name(&c->value); - char *visibility = zend_visibility_string(c->flags); + char *visibility = zend_visibility_string(Z_ACCESS_FLAGS(c->value)); zend_string *value_str = zval_get_string(&c->value); string_printf(str, "%s Constant [ %s %s %s ] { %s }\n", @@ -3803,7 +3803,7 @@ static void _class_constant_check_flag(INTERNAL_FUNCTION_PARAMETERS, int mask) / return; } GET_REFLECTION_OBJECT_PTR(ref); - RETURN_BOOL(ref->flags & mask); + RETURN_BOOL(Z_ACCESS_FLAGS(ref->value) & mask); } /* }}} */ @@ -3843,7 +3843,7 @@ ZEND_METHOD(reflection_class_constant, getModifiers) } GET_REFLECTION_OBJECT_PTR(ref); - RETURN_LONG(ref->flags); + RETURN_LONG(Z_ACCESS_FLAGS(ref->value)); } /* }}} */