com php-src: Fixed bug #69419: NEWS Zend/tests/generators/bug69419.phpt Zend/zend_vm_def.h Zend/zend_vm_execute.h

From: 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)) {

« previous php.cvs (#86229) next »