Skip to content

Commit da28a6b

Browse files
committed
Merge branch 'PHP-8.0' into PHP-8.1
* PHP-8.0: Fix abstract trace consisency for FE_FETCH instruction
2 parents 48ae3a0 + 5ca4113 commit da28a6b

File tree

2 files changed

+22
-10
lines changed

2 files changed

+22
-10
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3340,10 +3340,6 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra
33403340
break;
33413341
case ZEND_FE_FETCH_R:
33423342
case ZEND_FE_FETCH_RW:
3343-
if (opline->op2_type == IS_CV) {
3344-
old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->op2.var));
3345-
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var), IS_UNKNOWN, 1);
3346-
}
33473343
exit_opline = (trace->opline == opline + 1) ?
33483344
ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value) :
33493345
opline + 1;
@@ -3352,6 +3348,16 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra
33523348
}
33533349
}
33543350

3351+
switch (opline->opcode) {
3352+
case ZEND_FE_FETCH_R:
3353+
case ZEND_FE_FETCH_RW:
3354+
if (opline->op2_type != IS_UNUSED) {
3355+
old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->op2.var));
3356+
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var), IS_UNKNOWN, 1);
3357+
}
3358+
break;
3359+
}
3360+
33553361
if (opline->result_type == IS_VAR || opline->result_type == IS_TMP_VAR) {
33563362
old_res_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var));
33573363
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_UNKNOWN, 1);
@@ -3365,7 +3371,7 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra
33653371
switch (opline->opcode) {
33663372
case ZEND_FE_FETCH_R:
33673373
case ZEND_FE_FETCH_RW:
3368-
if (opline->op2_type == IS_CV) {
3374+
if (opline->op2_type != IS_UNUSED) {
33693375
SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op2.var), old_info);
33703376
}
33713377
break;

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3674,10 +3674,6 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra
36743674
break;
36753675
case ZEND_FE_FETCH_R:
36763676
case ZEND_FE_FETCH_RW:
3677-
if (opline->op2_type == IS_CV) {
3678-
old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->op2.var));
3679-
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var), IS_UNKNOWN, 1);
3680-
}
36813677
exit_opline = (trace->opline == opline + 1) ?
36823678
ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value) :
36833679
opline + 1;
@@ -3686,6 +3682,16 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra
36863682
}
36873683
}
36883684

3685+
switch (opline->opcode) {
3686+
case ZEND_FE_FETCH_R:
3687+
case ZEND_FE_FETCH_RW:
3688+
if (opline->op2_type != IS_UNUSED) {
3689+
old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->op2.var));
3690+
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var), IS_UNKNOWN, 1);
3691+
}
3692+
break;
3693+
}
3694+
36893695
if (opline->result_type == IS_VAR || opline->result_type == IS_TMP_VAR) {
36903696
old_res_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var));
36913697
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_UNKNOWN, 1);
@@ -3699,7 +3705,7 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra
36993705
switch (opline->opcode) {
37003706
case ZEND_FE_FETCH_R:
37013707
case ZEND_FE_FETCH_RW:
3702-
if (opline->op2_type == IS_CV) {
3708+
if (opline->op2_type != IS_UNUSED) {
37033709
SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op2.var), old_info);
37043710
}
37053711
break;

0 commit comments

Comments
 (0)