com php-src: Fixed bug #69419: NEWS Zend/tests/generators/bug69419.phpt Zend/zend_vm_def.h Zend/zend_vm_execute.h
| From: | Nikita Popov | Date: | Tue, 14 Apr 2015 14:35:23 +0000 |
| Subject: | com php-src: Fixed bug #69419: NEWS Zend/tests/generators/bug69419.phpt Zend/zend_vm_def.h Zend/zend_vm_execute.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-86229@lists.php.net to get a copy of this message | ||
Commit: 95650d0942c99db8c247797d2ce708a586298ae9
Author: Nikita Popov <nikic@php.net> Tue, 14 Apr 2015 16:35:23 +0200
Parents: dc024f0bdc2570381b1bcabf904c0423fb499049
Branches: PHP-5.5 PHP-5.6 master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=95650d0942c99db8c247797d2ce708a586298ae9
Log:
Fixed bug #69419
Bugs:
https://bugs.php.net/69419
Changed paths:
M NEWS
A Zend/tests/generators/bug69419.phpt
M Zend/zend_vm_def.h
M Zend/zend_vm_execute.h
Diff:
diff --git a/NEWS b/NEWS
index 8003938..a71c3fc 100644
--- a/NEWS
+++ b/NEWS
@@ -9,6 +9,8 @@ PHP NEWS
. Fixed bug #67314 (Segmentation fault in gc_remove_zval_from_buffer).
(Dmitry)
. Fixed bug #68652 (segmentation fault in destructor). (Dmitry)
+ . Fixed bug #69419 (Returning compatible sub generator produces a warning).
+ (Nikita)
- cURL:
. Fixed bug #68739 (Missing break / control flow). (Laruence)
diff --git a/Zend/tests/generators/bug69419.phpt b/Zend/tests/generators/bug69419.phpt
new file mode 100644
index 0000000..dce08ed
--- /dev/null
+++ b/Zend/tests/generators/bug69419.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Bug #69419: Returning compatible sub generator produces a warning
+--FILE--
+<?php
+
+function & genRefInner() {
+ $var = 1;
+ yield $var;
+}
+
+function & genRefOuter() {
+ return genRefInner();
+}
+
+foreach(genRefOuter() as $i) {
+ var_dump($i);
+}
+
+?>
+--EXPECTF--
+Notice: Only variable references should be returned by reference in %s on line %d
+int(1)
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 66758d4..9e68290 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -1996,13 +1996,12 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
EX_T(opline->result.var).var.ptr = NULL;
}
} else if (fbc->type == ZEND_USER_FUNCTION) {
+ temp_variable *ret = &EX_T(opline->result.var);
EX(original_return_value) = EG(return_value_ptr_ptr);
EG(active_symbol_table) = NULL;
EG(active_op_array) = &fbc->op_array;
EG(return_value_ptr_ptr) = NULL;
if (RETURN_VALUE_USED(opline)) {
- temp_variable *ret = &EX_T(opline->result.var);
-
ret->var.ptr = NULL;
EG(return_value_ptr_ptr) = &ret->var.ptr;
ret->var.ptr_ptr = &ret->var.ptr;
@@ -2011,7 +2010,8 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
if (UNEXPECTED((EG(active_op_array)->fn_flags & ZEND_ACC_GENERATOR) != 0)) {
if (RETURN_VALUE_USED(opline)) {
- EX_T(opline->result.var).var.ptr = zend_generator_create_zval(EG(active_op_array)
TSRMLS_CC);
+ ret->var..ptr = zend_generator_create_zval(EG(active_op_array) TSRMLS_CC);
+ ret->var.fcall_returned_reference = 0;
}
} else if (EXPECTED(zend_execute_ex == execute_ex)) {
if (EXPECTED(EG(exception) == NULL)) {
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 58ca552..706d00b 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -559,13 +559,12 @@ static int ZEND_FASTCALL
zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_AR
EX_T(opline->result.var).var.ptr = NULL;
}
} else if (fbc->type == ZEND_USER_FUNCTION) {
+ temp_variable *ret = &EX_T(opline->result.var);
EX(original_return_value) = EG(return_value_ptr_ptr);
EG(active_symbol_table) = NULL;
EG(active_op_array) = &fbc->op_array;
EG(return_value_ptr_ptr) = NULL;
if (RETURN_VALUE_USED(opline)) {
- temp_variable *ret = &EX_T(opline->result.var);
-
ret->var.ptr = NULL;
EG(return_value_ptr_ptr) = &ret->var.ptr;
ret->var.ptr_ptr = &ret->var.ptr;
@@ -574,7 +573,8 @@ static int ZEND_FASTCALL zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_AR
if (UNEXPECTED((EG(active_op_array)->fn_flags & ZEND_ACC_GENERATOR) != 0)) {
if (RETURN_VALUE_USED(opline)) {
- EX_T(opline->result.var).var.ptr = zend_generator_create_zval(EG(active_op_array)
TSRMLS_CC);
+ ret->var.ptr = zend_generator_create_zval(EG(active_op_array) TSRMLS_CC);
+ ret->var.fcall_returned_reference = 0;
}
} else if (EXPECTED(zend_execute_ex == execute_ex)) {
if (EXPECTED(EG(exception) == NULL)) {