Skip to content

Commit c195fcd

Browse files
committed
Avoid modification of trait info
1 parent 6a1e74e commit c195fcd

File tree

2 files changed

+23
-5
lines changed

2 files changed

+23
-5
lines changed

Zend/zend_inheritance.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1876,9 +1876,6 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce, zend_class_e
18761876
}
18771877

18781878
aliases[i] = trait;
1879-
1880-
/* TODO: try to avoid this assignment (it's necessary only for reflection) */
1881-
cur_method_ref->class_name = zend_string_copy(trait->name);
18821879
}
18831880
zend_string_release_ex(lcname, 0);
18841881
i++;

ext/reflection/php_reflection.c

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4913,9 +4913,30 @@ ZEND_METHOD(ReflectionClass, getTraitAliases)
49134913
zend_trait_method_reference *cur_ref = &ce->trait_aliases[i]->trait_method;
49144914

49154915
if (ce->trait_aliases[i]->alias) {
4916+
zend_string *class_name = cur_ref->class_name;
4917+
4918+
if (!class_name) {
4919+
uint32_t j = 0;
4920+
zval *zv;
4921+
zend_class_entry *trait;
4922+
zend_string *lcname = zend_string_tolower(cur_ref->method_name);
4923+
4924+
for (j = 0; j < ce->num_traits; j++) {
4925+
zv = zend_hash_find_ex(CG(class_table), ce->trait_names[j].lc_name, 1);
4926+
if (zv) {
4927+
trait = Z_CE_P(zv);
4928+
if (zend_hash_exists(&trait->function_table, lcname)) {
4929+
class_name = trait->name;
4930+
break;
4931+
}
4932+
}
4933+
}
4934+
zend_string_release_ex(lcname, 0);
4935+
ZEND_ASSERT(class_name != NULL);
4936+
}
49164937

4917-
mname = zend_string_alloc(ZSTR_LEN(cur_ref->class_name) + ZSTR_LEN(cur_ref->method_name) + 2, 0);
4918-
snprintf(ZSTR_VAL(mname), ZSTR_LEN(mname) + 1, "%s::%s", ZSTR_VAL(cur_ref->class_name), ZSTR_VAL(cur_ref->method_name));
4938+
mname = zend_string_alloc(ZSTR_LEN(class_name) + ZSTR_LEN(cur_ref->method_name) + 2, 0);
4939+
snprintf(ZSTR_VAL(mname), ZSTR_LEN(mname) + 1, "%s::%s", ZSTR_VAL(class_name), ZSTR_VAL(cur_ref->method_name));
49194940
add_assoc_str_ex(return_value, ZSTR_VAL(ce->trait_aliases[i]->alias), ZSTR_LEN(ce->trait_aliases[i]->alias), mname);
49204941
}
49214942
i++;

0 commit comments

Comments
 (0)