Handle missing class when evaluating CONST_ENUM_INIT

When resolving constants on a dynamically declared class during
preloading, the enum class may not be available. Fail gracefully
in that case.

Possibly we shouldn't be trying to evaluate constants on
non-linked classes at all?
This commit is contained in:
Nikita Popov 2021-07-27 14:24:36 +02:00
parent 6aa08736bb
commit 8834cf013b
3 changed files with 16 additions and 1 deletions

View file

@ -782,6 +782,13 @@ ZEND_API zend_result ZEND_FASTCALL zend_ast_evaluate(zval *result, zend_ast *ast
: NULL;
zend_class_entry *ce = zend_lookup_class(class_name);
if (!ce) {
/* Class may not be available when resolving constants on a dynamically
* declared enum during preloading. */
ZEND_ASSERT(CG(compiler_options) & ZEND_COMPILE_PRELOAD);
return FAILURE;
}
zend_enum_new(result, ce, case_name, case_value_zv);
break;
}

View file

@ -10,3 +10,9 @@ class Test {
public $x = MyEnum::Bar;
}
new Test;
if (false) {
enum MyEnum2 {
case Foo;
}
}

View file

@ -17,7 +17,9 @@ var_dump(MyEnum::Foo);
var_dump(MyEnum::Bar);
?>
--EXPECT--
--EXPECTF--
enum(MyEnum::Bar)
Warning: Can't preload unlinked class MyEnum2: Unknown reason in %s on line %d
enum(MyEnum::Foo)
enum(MyEnum::Bar)