From: Dmitry Stogov Date: Tue, 4 Mar 2014 13:38:19 +0000 (+0400) Subject: Fixed return of references by value X-Git-Tag: POST_PHPNG_MERGE~412^2~427 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8b82b3e735679ec7a5f2bad8b5c2e68e0eaf75be;p=php Fixed return of references by value --- diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 11f3e4c2fc..134948e96c 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2823,16 +2823,14 @@ ZEND_VM_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY) if (!EX(return_value)) { FREE_OP1(); } else { - if (OP1_TYPE == IS_CONST || - OP1_TYPE == IS_TMP_VAR || - Z_ISREF_P(retval_ptr)) { - zval ret; - - ZVAL_COPY_VALUE(&ret, retval_ptr); + if (OP1_TYPE == IS_CONST || OP1_TYPE == IS_TMP_VAR) { + ZVAL_COPY_VALUE(EX(return_value), retval_ptr); if (OP1_TYPE != IS_TMP_VAR) { - zval_copy_ctor(&ret); + zval_copy_ctor(EX(return_value)); } - ZVAL_COPY_VALUE(EX(return_value), &ret); + FREE_OP1_IF_VAR(); + } else if (Z_ISREF_P(retval_ptr)) { + ZVAL_DUP(EX(return_value), Z_REFVAL_P(retval_ptr)); FREE_OP1_IF_VAR(); } else { ZVAL_COPY_VALUE(EX(return_value), retval_ptr); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index cbe5aa07ac..3aa996951f 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -2567,16 +2567,14 @@ static int ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARG if (!EX(return_value)) { } else { - if (IS_CONST == IS_CONST || - IS_CONST == IS_TMP_VAR || - Z_ISREF_P(retval_ptr)) { - zval ret; - - ZVAL_COPY_VALUE(&ret, retval_ptr); + if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) { + ZVAL_COPY_VALUE(EX(return_value), retval_ptr); if (IS_CONST != IS_TMP_VAR) { - zval_copy_ctor(&ret); + zval_copy_ctor(EX(return_value)); } - ZVAL_COPY_VALUE(EX(return_value), &ret); + + } else if (Z_ISREF_P(retval_ptr)) { + ZVAL_DUP(EX(return_value), Z_REFVAL_P(retval_ptr)); } else { ZVAL_COPY_VALUE(EX(return_value), retval_ptr); @@ -7639,16 +7637,14 @@ static int ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) if (!EX(return_value)) { zval_dtor(free_op1.var); } else { - if (IS_TMP_VAR == IS_CONST || - IS_TMP_VAR == IS_TMP_VAR || - Z_ISREF_P(retval_ptr)) { - zval ret; - - ZVAL_COPY_VALUE(&ret, retval_ptr); + if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) { + ZVAL_COPY_VALUE(EX(return_value), retval_ptr); if (IS_TMP_VAR != IS_TMP_VAR) { - zval_copy_ctor(&ret); + zval_copy_ctor(EX(return_value)); } - ZVAL_COPY_VALUE(EX(return_value), &ret); + + } else if (Z_ISREF_P(retval_ptr)) { + ZVAL_DUP(EX(return_value), Z_REFVAL_P(retval_ptr)); } else { ZVAL_COPY_VALUE(EX(return_value), retval_ptr); @@ -12669,16 +12665,14 @@ static int ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) if (!EX(return_value)) { zval_ptr_dtor_nogc(free_op1.var); } else { - if (IS_VAR == IS_CONST || - IS_VAR == IS_TMP_VAR || - Z_ISREF_P(retval_ptr)) { - zval ret; - - ZVAL_COPY_VALUE(&ret, retval_ptr); + if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) { + ZVAL_COPY_VALUE(EX(return_value), retval_ptr); if (IS_VAR != IS_TMP_VAR) { - zval_copy_ctor(&ret); + zval_copy_ctor(EX(return_value)); } - ZVAL_COPY_VALUE(EX(return_value), &ret); + zval_ptr_dtor_nogc(free_op1.var); + } else if (Z_ISREF_P(retval_ptr)) { + ZVAL_DUP(EX(return_value), Z_REFVAL_P(retval_ptr)); zval_ptr_dtor_nogc(free_op1.var); } else { ZVAL_COPY_VALUE(EX(return_value), retval_ptr); @@ -29785,16 +29779,14 @@ static int ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) if (!EX(return_value)) { } else { - if (IS_CV == IS_CONST || - IS_CV == IS_TMP_VAR || - Z_ISREF_P(retval_ptr)) { - zval ret; - - ZVAL_COPY_VALUE(&ret, retval_ptr); + if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) { + ZVAL_COPY_VALUE(EX(return_value), retval_ptr); if (IS_CV != IS_TMP_VAR) { - zval_copy_ctor(&ret); + zval_copy_ctor(EX(return_value)); } - ZVAL_COPY_VALUE(EX(return_value), &ret); + + } else if (Z_ISREF_P(retval_ptr)) { + ZVAL_DUP(EX(return_value), Z_REFVAL_P(retval_ptr)); } else { ZVAL_COPY_VALUE(EX(return_value), retval_ptr);