]> granicus.if.org Git - php/commitdiff
Fixed bug #69802 (Reflection on Closure::__invoke borks type hint class name)
authorDmitry Stogov <dmitry@zend.com>
Mon, 15 Jun 2015 12:44:44 +0000 (15:44 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 15 Jun 2015 12:44:44 +0000 (15:44 +0300)
NEWS
Zend/tests/bug69802.phpt [new file with mode: 0644]
ext/reflection/php_reflection.c

diff --git a/NEWS b/NEWS
index e0f2a16804fabee0dd0413a84836263707ccfc61..5ec887768197c5c928f287278f2fdaf253c519b7 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,8 @@ PHP                                                                        NEWS
     extensions are loaded). (Laruence)
   . Fixed bug #69805 (null ptr deref and seg fault in zend_resolve_class_name).
     (Laruence)
+  . Fixed bug #69802 (Reflection on Closure::__invoke borks type hint class
+    name). (Dmitry)
   . Fixed bug #69761 (Serialization of anonymous classes should be prevented).
     (Laruence)
   . Fixed bug #69551 (parse_ini_file() and parse_ini_string() segmentation
diff --git a/Zend/tests/bug69802.phpt b/Zend/tests/bug69802.phpt
new file mode 100644 (file)
index 0000000..6143b0b
--- /dev/null
@@ -0,0 +1,13 @@
+--TEST--
+Bug #69802 (Reflection on Closure::__invoke borks type hint class name)
+--FILE--
+<?php
+$f = function(stdClass $x) {};
+$r = new ReflectionMethod($f, '__invoke');
+var_dump($r->getParameters()[0]->getClass());
+?>
+--EXPECT--
+object(ReflectionClass)#4 (1) {
+  ["name"]=>
+  string(8) "stdClass"
+}
index 4c570d75734cf3cf35bafab0b11f87128b0b50e4..c8c5a527ab7527c7c5329d6367155c47e4692dc5 100644 (file)
@@ -2620,7 +2620,10 @@ ZEND_METHOD(reflection_parameter, getClass)
                const char *class_name;
                size_t class_name_len;
 
-               if (param->fptr->type == ZEND_INTERNAL_FUNCTION) {
+               if (param->fptr->type == ZEND_INTERNAL_FUNCTION &&
+                   /* Closure::__invoke() reuses arg_info of user function and
+                    * don't set ZEND_ACC_HAS_TYPE_HINTS flag */
+                   (param->fptr->common.fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
                        class_name = ((zend_internal_arg_info*)param->arg_info)->class_name;
                        class_name_len = strlen(class_name);
                } else {
@@ -2648,7 +2651,8 @@ ZEND_METHOD(reflection_parameter, getClass)
                        }
                        ce = ce->parent;
                } else {
-                       if (param->fptr->type == ZEND_INTERNAL_FUNCTION) {
+                       if (param->fptr->type == ZEND_INTERNAL_FUNCTION &&
+                           (param->fptr->common.fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
                                zend_string *name = zend_string_init(class_name, class_name_len, 0);
                                ce = zend_lookup_class(name);
                                zend_string_release(name);