]> granicus.if.org Git - php/commitdiff
Fixed bug #72523 (dtrace issue with reflection (failed test))
authorXinchen Hui <laruence@gmail.com>
Fri, 1 Jul 2016 10:50:35 +0000 (18:50 +0800)
committerXinchen Hui <laruence@gmail.com>
Fri, 1 Jul 2016 10:50:35 +0000 (18:50 +0800)
NEWS
Zend/tests/generators/bug72523.phpt [new file with mode: 0644]
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --git a/NEWS b/NEWS
index f707f10a9b6ff03cf57478a49a21c962665c21e8..0eba2f5fca6c53ee8951e93405cdbbd99958c9e7 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,7 @@ PHP                                                                        NEWS
 ?? ??? 2016, PHP 7.1.0beta1
 
 - Core:
+  . Fixed bug #72523 (dtrace issue with reflection (failed test)). (Laruence)
   . Fixed bug #72508 (strange references after recursive function call and
     "switch" statement). (Laruence)
 
diff --git a/Zend/tests/generators/bug72523.phpt b/Zend/tests/generators/bug72523.phpt
new file mode 100644 (file)
index 0000000..74dc583
--- /dev/null
@@ -0,0 +1,15 @@
+--TEST--
+Bug #72523 (dtrace issue with reflection (failed test))
+--FILE--
+<?php
+
+$gen = (new class() {
+       function a() {
+               yield "okey";
+       }
+})->a();
+
+var_dump($gen->current());
+?>
+--EXPECT--
+string(4) "okey"
index e9083e79f4d53b221562e5e982c92e7b638feb44..927b372d48424c0e977400e78c940501ed3c8cb1 100644 (file)
@@ -4046,7 +4046,9 @@ ZEND_VM_HANDLER(41, ZEND_GENERATOR_CREATE, ANY, ANY)
                gen_execute_data->return_value = (zval*)generator;
                call_info = Z_TYPE_INFO(EX(This));
                if ((call_info & Z_TYPE_MASK) == IS_OBJECT
-                && !(call_info & ((ZEND_CALL_CLOSURE|ZEND_CALL_RELEASE_THIS) << ZEND_CALL_INFO_SHIFT))) {
+                && (!(call_info & ((ZEND_CALL_CLOSURE|ZEND_CALL_RELEASE_THIS) << ZEND_CALL_INFO_SHIFT))
+                        /* Bug #72523 */
+                       || UNEXPECTED(zend_execute_ex != execute_ex))) {
                        ZEND_ADD_CALL_FLAG_EX(call_info, ZEND_CALL_RELEASE_THIS);
                        Z_ADDREF(gen_execute_data->This);
                }
index 8132b64a345d27e904b54593986b7e6495758fcb..f2ae082f9117a6f59451b3df66a67ca95f7d52a2 100644 (file)
@@ -1205,7 +1205,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_CREATE_SPEC_HANDLER(
                gen_execute_data->return_value = (zval*)generator;
                call_info = Z_TYPE_INFO(EX(This));
                if ((call_info & Z_TYPE_MASK) == IS_OBJECT
-                && !(call_info & ((ZEND_CALL_CLOSURE|ZEND_CALL_RELEASE_THIS) << ZEND_CALL_INFO_SHIFT))) {
+                && (!(call_info & ((ZEND_CALL_CLOSURE|ZEND_CALL_RELEASE_THIS) << ZEND_CALL_INFO_SHIFT))
+                        /* Bug #72523 */
+                       || UNEXPECTED(zend_execute_ex != execute_ex))) {
                        ZEND_ADD_CALL_FLAG_EX(call_info, ZEND_CALL_RELEASE_THIS);
                        Z_ADDREF(gen_execute_data->This);
                }