Skip to content

Commit 95c73f9

Browse files
committed
Don't add num_additional_args in SEND opcodes
Now that trailing positional args are disallowed, num_additional_args will always be zero in SEND opcodes (and FUNC_ARG fetches).
1 parent d3b484d commit 95c73f9

File tree

3 files changed

+19
-34
lines changed

3 files changed

+19
-34
lines changed

Zend/zend_execute.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1686,7 +1686,7 @@ ZEND_API zend_execute_data *zend_create_execute_data_from_op_array(zend_op_array
16861686

16871687
static zend_always_inline zend_bool zend_is_by_ref_func_arg_fetch(zend_op *opline, call_slot *call TSRMLS_DC) /* {{{ */
16881688
{
1689-
zend_uint arg_num = (opline->extended_value & ZEND_FETCH_ARG_MASK) + call->num_additional_args;
1689+
zend_uint arg_num = opline->extended_value & ZEND_FETCH_ARG_MASK;
16901690
return ARG_SHOULD_BE_SENT_BY_REF(call->fbc, arg_num);
16911691
}
16921692
/* }}} */

Zend/zend_vm_def.h

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3063,9 +3063,8 @@ ZEND_VM_HANDLER(65, ZEND_SEND_VAL, CONST|TMP, ANY)
30633063

30643064
SAVE_OPLINE();
30653065
if (opline->extended_value == ZEND_DO_FCALL_BY_NAME) {
3066-
int arg_num = opline->op2.num + EX(call)->num_additional_args;
3067-
if (ARG_MUST_BE_SENT_BY_REF(EX(call)->fbc, arg_num)) {
3068-
zend_error_noreturn(E_ERROR, "Cannot pass parameter %d by reference", arg_num);
3066+
if (ARG_MUST_BE_SENT_BY_REF(EX(call)->fbc, opline->op2.num)) {
3067+
zend_error_noreturn(E_ERROR, "Cannot pass parameter %d by reference", opline->op2.num);
30693068
}
30703069
}
30713070

@@ -3126,16 +3125,14 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR|CV, ANY)
31263125
USE_OPLINE
31273126
zend_free_op free_op1;
31283127
zval *varptr;
3129-
int arg_num;
31303128

31313129
SAVE_OPLINE();
31323130
if (opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) { /* Had function_ptr at compile_time */
31333131
if (!(opline->extended_value & ZEND_ARG_SEND_BY_REF)) {
31343132
ZEND_VM_DISPATCH_TO_HELPER(zend_send_by_var_helper);
31353133
}
31363134
} else {
3137-
arg_num = opline->op2.num + EX(call)->num_additional_args;
3138-
if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, arg_num)) {
3135+
if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, opline->op2.num)) {
31393136
ZEND_VM_DISPATCH_TO_HELPER(zend_send_by_var_helper);
31403137
}
31413138
}
@@ -3155,7 +3152,7 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR|CV, ANY)
31553152

31563153
if ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ?
31573154
!(opline->extended_value & ZEND_ARG_SEND_SILENT) :
3158-
!ARG_MAY_BE_SENT_BY_REF(EX(call)->fbc, arg_num)) {
3155+
!ARG_MAY_BE_SENT_BY_REF(EX(call)->fbc, opline->op2.num)) {
31593156
zend_error(E_STRICT, "Only variables should be passed by reference");
31603157
}
31613158
ALLOC_ZVAL(valptr);
@@ -3193,8 +3190,7 @@ ZEND_VM_HANDLER(67, ZEND_SEND_REF, VAR|CV, ANY)
31933190

31943191
if (opline->extended_value == ZEND_DO_FCALL_BY_NAME &&
31953192
EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) {
3196-
int arg_num = opline->op2.num + EX(call)->num_additional_args;
3197-
if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, arg_num)) {
3193+
if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, opline->op2.num)) {
31983194
ZEND_VM_DISPATCH_TO_HELPER(zend_send_by_var_helper);
31993195
}
32003196
}
@@ -3214,8 +3210,7 @@ ZEND_VM_HANDLER(66, ZEND_SEND_VAR, VAR|CV, ANY)
32143210
USE_OPLINE
32153211

32163212
if (opline->extended_value == ZEND_DO_FCALL_BY_NAME) {
3217-
int arg_num = opline->op2.num + EX(call)->num_additional_args;
3218-
if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, arg_num)) {
3213+
if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, opline->op2.num)) {
32193214
ZEND_VM_DISPATCH_TO_HANDLER(ZEND_SEND_REF);
32203215
}
32213216
}

Zend/zend_vm_execute.h

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2736,9 +2736,8 @@ static int ZEND_FASTCALL ZEND_SEND_VAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
27362736

