summaryrefslogtreecommitdiff
path: root/ext/reflection
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2021-01-19 11:54:01 +0300
committerDmitry Stogov <dmitry@zend.com>2021-01-19 11:54:01 +0300
commitc195fcd67894a7589db1696fb42ed517b24eef6b (patch)
tree2140a97ba3f003391b8a665689d338fdef08ab30 /ext/reflection
parent6a1e74eb323813d183abdaccb0bb504f5979b199 (diff)
downloadphp-git-c195fcd67894a7589db1696fb42ed517b24eef6b.tar.gz
Avoid modification of trait info
Diffstat (limited to 'ext/reflection')
-rw-r--r--ext/reflection/php_reflection.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
index 90470acdc2..b0c1067474 100644
--- a/ext/reflection/php_reflection.c
+++ b/ext/reflection/php_reflection.c
@@ -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++;