From 8b82b3e735679ec7a5f2bad8b5c2e68e0eaf75be Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 4 Mar 2014 17:38:19 +0400 Subject: [PATCH] Fixed return of references by value --- Zend/zend_vm_def.h | 14 +++++------ Zend/zend_vm_execute.h | 56 ++++++++++++++++++------------------------ 2 files changed, 30 insertions(+), 40 deletions(-) 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); -- 2.50.1