summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRemi Collet <remi@php.net>2014-09-26 08:56:42 +0200
committerRemi Collet <remi@php.net>2014-09-26 08:56:42 +0200
commitefa7f87de4d16bd8a8e1292b5c7431912d41f7a6 (patch)
tree60991d492fe6a8377eec9ecc3cf372def85c438d
parent7958793342783a67f2ebbb2db1abf01474d3c1f4 (diff)
downloadphp-git-efa7f87de4d16bd8a8e1292b5c7431912d41f7a6.tar.gz
Fixed bug #68103 Dupplicate entry in Reflection
$ php -r '$r=new ReflectionExtension("pthreads"); print_r($r->getClassNames());' Array ( [0] => Threaded [1] => stackable [2] => Thread [3] => Worker [4] => Mutex [5] => Cond [6] => Collectable [7] => Pool ) In getClasses() output, it is possible to compare key (ex "stackable") with $obj->name (ex "Threaded") to detect class alias. ... [Threaded] => ReflectionClass Object ( [name] => Threaded ) [stackable] => ReflectionClass Object ( [name] => Threaded ) ...
-rw-r--r--ext/reflection/php_reflection.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
index 31d836a7ac..4294ceac81 100644
--- a/ext/reflection/php_reflection.c
+++ b/ext/reflection/php_reflection.c
@@ -1007,9 +1007,12 @@ static int _extension_class_string(zend_class_entry **pce TSRMLS_DC, int num_arg
int *num_classes = va_arg(args, int*);
if (((*pce)->type == ZEND_INTERNAL_CLASS) && (*pce)->info.internal.module && !strcasecmp((*pce)->info.internal.module->name, module->name)) {
- string_printf(str, "\n");
- _class_string(str, *pce, NULL, indent TSRMLS_CC);
- (*num_classes)++;
+ /* dump class if it is not an alias */
+ if (!zend_binary_strcasecmp((*pce)->name, (*pce)->name_length, hash_key->arKey, hash_key->nKeyLength-1)) {
+ string_printf(str, "\n");
+ _class_string(str, *pce, NULL, indent TSRMLS_CC);
+ (*num_classes)++;
+ }
}
return ZEND_HASH_APPLY_KEEP;
}
@@ -5360,12 +5363,24 @@ static int add_extension_class(zend_class_entry **pce TSRMLS_DC, int num_args, v
int add_reflection_class = va_arg(args, int);
if (((*pce)->type == ZEND_INTERNAL_CLASS) && (*pce)->info.internal.module && !strcasecmp((*pce)->info.internal.module->name, module->name)) {
+ const char *name;
+ int nlen;
+
+ if (zend_binary_strcasecmp((*pce)->name, (*pce)->name_length, hash_key->arKey, hash_key->nKeyLength-1)) {
+ /* This is an class alias, use alias name */
+ name = hash_key->arKey;
+ nlen = hash_key->nKeyLength-1;
+ } else {
+ /* Use class name */
+ name = (*pce)->name;
+ nlen = (*pce)->name_length;
+ }
if (add_reflection_class) {
ALLOC_ZVAL(zclass);
zend_reflection_class_factory(*pce, zclass TSRMLS_CC);
- add_assoc_zval_ex(class_array, (*pce)->name, (*pce)->name_length + 1, zclass);
+ add_assoc_zval_ex(class_array, name, nlen+1, zclass);
} else {
- add_next_index_stringl(class_array, (*pce)->name, (*pce)->name_length, 1);
+ add_next_index_stringl(class_array, name, nlen, 1);
}
}
return ZEND_HASH_APPLY_KEEP;