Add support for class_alias to preloading

Related to bug #78918.
This commit is contained in:
Nikita Popov 2019-12-10 11:55:14 +01:00
parent 3f86adb0ef
commit baf3a9133b
4 changed files with 32 additions and 0 deletions

View file

@ -0,0 +1,3 @@
<?php
class A {}
class_alias(A::class, 'B');

View file

@ -0,0 +1,17 @@
--TEST--
Bug #78918: Class alias during preloading causes assertion failure
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.optimization_level=-1
opcache.preload={PWD}/preload_class_alias.inc
--SKIPIF--
<?php require_once('skipif.inc'); ?>
--FILE--
<?php
var_dump(class_exists('A'));
var_dump(class_exists('B'));
?>
--EXPECT--
bool(true)
bool(true)

View file

@ -700,6 +700,12 @@ static void zend_persist_class_entry(zval *zv)
zend_class_entry *ce = Z_PTR_P(zv);
if (ce->type == ZEND_USER_CLASS) {
/* The same zend_class_entry may be reused by class_alias */
zend_class_entry *new_ce = zend_shared_alloc_get_xlat_entry(ce);
if (new_ce) {
Z_PTR_P(zv) = new_ce;
return;
}
if ((ce->ce_flags & ZEND_ACC_LINKED)
&& (ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)
&& (ce->ce_flags & ZEND_ACC_PROPERTY_TYPES_RESOLVED)

View file

@ -352,6 +352,12 @@ static void zend_persist_class_entry_calc(zval *zv)
Bucket *p;
if (ce->type == ZEND_USER_CLASS) {
/* The same zend_class_entry may be reused by class_alias */
if (zend_shared_alloc_get_xlat_entry(ce)) {
return;
}
zend_shared_alloc_register_xlat_entry(ce, ce);
check_property_type_resolution(ce);
ZCG(is_immutable_class) =