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