Skip to content

Commit 92f808b

Browse files
committed
Merge branch 'PHP-8.0' into PHP-8.1
* PHP-8.0: Fix SEND_USER with ref arg
2 parents 8ffce43 + 01453a0 commit 92f808b

File tree

4 files changed

+47
-19
lines changed

4 files changed

+47
-19
lines changed

Zend/tests/call_user_func_by_ref.phpt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
--TEST--
2+
call_user_func() with ref arg and type check
3+
--FILE--
4+
<?php
5+
6+
function test(Type &$ref) {
7+
}
8+
try {
9+
call_user_func('test', 0);
10+
} catch (TypeError $e) {
11+
echo $e->getMessage(), "\n";
12+
}
13+
14+
?>
15+
--EXPECTF--
16+
Warning: test(): Argument #1 ($ref) must be passed by reference, value given in %s on line %d
17+
test(): Argument #1 ($ref) must be of type Type, int given, called in %s on line %d

Zend/tests/closure_invoke_ref_warning.phpt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,3 @@ call_user_func([$test, '__invoke'], null);
99
?>
1010
--EXPECTF--
1111
Warning: Closure::__invoke(): Argument #1 ($arg) must be passed by reference, value given in %s on line %d
12-
13-
Warning: {closure}(): Argument #1 ($arg) must be passed by reference, value given in %s on line %d

Zend/zend_vm_def.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5358,13 +5358,16 @@ ZEND_VM_HANDLER(120, ZEND_SEND_USER, CONST|TMP|VAR|CV, NUM)
53585358

53595359
SAVE_OPLINE();
53605360

5361+
arg = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
5362+
param = ZEND_CALL_VAR(EX(call), opline->result.var);
53615363
if (UNEXPECTED(ARG_MUST_BE_SENT_BY_REF(EX(call)->func, opline->op2.num))) {
53625364
zend_param_must_be_ref(EX(call)->func, opline->op2.num);
5365+
Z_TRY_ADDREF_P(arg);
5366+
ZVAL_NEW_REF(param, arg);
5367+
} else {
5368+
ZVAL_COPY(param, arg);
53635369
}
53645370

5365-
arg = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
5366-
param = ZEND_CALL_VAR(EX(call), opline->result.var);
5367-
ZVAL_COPY(param, arg);
53685371
FREE_OP1();
53695372
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
53705373
}

Zend/zend_vm_execute.h

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4621,14 +4621,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_CONST_HANDLER(Z
46214621

46224622
SAVE_OPLINE();
46234623

4624+
arg = RT_CONSTANT(opline, opline->op1);
4625+
param = ZEND_CALL_VAR(EX(call), opline->result.var);
46244626
if (UNEXPECTED(ARG_MUST_BE_SENT_BY_REF(EX(call)->func, opline->op2.num))) {
46254627
zend_param_must_be_ref(EX(call)->func, opline->op2.num);
4628+
Z_TRY_ADDREF_P(arg);
4629+
ZVAL_NEW_REF(param, arg);
4630+
} else {
4631+
ZVAL_COPY(param, arg);
46264632
}
46274633

4628-
arg = RT_CONSTANT(opline, opline->op1);
4629-
param = ZEND_CALL_VAR(EX(call), opline->result.var);
4630-
ZVAL_COPY(param, arg);
4631-
46324634
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
46334635
}
46344636

@@ -18940,13 +18942,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_TMP_HANDLER(ZEN
1894018942

1894118943
SAVE_OPLINE();
1894218944

18945+
arg = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
18946+
param = ZEND_CALL_VAR(EX(call), opline->result.var);
1894318947
if (UNEXPECTED(ARG_MUST_BE_SENT_BY_REF(EX(call)->func, opline->op2.num))) {
1894418948
zend_param_must_be_ref(EX(call)->func, opline->op2.num);
18949+
Z_TRY_ADDREF_P(arg);
18950+
ZVAL_NEW_REF(param, arg);
18951+
} else {
18952+
ZVAL_COPY(param, arg);
1894518953
}
1894618954

18947-
arg = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
18948-
param = ZEND_CALL_VAR(EX(call), opline->result.var);
18949-
ZVAL_COPY(param, arg);
1895018955
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
1895118956
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
1895218957
}
@@ -21554,13 +21559,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_VAR_HANDLER(ZEN
2155421559

2155521560
SAVE_OPLINE();
2155621561

21562+
arg = _get_zval_ptr_var_deref(opline->op1.var EXECUTE_DATA_CC);
21563+
param = ZEND_CALL_VAR(EX(call), opline->result.var);
2155721564
if (UNEXPECTED(ARG_MUST_BE_SENT_BY_REF(EX(call)->func, opline->op2.num))) {
2155821565
zend_param_must_be_ref(EX(call)->func, opline->op2.num);
21566+
Z_TRY_ADDREF_P(arg);
21567+
ZVAL_NEW_REF(param, arg);
21568+
} else {
21569+
ZVAL_COPY(param, arg);
2155921570
}
2156021571

21561-
arg = _get_zval_ptr_var_deref(opline->op1.var EXECUTE_DATA_CC);
21562-
param = ZEND_CALL_VAR(EX(call), opline->result.var);
21563-
ZVAL_COPY(param, arg);
2156421572
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
2156521573
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
2156621574
}
@@ -37850,14 +37858,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_CV_HANDLER(ZEND
3785037858

3785137859
SAVE_OPLINE();
3785237860

37861+
arg = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
37862+
param = ZEND_CALL_VAR(EX(call), opline->result.var);
3785337863
if (UNEXPECTED(ARG_MUST_BE_SENT_BY_REF(EX(call)->func, opline->op2.num))) {
3785437864
zend_param_must_be_ref(EX(call)->func, opline->op2.num);
37865+
Z_TRY_ADDREF_P(arg);
37866+
ZVAL_NEW_REF(param, arg);
37867+
} else {
37868+
ZVAL_COPY(param, arg);
3785537869
}
3785637870

37857-
arg = _get_zval_ptr_cv_deref_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
37858-
param = ZEND_CALL_VAR(EX(call), opline->result.var);
37859-
ZVAL_COPY(param, arg);
37860-
3786137871
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
3786237872
}
3786337873

0 commit comments

Comments
 (0)