@@ -10773,7 +10773,17 @@ static int zend_jit_fetch_obj_read(dasm_State **Dst, const zend_op *opline, cons
10773
10773
} else {
10774
10774
prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1a, offset);
10775
10775
| mov edx, dword [FCARG1a + offset + 8]
10776
- | IF_TYPE dl, IS_UNDEF, >5
10776
+ if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
10777
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, opline, NULL, ZEND_JIT_EXIT_TO_VM);
10778
+ const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
10779
+
10780
+ if (!exit_addr) {
10781
+ return 0;
10782
+ }
10783
+ | IF_TYPE dl, IS_UNDEF, &exit_addr
10784
+ } else {
10785
+ | IF_TYPE dl, IS_UNDEF, >5
10786
+ }
10777
10787
}
10778
10788
| GET_ZVAL_PTR r0, prop_addr
10779
10789
| IF_NOT_REFCOUNTED dh, >2
@@ -10791,26 +10801,29 @@ static int zend_jit_fetch_obj_read(dasm_State **Dst, const zend_op *opline, cons
10791
10801
| SET_ZVAL_TYPE_INFO res_addr, edx
10792
10802
10793
10803
|.cold_code
10794
- |5:
10795
- | LOAD_ADDR FCARG2a, member
10796
- |.if X64
10797
- | LOAD_ZVAL_ADDR CARG3, res_addr
10798
- | mov CARG4, (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS)
10799
- |.else
10800
- | sub r4, 8
10801
- | push (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS)
10802
- | PUSH_ZVAL_ADDR res_addr, r0
10803
- |.endif
10804
- | SAVE_VALID_OPLINE opline, r0
10805
- if (opline->opcode != ZEND_FETCH_OBJ_IS) {
10806
- | EXT_CALL zend_jit_fetch_obj_r_slow, r0
10807
- } else {
10808
- | EXT_CALL zend_jit_fetch_obj_is_slow, r0
10804
+
10805
+ if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE || offset == ZEND_WRONG_PROPERTY_OFFSET) {
10806
+ |5:
10807
+ | LOAD_ADDR FCARG2a, member
10808
+ |.if X64
10809
+ | LOAD_ZVAL_ADDR CARG3, res_addr
10810
+ | mov CARG4, (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS)
10811
+ |.else
10812
+ | sub r4, 8
10813
+ | push (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS)
10814
+ | PUSH_ZVAL_ADDR res_addr, r0
10815
+ |.endif
10816
+ | SAVE_VALID_OPLINE opline, r0
10817
+ if (opline->opcode != ZEND_FETCH_OBJ_IS) {
10818
+ | EXT_CALL zend_jit_fetch_obj_r_slow, r0
10819
+ } else {
10820
+ | EXT_CALL zend_jit_fetch_obj_is_slow, r0
10821
+ }
10822
+ |.if not(X64)
10823
+ | add r4, 8
10824
+ |.endif
10825
+ | jmp >9
10809
10826
}
10810
- |.if not(X64)
10811
- | add r4, 8
10812
- |.endif
10813
- | jmp >9
10814
10827
10815
10828
|6:
10816
10829
if (offset == ZEND_WRONG_PROPERTY_OFFSET) {
@@ -10822,7 +10835,7 @@ static int zend_jit_fetch_obj_read(dasm_State **Dst, const zend_op *opline, cons
10822
10835
| EXT_CALL zend_jit_zval_copy_deref_helper, r0
10823
10836
| jmp >9
10824
10837
10825
- if ((op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)- MAY_BE_OBJECT)) && JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE) {
10838
+ if ((op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)- MAY_BE_OBJECT)) && JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE) {
10826
10839
|7:
10827
10840
if (opline->opcode != ZEND_FETCH_OBJ_IS) {
10828
10841
| SAVE_VALID_OPLINE opline, r1
@@ -10875,6 +10888,13 @@ static int zend_jit_fetch_obj_read(dasm_State **Dst, const zend_op *opline, cons
10875
10888
|9: // END
10876
10889
| FREE_OP opline->op1_type, opline->op1, op1_info, 1, op_array, opline
10877
10890
10891
+ if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE
10892
+ && offset != ZEND_WRONG_PROPERTY_OFFSET
10893
+ && opline->op1_type != IS_VAR
10894
+ && opline->op1_type != IS_TMP_VAR) {
10895
+ may_throw = 0;
10896
+ }
10897
+
10878
10898
if (may_throw) {
10879
10899
if (!zend_jit_check_exception(Dst)) {
10880
10900
return 0;
0 commit comments