]> granicus.if.org Git - php/commitdiff
Fix bogus traces with ReflectionGenerator::getTrace()
authorBob Weinand <bobwei9@hotmail.com>
Thu, 20 Aug 2015 21:24:28 +0000 (23:24 +0200)
committerBob Weinand <bobwei9@hotmail.com>
Thu, 20 Aug 2015 21:24:28 +0000 (23:24 +0200)
NEWS
Zend/zend_generators.c
ext/reflection/tests/ReflectionGenerator_basic.phpt
ext/reflection/tests/ReflectionGenerator_getTrace.phpt [new file with mode: 0644]
ext/reflection/tests/ReflectionGenerator_in_Generator.phpt

diff --git a/NEWS b/NEWS
index c82c9358d09f463f3ea66098000a692c9277d277..f92f2838e20efade4df03f7ad7ee5b1ce5b9a992 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -17,6 +17,9 @@ PHP                                                                        NEWS
 - Standard:
   . Fixed bug #70295 (Segmentation fault with setrawcookie). (Bob)
 
+- Reflection:
+  . Fixed bug causing bogus traces for ReflectionGenerator::getTrace(). (Bob)
+
 20 Aug 2015, PHP 7.0.0 RC 1
 
 - Core:
index 0b542921599a49b66d4a9c310c635d5ad00be3b7..18c6087382341b8c2b9cb93f2b43cd366737acf0 100644 (file)
@@ -273,7 +273,7 @@ static ZEND_COLD zend_function *zend_generator_get_constructor(zend_object *obje
 
 ZEND_API zend_execute_data *zend_generator_check_placeholder_frame(zend_execute_data *ptr)
 {
-       if (!ptr->func && ptr->prev_execute_data && Z_OBJ(ptr->This)) {
+       if (!ptr->func && Z_OBJ(ptr->This)) {
                if (Z_OBJCE(ptr->This) == zend_ce_generator) {
                        zend_generator *generator = (zend_generator *) Z_OBJ(ptr->This);
                        zend_generator *root = (generator->node.children < 1 ? generator : generator->node.ptr.leaf)->node.ptr.root;
index 528d2d9ca296df0d196bbfea0ec1e1de0dc40c7b..6f35b6c24471074fe29863347437f18375a3138c 100644 (file)
@@ -39,7 +39,11 @@ object(Generator)#2 (0) {
 }
 array(1) {
   [0]=>
-  array(2) {
+  array(4) {
+    ["file"]=>
+    string(%d) "%s"
+    ["line"]=>
+    int(%d)
     ["function"]=>
     string(3) "foo"
     ["args"]=>
diff --git a/ext/reflection/tests/ReflectionGenerator_getTrace.phpt b/ext/reflection/tests/ReflectionGenerator_getTrace.phpt
new file mode 100644 (file)
index 0000000..05a4600
--- /dev/null
@@ -0,0 +1,53 @@
+--TEST--
+ReflectionGenerator::getTrace() over multiple Generators
+--FILE--
+<?php
+
+function foo() {
+       yield 1;
+       yield 2;
+}
+
+function bar()
+{
+    yield from foo();
+}
+
+function baz()
+{
+    yield from bar();
+}
+
+$gen = baz();
+$gen->valid();
+
+var_dump((new ReflectionGenerator($gen))->getTrace());
+
+?>
+--EXPECTF--
+array(2) {
+  [0]=>
+  array(4) {
+    ["file"]=>
+    string(%d) "%s"
+    ["line"]=>
+    int(%d)
+    ["function"]=>
+    string(3) "foo"
+    ["args"]=>
+    array(0) {
+    }
+  }
+  [1]=>
+  array(4) {
+    ["file"]=>
+    string(%d) "%s"
+    ["line"]=>
+    int(%d)
+    ["function"]=>
+    string(3) "bar"
+    ["args"]=>
+    array(0) {
+    }
+  }
+}
index 9c0098d506c9cc3f8c5bbcfb6fa9f3d762eacff9..a227e1a213db5afb0598f42c01ef1d5700c9269b 100644 (file)
@@ -46,7 +46,11 @@ object(ReflectionFunction)#4 (1) {
 NULL
 array(1) {
   [0]=>
-  array(2) {
+  array(4) {
+    ["file"]=>
+    string(%d) "%s"
+    ["line"]=>
+    int(%d)
     ["function"]=>
     string(9) "{closure}"
     ["args"]=>