Skip to content

Commit 43eabe4

Browse files
committed
define modifiers and their rules
1 parent d139c38 commit 43eabe4

File tree

1 file changed

+37
-3
lines changed

1 file changed

+37
-3
lines changed

Zend/zend_compile.c

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -893,20 +893,21 @@ uint32_t zend_modifier_token_to_flag(zend_modifier_target target, uint32_t token
893893
}
894894
break;
895895
case T_READONLY:
896-
if (target == ZEND_MODIFIER_TARGET_PROPERTY || target == ZEND_MODIFIER_TARGET_CPP) {
896+
if (target == ZEND_MODIFIER_TARGET_PROPERTY || target == ZEND_MODIFIER_TARGET_CPP || target == ZEND_MODIFIER_TARGET_INNER_CLASS) {
897897
return ZEND_ACC_READONLY;
898898
}
899899
break;
900900
case T_ABSTRACT:
901-
if (target == ZEND_MODIFIER_TARGET_METHOD || target == ZEND_MODIFIER_TARGET_PROPERTY) {
901+
if (target == ZEND_MODIFIER_TARGET_METHOD || target == ZEND_MODIFIER_TARGET_PROPERTY || target == ZEND_MODIFIER_TARGET_INNER_CLASS) {
902902
return ZEND_ACC_ABSTRACT;
903903
}
904904
break;
905905
case T_FINAL:
906906
if (target == ZEND_MODIFIER_TARGET_METHOD
907907
|| target == ZEND_MODIFIER_TARGET_CONSTANT
908908
|| target == ZEND_MODIFIER_TARGET_PROPERTY
909-
|| target == ZEND_MODIFIER_TARGET_PROPERTY_HOOK) {
909+
|| target == ZEND_MODIFIER_TARGET_PROPERTY_HOOK
910+
|| target == ZEND_MODIFIER_TARGET_INNER_CLASS) {
910911
return ZEND_ACC_FINAL;
911912
}
912913
break;
@@ -943,6 +944,8 @@ uint32_t zend_modifier_token_to_flag(zend_modifier_target target, uint32_t token
943944
member = "parameter";
944945
} else if (target == ZEND_MODIFIER_TARGET_PROPERTY_HOOK) {
945946
member = "property hook";
947+
} else if (target == ZEND_MODIFIER_TARGET_INNER_CLASS) {
948+
member = "nested class";
946949
} else {
947950
ZEND_UNREACHABLE();
948951
}
@@ -1050,6 +1053,37 @@ uint32_t zend_add_member_modifier(uint32_t flags, uint32_t new_flag, zend_modifi
10501053
return 0;
10511054
}
10521055
}
1056+
if (target == ZEND_MODIFIER_TARGET_INNER_CLASS) {
1057+
if ((flags & ZEND_ACC_PPP_MASK) && (new_flag & ZEND_ACC_PPP_MASK)) {
1058+
zend_throw_exception(zend_ce_compile_error,
1059+
"Multiple access type modifiers are not allowed", 0);
1060+
return 0;
1061+
}
1062+
1063+
if ((flags & ZEND_ACC_STATIC) || (new_flag & ZEND_ACC_STATIC)) {
1064+
zend_throw_exception(zend_ce_compile_error,
1065+
"Static inner classes are not allowed", 0);
1066+
return 0;
1067+
}
1068+
1069+
if ((flags & ZEND_ACC_PUBLIC_SET) || (new_flag & ZEND_ACC_PUBLIC_SET)) {
1070+
zend_throw_exception(zend_ce_compile_error,
1071+
"Public(set) inner classes are not allowed", 0);
1072+
return 0;
1073+
}
1074+
1075+
if ((flags & ZEND_ACC_PROTECTED_SET) || (new_flag & ZEND_ACC_PROTECTED_SET)) {
1076+
zend_throw_exception(zend_ce_compile_error,
1077+
"Protected(set) inner classes are not allowed", 0);
1078+
return 0;
1079+
}
1080+
1081+
if ((flags & ZEND_ACC_PRIVATE_SET) || (new_flag & ZEND_ACC_PRIVATE_SET)) {
1082+
zend_throw_exception(zend_ce_compile_error,
1083+
"Private(set) inner classes are not allowed", 0);
1084+
return 0;
1085+
}
1086+
}
10531087
return new_flags;
10541088
}
10551089
/* }}} */

0 commit comments

Comments
 (0)