Skip to content

Commit 6797713

Browse files
committed
Fix opcache support
1 parent cee9a0e commit 6797713

File tree

3 files changed

+24
-5
lines changed

3 files changed

+24
-5
lines changed

Zend/zend_compile.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7559,7 +7559,6 @@ void zend_compile_class_decl(znode *result, zend_ast *ast, bool toplevel) /* {{{
75597559
zend_compile_enum_backing_type(ce, enum_backing_type_ast);
75607560
}
75617561
zend_enum_add_interfaces(ce);
7562-
zend_enum_register_funcs(ce);
75637562
zend_enum_register_props(ce);
75647563
}
75657564

Zend/zend_enum.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,9 @@ void zend_enum_register_funcs(zend_class_entry *ce)
315315
cases_function->scope = ce;
316316
cases_function->fn_flags = fn_flags;
317317
cases_function->arg_info = (zend_internal_arg_info *) (arginfo_class_UnitEnum_cases + 1);
318-
zend_hash_add_ptr(&ce->function_table, ZSTR_KNOWN(ZEND_STR_CASES), cases_function);
318+
if (!zend_hash_add_ptr(&ce->function_table, ZSTR_KNOWN(ZEND_STR_CASES), cases_function)) {
319+
zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare %s::cases()", ZSTR_VAL(ce->name));
320+
}
319321

320322
if (ce->enum_backing_type != IS_UNDEF) {
321323
zend_internal_function *from_function =
@@ -330,7 +332,10 @@ void zend_enum_register_funcs(zend_class_entry *ce)
330332
from_function->num_args = 1;
331333
from_function->required_num_args = 1;
332334
from_function->arg_info = (zend_internal_arg_info *) (arginfo_class_BackedEnum_from + 1);
333-
zend_hash_add_ptr(&ce->function_table, ZSTR_KNOWN(ZEND_STR_FROM), from_function);
335+
if (!zend_hash_add_ptr(&ce->function_table, ZSTR_KNOWN(ZEND_STR_FROM), from_function)) {
336+
zend_error_noreturn(E_COMPILE_ERROR,
337+
"Cannot redeclare %s::from()", ZSTR_VAL(ce->name));
338+
}
334339

335340
zend_internal_function *try_from_function =
336341
zend_arena_alloc(&CG(arena), sizeof(zend_internal_function));
@@ -344,8 +349,11 @@ void zend_enum_register_funcs(zend_class_entry *ce)
344349
try_from_function->num_args = 1;
345350
try_from_function->required_num_args = 1;
346351
try_from_function->arg_info = (zend_internal_arg_info *) (arginfo_class_BackedEnum_tryFrom + 1);
347-
zend_hash_add_ptr(
348-
&ce->function_table, ZSTR_KNOWN(ZEND_STR_TRYFROM_LOWERCASE), try_from_function);
352+
if (!zend_hash_add_ptr(
353+
&ce->function_table, ZSTR_KNOWN(ZEND_STR_TRYFROM_LOWERCASE), try_from_function)) {
354+
zend_error_noreturn(E_COMPILE_ERROR,
355+
"Cannot redeclare %s::tryFrom()", ZSTR_VAL(ce->name));
356+
}
349357
}
350358
}
351359

Zend/zend_inheritance.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2697,6 +2697,12 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
26972697
}
26982698
}
26992699

2700+
#ifndef ZEND_WIN32
2701+
if (ce->ce_flags & ZEND_ACC_ENUM) {
2702+
/* We will add internal methods. */
2703+
is_cacheable = false;
2704+
}
2705+
#endif
27002706

27012707
if (ce->ce_flags & ZEND_ACC_IMMUTABLE) {
27022708
if (is_cacheable) {
@@ -2741,6 +2747,12 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
27412747
orig_linking_class = CG(current_linking_class);
27422748
CG(current_linking_class) = is_cacheable ? ce : NULL;
27432749

2750+
if (ce->ce_flags & ZEND_ACC_ENUM) {
2751+
/* Only register builtin enum methods during inheritance to avoid persisting them in
2752+
* opcache. */
2753+
zend_enum_register_funcs(ce);
2754+
}
2755+
27442756
if (parent) {
27452757
if (!(parent->ce_flags & ZEND_ACC_LINKED)) {
27462758
add_dependency_obligation(ce, parent);

0 commit comments

Comments
 (0)