]> granicus.if.org Git - php/commitdiff
Fixed bug #29268 (__autoload() not called with Reflection->getClass())
authorDmitry Stogov <dmitry@php.net>
Fri, 21 Oct 2005 08:03:39 +0000 (08:03 +0000)
committerDmitry Stogov <dmitry@php.net>
Fri, 21 Oct 2005 08:03:39 +0000 (08:03 +0000)
Zend/zend_reflection_api.c
ext/reflection/php_reflection.c
ext/reflection/tests/bug29268.phpt [new file with mode: 0755]

index f7c816b3eec4e71a4d2ecf5bf43778d1cd59aad8..588e44669cd89eb4ee8ef1e3360db090366c6493 100644 (file)
@@ -1857,16 +1857,12 @@ ZEND_METHOD(reflection_parameter, getClass)
                RETURN_NULL();
        } else {
                zend_class_entry **pce;
-               unsigned int lcname_len;
-               char *lcname = zend_u_str_case_fold(UG(unicode)?IS_UNICODE:IS_STRING, param->arg_info->class_name, param->arg_info->class_name_len, 0, &lcname_len);
 
-               if (zend_u_hash_find(EG(class_table), UG(unicode)?IS_UNICODE:IS_STRING, lcname, lcname_len + 1, (void **) &pce) == FAILURE) {
-                       efree(lcname);
+               if (zend_u_lookup_class_ex(UG(unicode)?IS_UNICODE:IS_STRING, param->arg_info->class_name, param->arg_info->class_name_len, 1, &pce TSRMLS_CC) == FAILURE) {
                        zend_throw_exception_ex(U_CLASS_ENTRY(reflection_exception_ptr), 0 TSRMLS_CC, 
                                "Class %v does not exist", param->arg_info->class_name);
                        return;
                }
-               efree(lcname);
                zend_reflection_class_factory(*pce, return_value TSRMLS_CC);
        }
 }
index f7c816b3eec4e71a4d2ecf5bf43778d1cd59aad8..588e44669cd89eb4ee8ef1e3360db090366c6493 100644 (file)
@@ -1857,16 +1857,12 @@ ZEND_METHOD(reflection_parameter, getClass)
                RETURN_NULL();
        } else {
                zend_class_entry **pce;
-               unsigned int lcname_len;
-               char *lcname = zend_u_str_case_fold(UG(unicode)?IS_UNICODE:IS_STRING, param->arg_info->class_name, param->arg_info->class_name_len, 0, &lcname_len);
 
-               if (zend_u_hash_find(EG(class_table), UG(unicode)?IS_UNICODE:IS_STRING, lcname, lcname_len + 1, (void **) &pce) == FAILURE) {
-                       efree(lcname);
+               if (zend_u_lookup_class_ex(UG(unicode)?IS_UNICODE:IS_STRING, param->arg_info->class_name, param->arg_info->class_name_len, 1, &pce TSRMLS_CC) == FAILURE) {
                        zend_throw_exception_ex(U_CLASS_ENTRY(reflection_exception_ptr), 0 TSRMLS_CC, 
                                "Class %v does not exist", param->arg_info->class_name);
                        return;
                }
-               efree(lcname);
                zend_reflection_class_factory(*pce, return_value TSRMLS_CC);
        }
 }
diff --git a/ext/reflection/tests/bug29268.phpt b/ext/reflection/tests/bug29268.phpt
new file mode 100755 (executable)
index 0000000..d1f74f2
--- /dev/null
@@ -0,0 +1,26 @@
+--TEST--
+Bug #29268 (__autoload() not called with reflectionProperty->getClass())
+--FILE--
+<?php
+function __autoload($classname) {
+       echo "__autoload($classname)\n";
+       eval("class $classname {}");
+}
+
+class B{
+       public function doit(A $a){
+       }
+}
+
+$ref = new reflectionMethod('B','doit');
+$parameters = $ref->getParameters();   
+foreach($parameters as $parameter){
+       $class = $parameter->getClass();        
+       echo $class->name."\n";
+}
+echo "ok\n";
+?>
+--EXPECT--
+__autoload(A)
+A
+ok