From 6b8c46dc764c6b9baa3b56914839c1a385773938 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 4 Mar 2014 23:54:05 +0400 Subject: [PATCH] Fixed passing by reference --- Zend/zend_vm_def.h | 39 +++++++++++++++------- Zend/zend_vm_execute.h | 74 +++++++++++++++++++++++++++++------------- 2 files changed, 79 insertions(+), 34 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 134948e96c..85670884c8 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1889,7 +1889,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) if (UNEXPECTED(EG(exception) != NULL)) { zend_throw_exception_internal(NULL TSRMLS_CC); - if (RETURN_VALUE_USED(opline) /*???&& EX_VAR(opline->result.var) */) { + if (RETURN_VALUE_USED(opline)) { zval_ptr_dtor(EX_VAR(opline->result.var)); } HANDLE_EXCEPTION_LEAVE(); @@ -2077,7 +2077,7 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY) if (UNEXPECTED(EG(exception) != NULL)) { zend_throw_exception_internal(NULL TSRMLS_CC); - if (RETURN_VALUE_USED(opline) /*???&& EX_T(opline->result.var).var.ptr*/) { + if (RETURN_VALUE_USED(opline)) { zval_ptr_dtor(EX_VAR(opline->result.var)); } HANDLE_EXCEPTION(); @@ -3076,15 +3076,30 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR|CV, ANY) } varptr = GET_OP1_ZVAL_PTR(BP_VAR_R); -//??? if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) || -//??? EX_T(opline->op1.var).var.fcall_returned_reference) && -//??? (Z_ISREF_P(varptr) || Z_REFCOUNT_P(varptr) == 1)) { -//??? Z_SET_ISREF_P(varptr); -//??? if (OP1_TYPE == IS_CV) { -//??? Z_ADDREF_P(varptr); -//??? } -//??? zend_vm_stack_push(varptr TSRMLS_CC); -//??? } else { +//??? +#if 0 + if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) || + EX_T(opline->op1.var).var.fcall_returned_reference) && + (Z_ISREF_P(varptr) || Z_REFCOUNT_P(varptr) == 1)) { + Z_SET_ISREF_P(varptr); + if (OP1_TYPE == IS_CV) { + Z_ADDREF_P(varptr); + } + zend_vm_stack_push(varptr TSRMLS_CC); +#else + if (Z_ISREF_P(varptr)) { + if (OP1_TYPE == IS_CV) { + Z_ADDREF_P(varptr); + } + zend_vm_stack_push(varptr TSRMLS_CC); + } else if (!Z_REFCOUNTED_P(varptr) || Z_REFCOUNT_P(varptr) == 1) { + ZVAL_NEW_REF(varptr, varptr); + if (OP1_TYPE == IS_CV) { + Z_ADDREF_P(varptr); + } + zend_vm_stack_push(varptr TSRMLS_CC); +#endif + } else { zval val; if ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ? @@ -3098,7 +3113,7 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR|CV, ANY) } FREE_OP1_IF_VAR(); zend_vm_stack_push(&val TSRMLS_CC); -//??? } + } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 3aa996951f..16cb547a7c 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -454,7 +454,7 @@ static int ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS) if (UNEXPECTED(EG(exception) != NULL)) { zend_throw_exception_internal(NULL TSRMLS_CC); - if (RETURN_VALUE_USED(opline) /*???&& EX_VAR(opline->result.var) */) { + if (RETURN_VALUE_USED(opline)) { zval_ptr_dtor(EX_VAR(opline->result.var)); } HANDLE_EXCEPTION_LEAVE(); @@ -642,7 +642,7 @@ static int ZEND_FASTCALL zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_AR if (UNEXPECTED(EG(exception) != NULL)) { zend_throw_exception_internal(NULL TSRMLS_CC); - if (RETURN_VALUE_USED(opline) /*???&& EX_T(opline->result.var).var.ptr*/) { + if (RETURN_VALUE_USED(opline)) { zval_ptr_dtor(EX_VAR(opline->result.var)); } HANDLE_EXCEPTION(); @@ -12817,15 +12817,30 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND } varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); -//??? if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) || -//??? EX_T(opline->op1.var).var.fcall_returned_reference) && -//??? (Z_ISREF_P(varptr) || Z_REFCOUNT_P(varptr) == 1)) { -//??? Z_SET_ISREF_P(varptr); -//??? if (IS_VAR == IS_CV) { -//??? Z_ADDREF_P(varptr); -//??? } -//??? zend_vm_stack_push(varptr TSRMLS_CC); -//??? } else { +//??? +#if 0 + if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) || + EX_T(opline->op1.var).var.fcall_returned_reference) && + (Z_ISREF_P(varptr) || Z_REFCOUNT_P(varptr) == 1)) { + Z_SET_ISREF_P(varptr); + if (IS_VAR == IS_CV) { + Z_ADDREF_P(varptr); + } + zend_vm_stack_push(varptr TSRMLS_CC); +#else + if (Z_ISREF_P(varptr)) { + if (IS_VAR == IS_CV) { + Z_ADDREF_P(varptr); + } + zend_vm_stack_push(varptr TSRMLS_CC); + } else if (!Z_REFCOUNTED_P(varptr) || Z_REFCOUNT_P(varptr) == 1) { + ZVAL_NEW_REF(varptr, varptr); + if (IS_VAR == IS_CV) { + Z_ADDREF_P(varptr); + } + zend_vm_stack_push(varptr TSRMLS_CC); +#endif + } else { zval val; if ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ? @@ -12839,7 +12854,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND } zval_ptr_dtor_nogc(free_op1.var); zend_vm_stack_push(&val TSRMLS_CC); -//??? } + } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -29930,15 +29945,30 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDL } varptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC); -//??? if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) || -//??? EX_T(opline->op1.var).var.fcall_returned_reference) && -//??? (Z_ISREF_P(varptr) || Z_REFCOUNT_P(varptr) == 1)) { -//??? Z_SET_ISREF_P(varptr); -//??? if (IS_CV == IS_CV) { -//??? Z_ADDREF_P(varptr); -//??? } -//??? zend_vm_stack_push(varptr TSRMLS_CC); -//??? } else { +//??? +#if 0 + if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) || + EX_T(opline->op1.var).var.fcall_returned_reference) && + (Z_ISREF_P(varptr) || Z_REFCOUNT_P(varptr) == 1)) { + Z_SET_ISREF_P(varptr); + if (IS_CV == IS_CV) { + Z_ADDREF_P(varptr); + } + zend_vm_stack_push(varptr TSRMLS_CC); +#else + if (Z_ISREF_P(varptr)) { + if (IS_CV == IS_CV) { + Z_ADDREF_P(varptr); + } + zend_vm_stack_push(varptr TSRMLS_CC); + } else if (!Z_REFCOUNTED_P(varptr) || Z_REFCOUNT_P(varptr) == 1) { + ZVAL_NEW_REF(varptr, varptr); + if (IS_CV == IS_CV) { + Z_ADDREF_P(varptr); + } + zend_vm_stack_push(varptr TSRMLS_CC); +#endif + } else { zval val; if ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ? @@ -29952,7 +29982,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDL } zend_vm_stack_push(&val TSRMLS_CC); -//??? } + } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } -- 2.40.0