@@ -3675,7 +3675,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3675
3675
if (opline -> op1_type == IS_VAR ) {
3676
3676
if (orig_op1_type != IS_UNKNOWN
3677
3677
&& (orig_op1_type & IS_TRACE_INDIRECT )) {
3678
- if (!zend_jit_fetch_indirect_var (& dasm_state , opline , orig_op1_type , & op1_info , & op1_addr )) {
3678
+ if (!zend_jit_fetch_indirect_var (& dasm_state , opline , orig_op1_type ,
3679
+ & op1_info , & op1_addr , !ssa -> var_info [ssa_op -> op1_use ].indirect_reference )) {
3679
3680
goto jit_failure ;
3680
3681
}
3681
3682
} else {
@@ -3714,7 +3715,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3714
3715
if (orig_op1_type != IS_UNKNOWN
3715
3716
&& (orig_op1_type & IS_TRACE_INDIRECT )
3716
3717
&& opline -> result_type == IS_UNUSED ) {
3717
- if (!zend_jit_fetch_indirect_var (& dasm_state , opline , orig_op1_type , & op1_info , & op1_addr )) {
3718
+ if (!zend_jit_fetch_indirect_var (& dasm_state , opline , orig_op1_type ,
3719
+ & op1_info , & op1_addr , !ssa -> var_info [ssa_op -> op1_use ].indirect_reference )) {
3718
3720
goto jit_failure ;
3719
3721
}
3720
3722
} else {
@@ -4361,7 +4363,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4361
4363
if (opline -> op1_type == IS_VAR ) {
4362
4364
if (orig_op1_type != IS_UNKNOWN
4363
4365
&& (orig_op1_type & IS_TRACE_INDIRECT )) {
4364
- if (!zend_jit_fetch_indirect_var (& dasm_state , opline , orig_op1_type , & op1_info , & op1_addr )) {
4366
+ if (!zend_jit_fetch_indirect_var (& dasm_state , opline , orig_op1_type ,
4367
+ & op1_info , & op1_addr , !ssa -> var_info [ssa_op -> op1_use ].indirect_reference )) {
4365
4368
goto jit_failure ;
4366
4369
}
4367
4370
} else {
@@ -4386,9 +4389,21 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4386
4389
op1_def_info = OP1_DEF_INFO ();
4387
4390
if (!zend_jit_fetch_dim (& dasm_state , opline ,
4388
4391
op1_info , op1_addr , op2_info , RES_REG_ADDR (),
4389
- zend_may_throw_ex (opline , ssa_op , op_array , ssa , op1_info , op2_info ))) {
4392
+ (opline -> opcode == ZEND_FETCH_DIM_RW
4393
+ || opline -> op2_type == IS_UNUSED
4394
+ || (op1_info & (MAY_BE_TRUE |MAY_BE_LONG |MAY_BE_DOUBLE |MAY_BE_STRING |MAY_BE_OBJECT |MAY_BE_RESOURCE |MAY_BE_REF ))
4395
+ || (op2_info & (MAY_BE_UNDEF |MAY_BE_RESOURCE |MAY_BE_ARRAY |MAY_BE_OBJECT ))
4396
+ || (opline -> op1_type == IS_VAR
4397
+ && (op1_info & MAY_BE_UNDEF )
4398
+ && !ssa -> var_info [ssa_op -> op1_use ].indirect_reference )))) {
4390
4399
goto jit_failure ;
4391
4400
}
4401
+ if (ssa_op -> result_def > 0
4402
+ && (opline -> opcode == ZEND_FETCH_DIM_W || opline -> opcode == ZEND_FETCH_LIST_W )
4403
+ && !(op1_info & (MAY_BE_TRUE |MAY_BE_LONG |MAY_BE_DOUBLE |MAY_BE_STRING |MAY_BE_OBJECT |MAY_BE_RESOURCE |MAY_BE_REF ))
4404
+ && !(op2_info & (MAY_BE_UNDEF |MAY_BE_RESOURCE |MAY_BE_ARRAY |MAY_BE_OBJECT ))) {
4405
+ ssa -> var_info [ssa_op -> result_def ].indirect_reference = 1 ;
4406
+ }
4392
4407
goto done ;
4393
4408
case ZEND_ISSET_ISEMPTY_DIM_OBJ :
4394
4409
if ((opline -> extended_value & ZEND_ISEMPTY )) {
@@ -4504,7 +4519,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4504
4519
if (orig_op1_type != IS_UNKNOWN
4505
4520
&& (orig_op1_type & IS_TRACE_INDIRECT )) {
4506
4521
op1_indirect = 1 ;
4507
- if (!zend_jit_fetch_indirect_var (& dasm_state , opline , orig_op1_type , & op1_info , & op1_addr )) {
4522
+ if (!zend_jit_fetch_indirect_var (& dasm_state , opline , orig_op1_type ,
4523
+ & op1_info , & op1_addr , !ssa -> var_info [ssa_op -> op1_use ].indirect_reference )) {
4508
4524
goto jit_failure ;
4509
4525
}
4510
4526
}
0 commit comments