From 73958ca62d3483c46e10a20f5690fe8c8103baad Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 18 Apr 2016 22:45:38 +0200 Subject: [PATCH] Fix SEND_USER as well Missed copy&paste code here --- .../call_user_func_array_prefer_ref.phpt | 26 +++++++++++++++++++ Zend/zend_vm_def.h | 9 +------ Zend/zend_vm_execute.h | 18 ++----------- 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/Zend/tests/call_user_func_array_prefer_ref.phpt b/Zend/tests/call_user_func_array_prefer_ref.phpt index 9c1d822d69..d7a5fd913a 100644 --- a/Zend/tests/call_user_func_array_prefer_ref.phpt +++ b/Zend/tests/call_user_func_array_prefer_ref.phpt @@ -10,6 +10,11 @@ namespace { call_user_func_array('array_multisort', $args); var_dump($args); unset($args); + + $array = [3, 2, 1]; + call_user_func('array_multisort', $array); + var_dump($array); + unset($array); } namespace Foo { @@ -19,6 +24,11 @@ namespace Foo { call_user_func_array('array_multisort', $args); var_dump($args); unset($args); + + $array = [3, 2, 1]; + call_user_func('array_multisort', $array); + var_dump($array); + unset($array); } ?> @@ -34,6 +44,14 @@ array(1) { int(1) } } +array(3) { + [0]=> + int(3) + [1]=> + int(2) + [2]=> + int(1) +} array(1) { [0]=> array(3) { @@ -45,3 +63,11 @@ array(1) { int(1) } } +array(3) { + [0]=> + int(3) + [1]=> + int(2) + [2]=> + int(1) +} diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 6ca584d69f..1b1137df83 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -4655,7 +4655,6 @@ ZEND_VM_HANDLER(120, ZEND_SEND_USER, VAR|CV, ANY) if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) { if (UNEXPECTED(!Z_ISREF_P(arg))) { - if (!ARG_MAY_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) { zend_error(E_WARNING, "Parameter %d to %s%s%s() expected to be a reference, value given", @@ -4678,21 +4677,15 @@ ZEND_VM_HANDLER(120, ZEND_SEND_USER, VAR|CV, ANY) FREE_OP1(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } - - ZVAL_NEW_REF(arg, arg); } - Z_ADDREF_P(arg); } else { if (Z_ISREF_P(arg) && !(EX(call)->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) { /* don't separate references for __call */ arg = Z_REFVAL_P(arg); } - if (Z_OPT_REFCOUNTED_P(arg)) { - Z_ADDREF_P(arg); - } } - ZVAL_COPY_VALUE(param, arg); + ZVAL_COPY(param, arg); FREE_OP1(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 90c3d0fa19..98fa5e5e72 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -15331,7 +15331,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_VAR_HANDLER(ZEN if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) { if (UNEXPECTED(!Z_ISREF_P(arg))) { - if (!ARG_MAY_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) { zend_error(E_WARNING, "Parameter %d to %s%s%s() expected to be a reference, value given", @@ -15354,21 +15353,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_VAR_HANDLER(ZEN zval_ptr_dtor_nogc(free_op1); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } - - ZVAL_NEW_REF(arg, arg); } - Z_ADDREF_P(arg); } else { if (Z_ISREF_P(arg) && !(EX(call)->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) { /* don't separate references for __call */ arg = Z_REFVAL_P(arg); } - if (Z_OPT_REFCOUNTED_P(arg)) { - Z_ADDREF_P(arg); - } } - ZVAL_COPY_VALUE(param, arg); + ZVAL_COPY(param, arg); zval_ptr_dtor_nogc(free_op1); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -28945,7 +28938,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_CV_HANDLER(ZEND if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) { if (UNEXPECTED(!Z_ISREF_P(arg))) { - if (!ARG_MAY_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) { zend_error(E_WARNING, "Parameter %d to %s%s%s() expected to be a reference, value given", @@ -28967,21 +28959,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_CV_HANDLER(ZEND ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } - - ZVAL_NEW_REF(arg, arg); } - Z_ADDREF_P(arg); } else { if (Z_ISREF_P(arg) && !(EX(call)->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) { /* don't separate references for __call */ arg = Z_REFVAL_P(arg); } - if (Z_OPT_REFCOUNTED_P(arg)) { - Z_ADDREF_P(arg); - } } - ZVAL_COPY_VALUE(param, arg); + ZVAL_COPY(param, arg); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -- 2.40.0