27372737
SAVE_OPLINE();
27382738
if (opline->extended_value == ZEND_DO_FCALL_BY_NAME) {
2739-
int arg_num = opline->op2.num + EX(call)->num_additional_args;
2740-
if (ARG_MUST_BE_SENT_BY_REF(EX(call)->fbc, arg_num)) {
2741-
zend_error_noreturn(E_ERROR, "Cannot pass parameter %d by reference", arg_num);
2739+
if (ARG_MUST_BE_SENT_BY_REF(EX(call)->fbc, opline->op2.num)) {
2740+
zend_error_noreturn(E_ERROR, "Cannot pass parameter %d by reference", opline->op2.num);
27422741
}
27432742
}
27442743

@@ -8094,9 +8093,8 @@ static int ZEND_FASTCALL ZEND_SEND_VAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
80948093

80958094
SAVE_OPLINE();
80968095
if (opline->extended_value == ZEND_DO_FCALL_BY_NAME) {
8097-
int arg_num = opline->op2.num + EX(call)->num_additional_args;
8098-
if (ARG_MUST_BE_SENT_BY_REF(EX(call)->fbc, arg_num)) {
8099-
zend_error_noreturn(E_ERROR, "Cannot pass parameter %d by reference", arg_num);
8096+
if (ARG_MUST_BE_SENT_BY_REF(EX(call)->fbc, opline->op2.num)) {
8097+
zend_error_noreturn(E_ERROR, "Cannot pass parameter %d by reference", opline->op2.num);
81008098
}
81018099
}
81028100

@@ -13385,16 +13383,14 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND
1338513383
USE_OPLINE
1338613384
zend_free_op free_op1;
1338713385
zval *varptr;
13388-
int arg_num;
1338913386

1339013387
SAVE_OPLINE();
1339113388
if (opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) { /* Had function_ptr at compile_time */
1339213389
if (!(opline->extended_value & ZEND_ARG_SEND_BY_REF)) {
1339313390
return zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1339413391
}
1339513392
} else {
13396-
arg_num = opline->op2.num + EX(call)->num_additional_args;
13397-
if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, arg_num)) {
13393+
if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, opline->op2.num)) {
1339813394
return zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1339913395
}
1340013396
}
@@ -13414,7 +13410,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND
1341413410

1341513411
if ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ?
1341613412
!(opline->extended_value & ZEND_ARG_SEND_SILENT) :
13417-
!ARG_MAY_BE_SENT_BY_REF(EX(call)->fbc, arg_num)) {
13413+
!ARG_MAY_BE_SENT_BY_REF(EX(call)->fbc, opline->op2.num)) {
1341813414
zend_error(E_STRICT, "Only variables should be passed by reference");
1341913415
}
1342013416
ALLOC_ZVAL(valptr);
@@ -13452,8 +13448,7 @@ static int ZEND_FASTCALL ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
1345213448

1345313449
if (opline->extended_value == ZEND_DO_FCALL_BY_NAME &&
1345413450
EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) {
13455-
int arg_num = opline->op2.num + EX(call)->num_additional_args;
13456-
if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, arg_num)) {
13451+
if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, opline->op2.num)) {
1345713452
return zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1345813453
}
1345913454
}
@@ -13473,8 +13468,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
1347313468
USE_OPLINE
1347413469

1347513470
if (opline->extended_value == ZEND_DO_FCALL_BY_NAME) {
13476-
int arg_num = opline->op2.num + EX(call)->num_additional_args;
13477-
if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, arg_num)) {
13471+
if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, opline->op2.num)) {
1347813472
return ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1347913473
}
1348013474
}
@@ -31000,16 +30994,14 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDL
3100030994
USE_OPLINE
3100130995

3100230996
zval *varptr;
31003-
int arg_num;
3100430997

3100530998
SAVE_OPLINE();
3100630999
if (opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) { /* Had function_ptr at compile_time */
3100731000
if (!(opline->extended_value & ZEND_ARG_SEND_BY_REF)) {
3100831001
return zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
3100931002
}
3101031003
} else {
31011-
arg_num = opline->op2.num + EX(call)->num_additional_args;
31012-
if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, arg_num)) {
31004+
if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, opline->op2.num)) {
3101331005
return zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
3101431006
}
3101531007
}
@@ -31029,7 +31021,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDL
3102931021

3103031022
if ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ?
3103131023
!(opline->extended_value & ZEND_ARG_SEND_SILENT) :
31032-
!ARG_MAY_BE_SENT_BY_REF(EX(call)->fbc, arg_num)) {
31024+
!ARG_MAY_BE_SENT_BY_REF(EX(call)->fbc, opline->op2.num)) {
3103331025
zend_error(E_STRICT, "Only variables should be passed by reference");
3103431026
}
3103531027
ALLOC_ZVAL(valptr);
@@ -31067,8 +31059,7 @@ static int ZEND_FASTCALL ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
3106731059

3106831060
if (opline->extended_value == ZEND_DO_FCALL_BY_NAME &&
3106931061
EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) {
31070-
int arg_num = opline->op2.num + EX(call)->num_additional_args;
31071-
if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, arg_num)) {
31062+
if (!ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, opline->op2.num)) {
3107231063
return zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
3107331064
}
3107431065
}
@@ -31087,8 +31078,7 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
3108731078
USE_OPLINE
3108831079

3108931080
if (opline->extended_value == ZEND_DO_FCALL_BY_NAME) {
31090-
int arg_num = opline->op2.num + EX(call)->num_additional_args;
31091-
if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, arg_num)) {
31081+
if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, opline->op2.num)) {
3109231082
return ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
3109331083
}
3109431084
}

0 commit comments

Comments
 (0)