diff options
author | Dmitry Stogov <dmitry@zend.com> | 2021-02-10 00:00:55 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2021-02-10 00:00:55 +0300 |
commit | c098952d728a0f73290e1900122139962ed1229c (patch) | |
tree | 178b4cd8c396b723b68cde3d9c55e6250cd60747 | |
parent | 4b79dba93202ed5640dff317046ce2fdd42e1d82 (diff) | |
download | php-git-c098952d728a0f73290e1900122139962ed1229c.tar.gz |
Use IS_ALIAS_PTR to make distinct between aliasses and real classes
-rw-r--r-- | Zend/tests/traits/get_declared_traits_004.phpt | 16 | ||||
-rw-r--r-- | Zend/zend_builtin_functions.c | 40 |
2 files changed, 26 insertions, 30 deletions
diff --git a/Zend/tests/traits/get_declared_traits_004.phpt b/Zend/tests/traits/get_declared_traits_004.phpt new file mode 100644 index 0000000000..88149686f7 --- /dev/null +++ b/Zend/tests/traits/get_declared_traits_004.phpt @@ -0,0 +1,16 @@ +--TEST-- +Testing get_declared_traits() and class_alias() +--FILE-- +<?php + +trait T { } +class_alias("T", "A"); +foreach (get_declared_traits() as $name) { + if (strlen($name) == 1) { + echo $name; + } +} +echo "\n"; +?> +--EXPECT-- +Ta diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index afabfa97f3..94a119eeec 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -859,24 +859,6 @@ ZEND_FUNCTION(get_mangled_object_vars) } /* }}} */ -static bool same_name(zend_string *key, zend_string *name) /* {{{ */ -{ - zend_string *lcname; - bool ret; - - if (key == name) { - return 1; - } - if (ZSTR_LEN(key) != ZSTR_LEN(name)) { - return 0; - } - lcname = zend_string_tolower(name); - ret = memcmp(ZSTR_VAL(lcname), ZSTR_VAL(key), ZSTR_LEN(key)) == 0; - zend_string_release_ex(lcname, 0); - return ret; -} -/* }}} */ - /* {{{ Returns an array of method names for class or class instance. */ ZEND_FUNCTION(get_class_methods) { @@ -1271,30 +1253,28 @@ ZEND_FUNCTION(restore_exception_handler) } /* }}} */ -static void copy_class_or_interface_name(zval *array, zend_string *key, zend_class_entry *ce) /* {{{ */ -{ - if ((ce->refcount == 1 && !(ce->ce_flags & ZEND_ACC_IMMUTABLE)) || - same_name(key, ce->name)) { - key = ce->name; - } - add_next_index_str(array, zend_string_copy(key)); -} -/* }}} */ - static inline void get_declared_class_impl(INTERNAL_FUNCTION_PARAMETERS, int flags, int skip_flags) /* {{{ */ { zend_string *key; + zval *zv, tmp; zend_class_entry *ce; ZEND_PARSE_PARAMETERS_NONE(); array_init(return_value); - ZEND_HASH_FOREACH_STR_KEY_PTR(EG(class_table), key, ce) { + ZEND_HASH_FOREACH_STR_KEY_VAL(EG(class_table), key, zv) { + ce = Z_PTR_P(zv); if (key && ZSTR_VAL(key)[0] != 0 && (ce->ce_flags & flags) && !(ce->ce_flags & skip_flags)) { - copy_class_or_interface_name(return_value, key, ce); + if (EXPECTED(Z_TYPE_P(zv) == IS_PTR)) { + ZVAL_STR_COPY(&tmp, ce->name); + } else { + ZEND_ASSERT(Z_TYPE_P(zv) == IS_ALIAS_PTR); + ZVAL_STR_COPY(&tmp, key); + } + zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &tmp); } } ZEND_HASH_FOREACH_END(); } |