From: Dmitry Stogov Date: Wed, 26 Feb 2014 14:07:16 +0000 (+0400) Subject: Fixed return anf yield by reference X-Git-Tag: POST_PHPNG_MERGE~412^2~510 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=60eadc80b8b0a10a9498ae60571b9fb291e04b08;p=php Fixed return anf yield by reference --- diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 66410d41d3..40694377be 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2789,7 +2789,7 @@ void zend_do_return(znode *expr, int do_end_vparse TSRMLS_DC) /* {{{ */ if (do_end_vparse) { if (returns_reference && !zend_is_function_or_method_call(expr)) { - zend_do_end_variable_parse(expr, BP_VAR_W, 0 TSRMLS_CC); + zend_do_end_variable_parse(expr, BP_VAR_W, 1 TSRMLS_CC); } else { zend_do_end_variable_parse(expr, BP_VAR_R, 0 TSRMLS_CC); } @@ -2851,7 +2851,7 @@ void zend_do_yield(znode *result, znode *value, const znode *key, zend_bool is_v if (is_variable) { if ((CG(active_op_array)->fn_flags & ZEND_ACC_RETURN_REFERENCE) && !zend_is_function_or_method_call(value)) { - zend_do_end_variable_parse(value, BP_VAR_W, 0 TSRMLS_CC); + zend_do_end_variable_parse(value, BP_VAR_W, 1 TSRMLS_CC); } else { zend_do_end_variable_parse(value, BP_VAR_R, 0 TSRMLS_CC); } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 1d30af9137..c97fa0d759 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2861,7 +2861,7 @@ ZEND_VM_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY) //??? if (opline->extended_value == ZEND_RETURNS_FUNCTION && //??? EX_T(opline->op1.var).var.fcall_returned_reference) { //??? } else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) { -//??? zend_error(E_NOTICE, "Only variable references should be returned by reference"); + zend_error(E_NOTICE, "Only variable references should be returned by reference"); //??? if (EX(return_value)) { //??? ZVAL_DUP(EX(return_value), retval_ptr); //??? } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index f0af3e7174..36f6c81f42 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -2613,7 +2613,7 @@ static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER(ZEND_OPCODE_HAND //??? if (opline->extended_value == ZEND_RETURNS_FUNCTION && //??? EX_T(opline->op1.var).var.fcall_returned_reference) { //??? } else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) { -//??? zend_error(E_NOTICE, "Only variable references should be returned by reference"); + zend_error(E_NOTICE, "Only variable references should be returned by reference"); //??? if (EX(return_value)) { //??? ZVAL_DUP(EX(return_value), retval_ptr); //??? } @@ -7667,7 +7667,7 @@ static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLE //??? if (opline->extended_value == ZEND_RETURNS_FUNCTION && //??? EX_T(opline->op1.var).var.fcall_returned_reference) { //??? } else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) { -//??? zend_error(E_NOTICE, "Only variable references should be returned by reference"); + zend_error(E_NOTICE, "Only variable references should be returned by reference"); //??? if (EX(return_value)) { //??? ZVAL_DUP(EX(return_value), retval_ptr); //??? } @@ -12671,7 +12671,7 @@ static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLE //??? if (opline->extended_value == ZEND_RETURNS_FUNCTION && //??? EX_T(opline->op1.var).var.fcall_returned_reference) { //??? } else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) { -//??? zend_error(E_NOTICE, "Only variable references should be returned by reference"); + zend_error(E_NOTICE, "Only variable references should be returned by reference"); //??? if (EX(return_value)) { //??? ZVAL_DUP(EX(return_value), retval_ptr); //??? } @@ -29576,7 +29576,7 @@ static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER //??? if (opline->extended_value == ZEND_RETURNS_FUNCTION && //??? EX_T(opline->op1.var).var.fcall_returned_reference) { //??? } else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) { -//??? zend_error(E_NOTICE, "Only variable references should be returned by reference"); + zend_error(E_NOTICE, "Only variable references should be returned by reference"); //??? if (EX(return_value)) { //??? ZVAL_DUP(EX(return_value), retval_ptr); //??? }