]> granicus.if.org Git - php/commitdiff
Avoid modification of trait info
authorDmitry Stogov <dmitry@zend.com>
Tue, 19 Jan 2021 08:54:01 +0000 (11:54 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 19 Jan 2021 08:54:01 +0000 (11:54 +0300)
Zend/zend_inheritance.c
ext/reflection/php_reflection.c

index 81e7c02a6c16d1ec06c15244979302b196a58605..de7e70f1697659479a2008bf50edd517f5e47cda 100644 (file)
@@ -1876,9 +1876,6 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce, zend_class_e
                                }
 
                                aliases[i] = trait;
-
-                               /* TODO: try to avoid this assignment (it's necessary only for reflection) */
-                               cur_method_ref->class_name = zend_string_copy(trait->name);
                        }
                        zend_string_release_ex(lcname, 0);
                        i++;
index 90470acdc2416415450d7bbd1beeb90947f78dab..b0c1067474102db4eabc0f6098a35dea77d38d82 100644 (file)
@@ -4913,9 +4913,30 @@ ZEND_METHOD(ReflectionClass, getTraitAliases)
                        zend_trait_method_reference *cur_ref = &ce->trait_aliases[i]->trait_method;
 
                        if (ce->trait_aliases[i]->alias) {
+                               zend_string *class_name = cur_ref->class_name;
+
+                               if (!class_name) {
+                                       uint32_t j = 0;
+                                       zval *zv;
+                                       zend_class_entry *trait;
+                                       zend_string *lcname = zend_string_tolower(cur_ref->method_name);
+
+                                       for (j = 0; j < ce->num_traits; j++) {
+                                               zv = zend_hash_find_ex(CG(class_table), ce->trait_names[j].lc_name, 1);
+                                               if (zv) {
+                                                       trait = Z_CE_P(zv);
+                                                       if (zend_hash_exists(&trait->function_table, lcname)) {
+                                                               class_name = trait->name;
+                                                               break;
+                                                       }
+                                               }
+                                       }
+                                       zend_string_release_ex(lcname, 0);
+                                       ZEND_ASSERT(class_name != NULL);
+                               }
 
-                               mname = zend_string_alloc(ZSTR_LEN(cur_ref->class_name) + ZSTR_LEN(cur_ref->method_name) + 2, 0);
-                               snprintf(ZSTR_VAL(mname), ZSTR_LEN(mname) + 1, "%s::%s", ZSTR_VAL(cur_ref->class_name), ZSTR_VAL(cur_ref->method_name));
+                               mname = zend_string_alloc(ZSTR_LEN(class_name) + ZSTR_LEN(cur_ref->method_name) + 2, 0);
+                               snprintf(ZSTR_VAL(mname), ZSTR_LEN(mname) + 1, "%s::%s", ZSTR_VAL(class_name), ZSTR_VAL(cur_ref->method_name));
                                add_assoc_str_ex(return_value, ZSTR_VAL(ce->trait_aliases[i]->alias), ZSTR_LEN(ce->trait_aliases[i]->alias), mname);
                        }
                        i++;