]> granicus.if.org Git - php/commitdiff
Fixed bug #68103 Dupplicate entry in Reflection (merged)
authorRemi Collet <remi@php.net>
Fri, 26 Sep 2014 07:28:02 +0000 (09:28 +0200)
committerRemi Collet <remi@php.net>
Fri, 26 Sep 2014 07:28:02 +0000 (09:28 +0200)
1  2 
ext/reflection/php_reflection.c

index c99f0668349105fd091442109ef3a8f24404e155,bdcea373a552872ce27fe3614521b008a0ad5c31..2c29229e8e30aef9d5d64487a5c48cbd7ec659e4
@@@ -994,10 -1014,13 +994,13 @@@ static int _extension_class_string(zva
        struct _zend_module_entry *module = va_arg(args, struct _zend_module_entry*);
        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)) {
 +      if ((ce->type == ZEND_INTERNAL_CLASS) && ce->info.internal.module && !strcasecmp(ce->info.internal.module->name, module->name)) {
-               string_printf(str, "\n");
-               _class_string(str, ce, 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)) {
++              if (!zend_binary_strcasecmp(ce->name->val, ce->name->len, hash_key->key->val, hash_key->key->len)) {
+                       string_printf(str, "\n");
 -                      _class_string(str, *pce, NULL, indent TSRMLS_CC);
++                      _class_string(str, ce, NULL, indent TSRMLS_CC);
+                       (*num_classes)++;
+               }
        }
        return ZEND_HASH_APPLY_KEEP;
  }
@@@ -5319,12 -5397,25 +5322,21 @@@ static int add_extension_class(zval *z
        struct _zend_module_entry *module = va_arg(args, struct _zend_module_entry*);
        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 ((ce->type == ZEND_INTERNAL_CLASS) && ce->info.internal.module && !strcasecmp(ce->info.internal.module->name, module->name)) {
++              zend_string *name;
 -              if (zend_binary_strcasecmp((*pce)->name, (*pce)->name_length, hash_key->arKey, hash_key->nKeyLength-1)) {
++              if (zend_binary_strcasecmp(ce->name->val, ce->name->len, hash_key->key->val, hash_key->key->len)) {
+                       /* This is an class alias, use alias name */
 -                      name = hash_key->arKey;
 -                      nlen = hash_key->nKeyLength-1;
++                      name = hash_key->key;
+               } else {
+                       /* Use class name */
 -                      name = (*pce)->name;
 -                      nlen = (*pce)->name_length;
++                      name = ce->name;
+               }
                if (add_reflection_class) {
 -                      ALLOC_ZVAL(zclass);
 -                      zend_reflection_class_factory(*pce, zclass TSRMLS_CC);
 -                      add_assoc_zval_ex(class_array, name, nlen+1, zclass);
 +                      zend_reflection_class_factory(ce, &zclass TSRMLS_CC);
-                       zend_hash_update(Z_ARRVAL_P(class_array), ce->name, &zclass);
++                      zend_hash_update(Z_ARRVAL_P(class_array), name, &zclass);
                } else {
-                       add_next_index_str(class_array, zend_string_copy(ce->name));
 -                      add_next_index_stringl(class_array, name, nlen, 1);
++                      add_next_index_str(class_array, zend_string_copy(name));
                }
        }
        return ZEND_HASH_APPLY_KEEP;