You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
The influence of opcache on the behavior of enum cases. #8418
$ php test.php -dopcache.jit_buffer_size=0 -dopcache.enable=1 -dopcache.enable_cli=0
// - First execution: 42
// - Second execution: 42
// - Third execution: 42
$ php test.php -dopcache.jit_buffer_size=0 -dopcache.enable=1 -dopcache.enable_cli=1
// - First execution: 42
// - Second execution: Enum case value must be compile-time evaluatable
// - Third execution: Enum case value must be compile-time evaluatable
But I expected this output instead:
// - First execution: 42
// - Second execution: 42
// - Third execution: 42
Conclusion
Behavior is affected by enabling or disabling opcache.
The jit buffer is disabled, which disables JIT compilation and therefore the problem occurs at an earlier "compilation stage".
Environment
Linux (Debian-based)
PHP 8.1.4 (cli) (built: Apr 4 2022 13:30:33) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.4, Copyright (c) Zend Technologies
with Zend OPcache v8.1.4, Copyright (c), by Zend Technologies
We should probably set ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION while evaluating the enum value to avoid the discrepancy with and without opcache (by always making it an error).
Making this actually work requires #8190, i.e. support for evaluating the constant expression at runtime. It's not technically possible to evaluate a constant reference at compile-time if opcache is used (in the general case where the constant is defined in a different file). The only thing we can do in a patch release is to consistently forbid this.
Activity
nikic commentedon Apr 24, 2022
We should probably set ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION while evaluating the enum value to avoid the discrepancy with and without opcache (by always making it an error).
SerafimArts commentedon Apr 24, 2022
Hmmm.... Aren't class constants compile time instructions? It seems the other way around, it shouldn't throw any errors.
nikic commentedon Apr 24, 2022
Making this actually work requires #8190, i.e. support for evaluating the constant expression at runtime. It's not technically possible to evaluate a constant reference at compile-time if opcache is used (in the general case where the constant is defined in a different file). The only thing we can do in a patch release is to consistently forbid this.
Try to fix PHP 8.1 const in enums bug (php/php-src#8418)