]> granicus.if.org Git - php/commitdiff
Preserve trait method alias name during preloading
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 3 Nov 2020 09:55:59 +0000 (10:55 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 3 Nov 2020 09:55:59 +0000 (10:55 +0100)
ext/opcache/ZendAccelerator.c
ext/opcache/tests/preload.inc
ext/opcache/tests/preload_trait_alias.phpt [new file with mode: 0644]

index 22b484b78942a44b01eb196c741dafc8068215ef..39d04f9a95869c7153405045bc905172110e092a 100644 (file)
@@ -4147,11 +4147,13 @@ static void preload_fix_trait_methods(zend_class_entry *ce)
                if (op_array->fn_flags & ZEND_ACC_TRAIT_CLONE) {
                        zend_op_array *orig_op_array = zend_shared_alloc_get_xlat_entry(op_array->opcodes);
                        if (orig_op_array) {
+                               zend_string *function_name = op_array->function_name;
                                zend_class_entry *scope = op_array->scope;
                                uint32_t fn_flags = op_array->fn_flags;
                                zend_function *prototype = op_array->prototype;
                                HashTable *ht = op_array->static_variables;
                                *op_array = *orig_op_array;
+                               op_array->function_name = function_name;
                                op_array->scope = scope;
                                op_array->fn_flags = fn_flags;
                                op_array->prototype = prototype;
index 52bb60e3484eaf88b93563a9c65fa6426f201139..0ef3b4f56e3a7d9ab47b57d63c1d17d2ffb56886 100644 (file)
@@ -45,6 +45,12 @@ class Z {
 
 class Z2 extends Z {}
 
+class TraitAliasTest {
+    use T1 {
+        T1::foo as bar;
+    }
+}
+
 function get_anon() {
     return new class {};
 }
diff --git a/ext/opcache/tests/preload_trait_alias.phpt b/ext/opcache/tests/preload_trait_alias.phpt
new file mode 100644 (file)
index 0000000..89b843c
--- /dev/null
@@ -0,0 +1,23 @@
+--TEST--
+Preloading trait uses with aliased names
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+opcache.preload={PWD}/preload.inc
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+if (PHP_OS_FAMILY == 'Windows') die('skip Preloading is not supported on Windows');
+?>
+--FILE--
+<?php
+var_dump(get_class_methods('TraitAliasTest'));
+?>
+--EXPECT--
+array(2) {
+  [0]=>
+  string(3) "bar"
+  [1]=>
+  string(3) "foo"
+}