Skip to content

Commit c098952

Browse files
committed
Use IS_ALIAS_PTR to make distinct between aliasses and real classes
1 parent 4b79dba commit c098952

File tree

2 files changed

+26
-30
lines changed

2 files changed

+26
-30
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
--TEST--
2+
Testing get_declared_traits() and class_alias()
3+
--FILE--
4+
<?php
5+
6+
trait T { }
7+
class_alias("T", "A");
8+
foreach (get_declared_traits() as $name) {
9+
if (strlen($name) == 1) {
10+
echo $name;
11+
}
12+
}
13+
echo "\n";
14+
?>
15+
--EXPECT--
16+
Ta

Zend/zend_builtin_functions.c

Lines changed: 10 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -859,24 +859,6 @@ ZEND_FUNCTION(get_mangled_object_vars)
859859
}
860860
/* }}} */
861861

862-
static bool same_name(zend_string *key, zend_string *name) /* {{{ */
863-
{
864-
zend_string *lcname;
865-
bool ret;
866-
867-
if (key == name) {
868-
return 1;
869-
}
870-
if (ZSTR_LEN(key) != ZSTR_LEN(name)) {
871-
return 0;
872-
}
873-
lcname = zend_string_tolower(name);
874-
ret = memcmp(ZSTR_VAL(lcname), ZSTR_VAL(key), ZSTR_LEN(key)) == 0;
875-
zend_string_release_ex(lcname, 0);
876-
return ret;
877-
}
878-
/* }}} */
879-
880862
/* {{{ Returns an array of method names for class or class instance. */
881863
ZEND_FUNCTION(get_class_methods)
882864
{
@@ -1271,30 +1253,28 @@ ZEND_FUNCTION(restore_exception_handler)
12711253
}
12721254
/* }}} */
12731255

1274-
static void copy_class_or_interface_name(zval *array, zend_string *key, zend_class_entry *ce) /* {{{ */
1275-
{
1276-
if ((ce->refcount == 1 && !(ce->ce_flags & ZEND_ACC_IMMUTABLE)) ||
1277-
same_name(key, ce->name)) {
1278-
key = ce->name;
1279-
}
1280-
add_next_index_str(array, zend_string_copy(key));
1281-
}
1282-
/* }}} */
1283-
12841256
static inline void get_declared_class_impl(INTERNAL_FUNCTION_PARAMETERS, int flags, int skip_flags) /* {{{ */
12851257
{
12861258
zend_string *key;
1259+
zval *zv, tmp;
12871260
zend_class_entry *ce;
12881261

12891262
ZEND_PARSE_PARAMETERS_NONE();
12901263

12911264
array_init(return_value);
1292-
ZEND_HASH_FOREACH_STR_KEY_PTR(EG(class_table), key, ce) {
1265+
ZEND_HASH_FOREACH_STR_KEY_VAL(EG(class_table), key, zv) {
1266+
ce = Z_PTR_P(zv);
12931267
if (key
12941268
&& ZSTR_VAL(key)[0] != 0
12951269
&& (ce->ce_flags & flags)
12961270
&& !(ce->ce_flags & skip_flags)) {
1297-
copy_class_or_interface_name(return_value, key, ce);
1271+
if (EXPECTED(Z_TYPE_P(zv) == IS_PTR)) {
1272+
ZVAL_STR_COPY(&tmp, ce->name);
1273+
} else {
1274+
ZEND_ASSERT(Z_TYPE_P(zv) == IS_ALIAS_PTR);
1275+
ZVAL_STR_COPY(&tmp, key);
1276+
}
1277+
zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &tmp);
12981278
}
12991279
} ZEND_HASH_FOREACH_END();
13001280
}

0 commit comments

Comments
 (0)