Skip to content

Commit 5ca4113

Browse files
committed
Fix abstract trace consisency for FE_FETCH instruction
1 parent 33375e9 commit 5ca4113

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

ext/opcache/jit/zend_jit_x86.dasc

+11-5
Original file line numberDiff line numberDiff line change
@@ -3640,10 +3640,6 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra
36403640
break;
36413641
case ZEND_FE_FETCH_R:
36423642
case ZEND_FE_FETCH_RW:
3643-
if (opline->op2_type == IS_CV) {
3644-
old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->op2.var));
3645-
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var), IS_UNKNOWN, 1);
3646-
}
36473643
exit_opline = (trace->opline == opline + 1) ?
36483644
ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value) :
36493645
opline + 1;
@@ -3652,6 +3648,16 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra
36523648
}
36533649
}
36543650

3651+
switch (opline->opcode) {
3652+
case ZEND_FE_FETCH_R:
3653+
case ZEND_FE_FETCH_RW:
3654+
if (opline->op2_type != IS_UNUSED) {
3655+
old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->op2.var));
3656+
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var), IS_UNKNOWN, 1);
3657+
}
3658+
break;
3659+
}
3660+
36553661
if (opline->result_type == IS_VAR || opline->result_type == IS_TMP_VAR) {
36563662
old_res_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var));
36573663
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_UNKNOWN, 1);
@@ -3665,7 +3671,7 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra
36653671
switch (opline->opcode) {
36663672
case ZEND_FE_FETCH_R:
36673673
case ZEND_FE_FETCH_RW:
3668-
if (opline->op2_type == IS_CV) {
3674+
if (opline->op2_type != IS_UNUSED) {
36693675
SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op2.var), old_info);
36703676
}
36713677
break;

0 commit comments

Comments
 (0)