Skip to content

Commit baf3a91

Browse files
committed
Add support for class_alias to preloading
Related to bug #78918.
1 parent 3f86adb commit baf3a91

File tree

4 files changed

+32
-0
lines changed

4 files changed

+32
-0
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<?php
2+
class A {}
3+
class_alias(A::class, 'B');
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
--TEST--
2+
Bug #78918: Class alias during preloading causes assertion failure
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.optimization_level=-1
7+
opcache.preload={PWD}/preload_class_alias.inc
8+
--SKIPIF--
9+
<?php require_once('skipif.inc'); ?>
10+
--FILE--
11+
<?php
12+
var_dump(class_exists('A'));
13+
var_dump(class_exists('B'));
14+
?>
15+
--EXPECT--
16+
bool(true)
17+
bool(true)

ext/opcache/zend_persist.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -700,6 +700,12 @@ static void zend_persist_class_entry(zval *zv)
700700
zend_class_entry *ce = Z_PTR_P(zv);
701701

702702
if (ce->type == ZEND_USER_CLASS) {
703+
/* The same zend_class_entry may be reused by class_alias */
704+
zend_class_entry *new_ce = zend_shared_alloc_get_xlat_entry(ce);
705+
if (new_ce) {
706+
Z_PTR_P(zv) = new_ce;
707+
return;
708+
}
703709
if ((ce->ce_flags & ZEND_ACC_LINKED)
704710
&& (ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)
705711
&& (ce->ce_flags & ZEND_ACC_PROPERTY_TYPES_RESOLVED)

ext/opcache/zend_persist_calc.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,12 @@ static void zend_persist_class_entry_calc(zval *zv)
352352
Bucket *p;
353353

354354
if (ce->type == ZEND_USER_CLASS) {
355+
/* The same zend_class_entry may be reused by class_alias */
356+
if (zend_shared_alloc_get_xlat_entry(ce)) {
357+
return;
358+
}
359+
zend_shared_alloc_register_xlat_entry(ce, ce);
360+
355361
check_property_type_resolution(ce);
356362

357363
ZCG(is_immutable_class) =

0 commit comments

Comments
 (0)