Skip to content

Commit f44eaac

Browse files
authored
Simplify duplicate member flag check (phpGH-16874)
1 parent 91f0b3b commit f44eaac

File tree

1 file changed

+10
-19
lines changed

1 file changed

+10
-19
lines changed

Zend/zend_compile.c

+10-19
Original file line numberDiff line numberDiff line change
@@ -847,7 +847,7 @@ static void zend_do_free(znode *op1) /* {{{ */
847847
/* }}} */
848848

849849

850-
static char *zend_modifier_token_to_string(uint32_t token)
850+
static const char *zend_modifier_token_to_string(uint32_t token)
851851
{
852852
switch (token) {
853853
case T_PUBLIC:
@@ -958,14 +958,22 @@ uint32_t zend_modifier_list_to_flags(zend_modifier_target target, zend_ast *modi
958958
zend_ast_list *modifier_list = zend_ast_get_list(modifiers);
959959

960960
for (uint32_t i = 0; i < modifier_list->children; i++) {
961-
uint32_t new_flag = zend_modifier_token_to_flag(target, (uint32_t) Z_LVAL_P(zend_ast_get_zval(modifier_list->child[i])));
961+
uint32_t token = (uint32_t) Z_LVAL_P(zend_ast_get_zval(modifier_list->child[i]));
962+
uint32_t new_flag = zend_modifier_token_to_flag(target, token);
962963
if (!new_flag) {
963964
return 0;
964965
}
966+
/* Don't error immediately for duplicate flags, we want to prioritize the errors from zend_add_member_modifier(). */
967+
bool duplicate_flag = (flags & new_flag);
965968
flags = zend_add_member_modifier(flags, new_flag, target);
966969
if (!flags) {
967970
return 0;
968971
}
972+
if (duplicate_flag) {
973+
zend_throw_exception_ex(zend_ce_compile_error, 0,
974+
"Multiple %s modifiers are not allowed", zend_modifier_token_to_string(token));
975+
return 0;
976+
}
969977
}
970978

971979
return flags;
@@ -1023,23 +1031,6 @@ uint32_t zend_add_member_modifier(uint32_t flags, uint32_t new_flag, zend_modifi
10231031
"Multiple access type modifiers are not allowed", 0);
10241032
return 0;
10251033
}
1026-
if ((flags & ZEND_ACC_ABSTRACT) && (new_flag & ZEND_ACC_ABSTRACT)) {
1027-
zend_throw_exception(zend_ce_compile_error, "Multiple abstract modifiers are not allowed", 0);
1028-
return 0;
1029-
}
1030-
if ((flags & ZEND_ACC_STATIC) && (new_flag & ZEND_ACC_STATIC)) {
1031-
zend_throw_exception(zend_ce_compile_error, "Multiple static modifiers are not allowed", 0);
1032-
return 0;
1033-
}
1034-
if ((flags & ZEND_ACC_FINAL) && (new_flag & ZEND_ACC_FINAL)) {
1035-
zend_throw_exception(zend_ce_compile_error, "Multiple final modifiers are not allowed", 0);
1036-
return 0;
1037-
}
1038-
if ((flags & ZEND_ACC_READONLY) && (new_flag & ZEND_ACC_READONLY)) {
1039-
zend_throw_exception(zend_ce_compile_error,
1040-
"Multiple readonly modifiers are not allowed", 0);
1041-
return 0;
1042-
}
10431034
if (target == ZEND_MODIFIER_TARGET_METHOD && (new_flags & ZEND_ACC_ABSTRACT) && (new_flags & ZEND_ACC_FINAL)) {
10441035
zend_throw_exception(zend_ce_compile_error,
10451036
"Cannot use the final modifier on an abstract method", 0);

0 commit comments

Comments
 (0)