Commit:    9f52c5c22647f0648dbb350c551417b1ad070359
Author:    Nikita Popov <ni...@php.net>         Sun, 27 May 2012 22:48:21 +0200
Parents:   64a643a4e3c1b45d3a9b2ad24537f7aab6296f7d
Branches:  master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=9f52c5c22647f0648dbb350c551417b1ad070359

Log:
Fix generator creation when execute_data is not nested

This happens primarily when the generator is invoked from some internal
place like a dynamic function call.

Changed paths:
  A  Zend/tests/generators/dynamic_call.phpt
  M  Zend/zend_vm_def.h
  M  Zend/zend_vm_execute.h


Diff:
diff --git a/Zend/tests/generators/dynamic_call.phpt 
b/Zend/tests/generators/dynamic_call.phpt
new file mode 100644
index 0000000..7b4b0c3
--- /dev/null
+++ b/Zend/tests/generators/dynamic_call.phpt
@@ -0,0 +1,19 @@
+--TEST--
+It's possible to invoke a generator dynamically
+--FILE--
+<?php
+
+function *gen($foo, $bar) {
+    yield $foo;
+    yield $bar;
+}
+
+$gen = call_user_func('gen', 'bar', 'foo');
+foreach ($gen as $value) {
+    var_dump($value);
+}
+
+?>
+--EXPECT--
+string(3) "bar"
+string(3) "foo"
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 440b36d..0b06c92 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -5265,10 +5265,12 @@ ZEND_VM_HANDLER(159, ZEND_SUSPEND_AND_RETURN_GENERATOR, 
ANY, ANY)
                EX(called_scope) = DECODE_CTOR(EX(called_scope));
 
                zend_vm_stack_clear_multiple(TSRMLS_C);
+
+               ZEND_VM_INC_OPCODE();
+               ZEND_VM_LEAVE();
        }
 
-       ZEND_VM_INC_OPCODE();
-       ZEND_VM_LEAVE();
+       ZEND_VM_RETURN();
 }
 
 ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV, ANY)
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 8f06afa..6879d9d 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -1247,10 +1247,12 @@ static int ZEND_FASTCALL  
ZEND_SUSPEND_AND_RETURN_GENERATOR_SPEC_HANDLER(ZEND_OP
                EX(called_scope) = DECODE_CTOR(EX(called_scope));
 
                zend_vm_stack_clear_multiple(TSRMLS_C);
+
+               ZEND_VM_INC_OPCODE();
+               ZEND_VM_LEAVE();
        }
 
-       ZEND_VM_INC_OPCODE();
-       ZEND_VM_LEAVE();
+       ZEND_VM_RETURN();
 }
 
 static int ZEND_FASTCALL  
ZEND_FETCH_CLASS_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to