mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
Embed zend_class_constant.flags into zend_class_constants.value.u2.access_flags
This commit is contained in:
parent
51deab84b2
commit
211f873f54
9 changed files with 22 additions and 19 deletions
|
@ -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)) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue