Skip to content

Commit a9c2500

Browse files
zend_attribute_populate_arguments()
1 parent 973c861 commit a9c2500

File tree

3 files changed

+40
-73
lines changed

3 files changed

+40
-73
lines changed

Zend/zend_attributes.c

Lines changed: 37 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,8 @@ void compile_alias_attributes(
4747
HashTable **attributes, zend_ast *ast
4848
) /* {{{ */ {
4949
zend_attribute *attr;
50-
zend_internal_attribute *config;
5150

5251
zend_ast_list *list = zend_ast_get_list(ast);
53-
uint32_t j;
5452

5553
ZEND_ASSERT(ast->kind == ZEND_AST_ARRAY);
5654

@@ -71,53 +69,17 @@ void compile_alias_attributes(
7169
}
7270

7371
zend_string *name = zend_resolve_class_name_ast(array_content->child[0]);
74-
zend_string *lcname = zend_string_tolower_ex(name, false);
7572
zend_ast_list *args = array_content->child[1] ? zend_ast_get_list(array_content->child[1]) : NULL;
7673

77-
config = zend_internal_attribute_get(lcname);
78-
zend_string_release(lcname);
79-
8074
uint32_t flags = (CG(active_op_array)->fn_flags & ZEND_ACC_STRICT_TYPES)
8175
? ZEND_ATTRIBUTE_STRICT_TYPES : 0;
8276
attr = zend_add_attribute(
8377
attributes, name, args ? args->children : 0, flags, 0, array_content->lineno);
8478
zend_string_release(name);
8579

8680
/* Populate arguments */
87-
if (!args) {
88-
continue;
89-
}
90-
ZEND_ASSERT(args->kind == ZEND_AST_ARG_LIST);
91-
92-
bool uses_named_args = 0;
93-
for (j = 0; j < args->children; j++) {
94-
zend_ast **arg_ast_ptr = &args->child[j];
95-
zend_ast *arg_ast = *arg_ast_ptr;
96-
97-
if (arg_ast->kind == ZEND_AST_UNPACK) {
98-
zend_error_noreturn(E_COMPILE_ERROR,
99-
"Cannot use unpacking in attribute argument list");
100-
}
101-
102-
if (arg_ast->kind == ZEND_AST_NAMED_ARG) {
103-
attr->args[j].name = zend_string_copy(zend_ast_get_str(arg_ast->child[0]));
104-
arg_ast_ptr = &arg_ast->child[1];
105-
uses_named_args = 1;
106-
107-
for (uint32_t k = 0; k < j; k++) {
108-
if (attr->args[k].name &&
109-
zend_string_equals(attr->args[k].name, attr->args[j].name)) {
110-
zend_error_noreturn(E_COMPILE_ERROR, "Duplicate named parameter $%s",
111-
ZSTR_VAL(attr->args[j].name));
112-
}
113-
}
114-
} else if (uses_named_args) {
115-
zend_error_noreturn(E_COMPILE_ERROR,
116-
"Cannot use positional argument after named argument");
117-
}
118-
119-
zend_const_expr_to_zval(
120-
&attr->args[j].value, arg_ast_ptr, /* allow_dynamic */ true);
81+
if (args) {
82+
zend_attribute_populate_arguments(attr, args);
12183
}
12284
}
12385

@@ -158,6 +120,41 @@ ZEND_API void zend_apply_internal_attribute_validation(HashTable *attributes, ui
158120
} ZEND_HASH_FOREACH_END();
159121
}
160122

123+
ZEND_API void zend_attribute_populate_arguments(zend_attribute *attr, zend_ast_list *args) {
124+
ZEND_ASSERT(args->kind == ZEND_AST_ARG_LIST);
125+
126+
bool uses_named_args = 0;
127+
for (uint32_t j = 0; j < args->children; j++) {
128+
zend_ast **arg_ast_ptr = &args->child[j];
129+
zend_ast *arg_ast = *arg_ast_ptr;
130+
131+
if (arg_ast->kind == ZEND_AST_UNPACK) {
132+
zend_error_noreturn(E_COMPILE_ERROR,
133+
"Cannot use unpacking in attribute argument list");
134+
}
135+
136+
if (arg_ast->kind == ZEND_AST_NAMED_ARG) {
137+
attr->args[j].name = zend_string_copy(zend_ast_get_str(arg_ast->child[0]));
138+
arg_ast_ptr = &arg_ast->child[1];
139+
uses_named_args = 1;
140+
141+
for (uint32_t k = 0; k < j; k++) {
142+
if (attr->args[k].name &&
143+
zend_string_equals(attr->args[k].name, attr->args[j].name)) {
144+
zend_error_noreturn(E_COMPILE_ERROR, "Duplicate named parameter $%s",
145+
ZSTR_VAL(attr->args[j].name));
146+
}
147+
}
148+
} else if (uses_named_args) {
149+
zend_error_noreturn(E_COMPILE_ERROR,
150+
"Cannot use positional argument after named argument");
151+
}
152+
153+
zend_const_expr_to_zval(
154+
&attr->args[j].value, arg_ast_ptr, /* allow_dynamic */ true);
155+
}
156+
}
157+
161158
uint32_t zend_attribute_attribute_get_flags(zend_attribute *attr, zend_class_entry *scope)
162159
{
163160
// TODO: More proper signature validation: Too many args, incorrect arg names.

Zend/zend_attributes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ ZEND_API zend_attribute *zend_add_attribute(
9797
uint32_t zend_attribute_attribute_get_flags(zend_attribute *attr, zend_class_entry *scope);
9898

9999
ZEND_API void zend_apply_internal_attribute_validation(HashTable *attributes, uint32_t offset, uint32_t target);
100+
ZEND_API void zend_attribute_populate_arguments(zend_attribute *attr, zend_ast_list *args);
100101

101102
END_EXTERN_C()
102103

Zend/zend_compile.c

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7388,7 +7388,7 @@ static void zend_compile_attributes(
73887388
zend_internal_attribute *config;
73897389

73907390
zend_ast_list *list = zend_ast_get_list(ast);
7391-
uint32_t g, i, j;
7391+
uint32_t g, i;
73927392

73937393
ZEND_ASSERT(ast->kind == ZEND_AST_ATTRIBUTE_LIST);
73947394

@@ -7431,38 +7431,7 @@ static void zend_compile_attributes(
74317431

74327432
/* Populate arguments */
74337433
if (args) {
7434-
ZEND_ASSERT(args->kind == ZEND_AST_ARG_LIST);
7435-
7436-
bool uses_named_args = 0;
7437-
for (j = 0; j < args->children; j++) {
7438-
zend_ast **arg_ast_ptr = &args->child[j];
7439-
zend_ast *arg_ast = *arg_ast_ptr;
7440-
7441-
if (arg_ast->kind == ZEND_AST_UNPACK) {
7442-
zend_error_noreturn(E_COMPILE_ERROR,
7443-
"Cannot use unpacking in attribute argument list");
7444-
}
7445-
7446-
if (arg_ast->kind == ZEND_AST_NAMED_ARG) {
7447-
attr->args[j].name = zend_string_copy(zend_ast_get_str(arg_ast->child[0]));
7448-
arg_ast_ptr = &arg_ast->child[1];
7449-
uses_named_args = 1;
7450-
7451-
for (uint32_t k = 0; k < j; k++) {
7452-
if (attr->args[k].name &&
7453-
zend_string_equals(attr->args[k].name, attr->args[j].name)) {
7454-
zend_error_noreturn(E_COMPILE_ERROR, "Duplicate named parameter $%s",
7455-
ZSTR_VAL(attr->args[j].name));
7456-
}
7457-
}
7458-
} else if (uses_named_args) {
7459-
zend_error_noreturn(E_COMPILE_ERROR,
7460-
"Cannot use positional argument after named argument");
7461-
}
7462-
7463-
zend_const_expr_to_zval(
7464-
&attr->args[j].value, arg_ast_ptr, /* allow_dynamic */ true);
7465-
}
7434+
zend_attribute_populate_arguments(attr, args);
74667435
}
74677436
}
74687437
}

0 commit comments

Comments
 (0)