com php-src: Fix bug #69458: Zend/tests/generators/yield_from _already_running.phpt Zend/zend_vm_def.h Zend/z end_vm_execute.h
| From: | Bob Weinand | Date: | Wed, 15 Apr 2015 19:56:11 +0000 |
| Subject: | com php-src: Fix bug #69458: Zend/tests/generators/yield_from _already_running.phpt Zend/zend_vm_def.h Zend/z end_vm_execute.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-86316@lists.php.net to get a copy of this message | ||
Commit: 3dcad2eea2f24164f2a313792bbfda5e093b4807
Author: Bob Weinand <bobwei9@hotmail.com> Wed, 15 Apr 2015 21:56:11 +0200
Parents: 4e76d58b2b1614125ed232450197a9c23aa5cc43
Branches: master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=3dcad2eea2f24164f2a313792bbfda5e093b4807
Log:
Fix bug #69458
Bugs:
https://bugs.php.net/69458
Changed paths:
A Zend/tests/generators/yield_from_already_running.phpt
M Zend/zend_vm_def.h
M Zend/zend_vm_execute.h
Diff:
diff --git a/Zend/tests/generators/yield_from_already_running.phpt
b/Zend/tests/generators/yield_from_already_running.phpt
new file mode 100644
index 0000000..789490c
--- /dev/null
+++ b/Zend/tests/generators/yield_from_already_running.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Yielding from the already running Generator should fail (bug #69458)
+--FILE--
+<?php
+
+function gen() {
+ yield from yield;
+}
+
+($gen = gen())->send($gen);
+
+?>
+--EXPECTF--
+Fatal error: Impossible to yield from the Generator being currently run in %s on line %d
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index a2f7ace..f4bd498 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -7389,8 +7389,15 @@ ZEND_VM_HANDLER(142, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY)
FREE_OP1_IF_VAR();
if (Z_ISUNDEF(new_gen->retval)) {
- zend_generator_yield_from(generator, new_gen);
- } else if (new_gen->execute_data == NULL) {
+ if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
+ zend_error(E_ERROR | E_EXCEPTION, "Impossible to yield from the Generator being currently
run");
+
+ HANDLE_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ zend_generator_yield_from(generator, new_gen);
+ }
+ } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
zend_error(E_ERROR | E_EXCEPTION, "Generator passed to yield from was aborted without
proper return and is unable to continue");
HANDLE_EXCEPTION();
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 457de3d..94ed61d 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -4045,8 +4045,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL
ZEND_YIELD_FROM_SPEC_CONST_HANDLER(
}
if (Z_ISUNDEF(new_gen->retval)) {
- zend_generator_yield_from(generator, new_gen);
- } else if (new_gen->execute_data == NULL) {
+ if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
+ zend_error(E_ERROR | E_EXCEPTION, "Impossible to yield from the Generator being currently
run");
+
+ HANDLE_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ zend_generator_yield_from(generator, new_gen);
+ }
+ } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
zend_error(E_ERROR | E_EXCEPTION, "Generator passed to yield from was aborted without
proper return and is unable to continue");
HANDLE_EXCEPTION();
@@ -11678,8 +11685,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL
ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZE
}
if (Z_ISUNDEF(new_gen->retval)) {
- zend_generator_yield_from(generator, new_gen);
- } else if (new_gen->execute_data == NULL) {
+ if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
+ zend_error(E_ERROR | E_EXCEPTION, "Impossible to yield from the Generator being currently
run");
+
+ HANDLE_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ zend_generator_yield_from(generator, new_gen);
+ }
+ } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
zend_error(E_ERROR | E_EXCEPTION, "Generator passed to yield from was aborted without
proper return and is unable to continue");
HANDLE_EXCEPTION();
@@ -15377,8 +15391,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL
ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZE
zval_ptr_dtor_nogc(free_op1);
if (Z_ISUNDEF(new_gen->retval)) {
- zend_generator_yield_from(generator, new_gen);
- } else if (new_gen->execute_data == NULL) {
+ if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
+ zend_error(E_ERROR | E_EXCEPTION, "Impossible to yield from the Generator being currently
run");
+
+ HANDLE_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ zend_generator_yield_from(generator, new_gen);
+ }
+ } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
zend_error(E_ERROR | E_EXCEPTION, "Generator passed to yield from was aborted without
proper return and is unable to continue");
HANDLE_EXCEPTION();
@@ -28967,8 +28988,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL
ZEND_YIELD_FROM_SPEC_CV_HANDLER(ZEN
}
if (Z_ISUNDEF(new_gen->retval)) {
- zend_generator_yield_from(generator, new_gen);
- } else if (new_gen->execute_data == NULL) {
+ if (UNEXPECTED(zend_generator_get_current(new_gen) == generator)) {
+ zend_error(E_ERROR | E_EXCEPTION, "Impossible to yield from the Generator being currently
run");
+
+ HANDLE_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ } else {
+ zend_generator_yield_from(generator, new_gen);
+ }
+ } else if (UNEXPECTED(new_gen->execute_data == NULL)) {
zend_error(E_ERROR | E_EXCEPTION, "Generator passed to yield from was aborted without
proper return and is unable to continue");
HANDLE_EXCEPTION();