@@ -11720,6 +11720,32 @@ static int zend_jit_rope(zend_jit_ctx *jit, const zend_op *opline, uint32_t op2_
11720
11720
return 1;
11721
11721
}
11722
11722
11723
+ static int zend_jit_zval_copy_deref_reg(zend_jit_ctx *jit, zend_jit_addr res_addr, uint32_t res_info, zend_jit_addr val_addr, ir_ref type, ir_ref *values)
11724
+ {
11725
+ ir_ref if_type, val;
11726
+
11727
+ if (res_info == MAY_BE_LONG) {
11728
+ if_type = ir_IF(ir_EQ(type, ir_CONST_U32(IS_LONG)));
11729
+ ir_IF_TRUE(if_type);
11730
+ val = jit_ZVAL_ADDR(jit, val_addr);
11731
+ ir_END_PHI_list(*values, val);
11732
+ ir_IF_FALSE(if_type);
11733
+ val = ir_ADD_OFFSET(jit_Z_PTR(jit, val_addr), offsetof(zend_reference, val));
11734
+ ir_END_PHI_list(*values, val);
11735
+ } else if (res_info == MAY_BE_DOUBLE) {
11736
+ if_type = ir_IF(ir_EQ(type, ir_CONST_U32(IS_DOUBLE)));
11737
+ ir_IF_TRUE(if_type);
11738
+ val = jit_ZVAL_ADDR(jit, val_addr);
11739
+ ir_END_PHI_list(*values, val);
11740
+ ir_IF_FALSE(if_type);
11741
+ val = ir_ADD_OFFSET(jit_Z_PTR(jit, val_addr), offsetof(zend_reference, val));
11742
+ ir_END_PHI_list(*values, val);
11743
+ } else {
11744
+ ZEND_UNREACHABLE();
11745
+ }
11746
+ return 1;
11747
+ }
11748
+
11723
11749
static int zend_jit_zval_copy_deref(zend_jit_ctx *jit, zend_jit_addr res_addr, zend_jit_addr val_addr, ir_ref type)
11724
11750
{
11725
11751
ir_ref if_refcounted, if_reference, if_refcounted2, ptr, val2, ptr2, type2;
@@ -14463,9 +14489,16 @@ static int zend_jit_fetch_obj(zend_jit_ctx *jit,
14463
14489
}
14464
14490
ir_END_list(end_inputs);
14465
14491
} else {
14466
- if (((res_info & MAY_BE_GUARD) && JIT_G(current_frame) && prop_info)
14467
- || Z_MODE(res_addr) == IS_REG) {
14492
+ if ((res_info & MAY_BE_GUARD) && JIT_G(current_frame) && prop_info) {
14468
14493
ir_END_PHI_list(end_values, jit_ZVAL_ADDR(jit, prop_addr));
14494
+ } else if ((res_info & MAY_BE_GUARD) && Z_MODE(res_addr) == IS_REG) {
14495
+ ir_END_PHI_list(end_values, jit_ZVAL_ADDR(jit, prop_addr));
14496
+ } else if (Z_MODE(res_addr) == IS_REG) {
14497
+ prop_type_ref = jit_Z_TYPE_INFO(jit, prop_addr);
14498
+
14499
+ if (!zend_jit_zval_copy_deref_reg(jit, res_addr, res_info & ~MAY_BE_GUARD, prop_addr, prop_type_ref, &end_values)) {
14500
+ return 0;
14501
+ }
14469
14502
} else {
14470
14503
prop_type_ref = jit_Z_TYPE_INFO(jit, prop_addr);
14471
14504
0 commit comments