Skip to content

Commit 73958ca

Browse files
committed
Fix SEND_USER as well
Missed copy&paste code here
1 parent a879215 commit 73958ca

File tree

3 files changed

+29
-24
lines changed

3 files changed

+29
-24
lines changed

Zend/tests/call_user_func_array_prefer_ref.phpt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ namespace {
1010
call_user_func_array('array_multisort', $args);
1111
var_dump($args);
1212
unset($args);
13+
14+
$array = [3, 2, 1];
15+
call_user_func('array_multisort', $array);
16+
var_dump($array);
17+
unset($array);
1318
}
1419

1520
namespace Foo {
@@ -19,6 +24,11 @@ namespace Foo {
1924
call_user_func_array('array_multisort', $args);
2025
var_dump($args);
2126
unset($args);
27+
28+
$array = [3, 2, 1];
29+
call_user_func('array_multisort', $array);
30+
var_dump($array);
31+
unset($array);
2232
}
2333

2434
?>
@@ -34,6 +44,14 @@ array(1) {
3444
int(1)
3545
}
3646
}
47+
array(3) {
48+
[0]=>
49+
int(3)
50+
[1]=>
51+
int(2)
52+
[2]=>
53+
int(1)
54+
}
3755
array(1) {
3856
[0]=>
3957
array(3) {
@@ -45,3 +63,11 @@ array(1) {
4563
int(1)
4664
}
4765
}
66+
array(3) {
67+
[0]=>
68+
int(3)
69+
[1]=>
70+
int(2)
71+
[2]=>
72+
int(1)
73+
}

Zend/zend_vm_def.h

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4655,7 +4655,6 @@ ZEND_VM_HANDLER(120, ZEND_SEND_USER, VAR|CV, ANY)
46554655

46564656
if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
46574657
if (UNEXPECTED(!Z_ISREF_P(arg))) {
4658-
46594658
if (!ARG_MAY_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
46604659

46614660
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)
46784677
FREE_OP1();
46794678
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
46804679
}
4681-
4682-
ZVAL_NEW_REF(arg, arg);
46834680
}
4684-
Z_ADDREF_P(arg);
46854681
} else {
46864682
if (Z_ISREF_P(arg) &&
46874683
!(EX(call)->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) {
46884684
/* don't separate references for __call */
46894685
arg = Z_REFVAL_P(arg);
46904686
}
4691-
if (Z_OPT_REFCOUNTED_P(arg)) {
4692-
Z_ADDREF_P(arg);
4693-
}
46944687
}
4695-
ZVAL_COPY_VALUE(param, arg);
4688+
ZVAL_COPY(param, arg);
46964689

46974690
FREE_OP1();
46984691
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();

Zend/zend_vm_execute.h

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15331,7 +15331,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_VAR_HANDLER(ZEN
1533115331

1533215332
if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
1533315333
if (UNEXPECTED(!Z_ISREF_P(arg))) {
15334-
1533515334
if (!ARG_MAY_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
1533615335

1533715336
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
1535415353
zval_ptr_dtor_nogc(free_op1);
1535515354
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
1535615355
}
15357-
15358-
ZVAL_NEW_REF(arg, arg);
1535915356
}
15360-
Z_ADDREF_P(arg);
1536115357
} else {
1536215358
if (Z_ISREF_P(arg) &&
1536315359
!(EX(call)->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) {
1536415360
/* don't separate references for __call */
1536515361
arg = Z_REFVAL_P(arg);
1536615362
}
15367-
if (Z_OPT_REFCOUNTED_P(arg)) {
15368-
Z_ADDREF_P(arg);
15369-
}
1537015363
}
15371-
ZVAL_COPY_VALUE(param, arg);
15364+
ZVAL_COPY(param, arg);
1537215365

1537315366
zval_ptr_dtor_nogc(free_op1);
1537415367
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -28945,7 +28938,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_CV_HANDLER(ZEND
2894528938

2894628939
if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
2894728940
if (UNEXPECTED(!Z_ISREF_P(arg))) {
28948-
2894928941
if (!ARG_MAY_BE_SENT_BY_REF(EX(call)->func, opline->op2.num)) {
2895028942

2895128943
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
2896728959

2896828960
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
2896928961
}
28970-
28971-
ZVAL_NEW_REF(arg, arg);
2897228962
}
28973-
Z_ADDREF_P(arg);
2897428963
} else {
2897528964
if (Z_ISREF_P(arg) &&
2897628965
!(EX(call)->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) {
2897728966
/* don't separate references for __call */
2897828967
arg = Z_REFVAL_P(arg);
2897928968
}
28980-
if (Z_OPT_REFCOUNTED_P(arg)) {
28981-
Z_ADDREF_P(arg);
28982-
}
2898328969
}
28984-
ZVAL_COPY_VALUE(param, arg);
28970+
ZVAL_COPY(param, arg);
2898528971

2898628972
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
2898728973
}

0 commit comments

Comments
 (0)