@@ -14291,6 +14291,29 @@ static int zend_jit_fetch_obj(zend_jit_ctx *jit,
14291
14291
}
14292
14292
}
14293
14293
} else {
14294
+ /* Child classes may add hooks to property. */
14295
+ if (ce_is_instanceof && !(prop_info->flags & ZEND_ACC_FINAL)) {
14296
+ int prop_info_offset =
14297
+ (((prop_info->offset - (sizeof(zend_object) - sizeof(zval))) / sizeof(zval)) * sizeof(void*));
14298
+ ir_ref prop_info_ref = ir_LOAD_A(ir_ADD_OFFSET(obj_ref, offsetof(zend_object, ce)));
14299
+ prop_info_ref = ir_LOAD_A(ir_ADD_OFFSET(prop_info_ref, offsetof(zend_class_entry, properties_info_table)));
14300
+ prop_info_ref = ir_LOAD_A(ir_ADD_OFFSET(prop_info_ref, prop_info_offset));
14301
+ ir_ref is_same_prop_info = ir_EQ(prop_info_ref, ir_CONST_ADDR(prop_info));
14302
+ if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
14303
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
14304
+ const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
14305
+ if (!exit_addr) {
14306
+ return 0;
14307
+ }
14308
+ ir_GUARD(is_same_prop_info, ir_CONST_ADDR(exit_addr));
14309
+ } else {
14310
+ ir_ref if_same_prop_info = ir_IF(is_same_prop_info);
14311
+ ir_IF_FALSE_cold(if_same_prop_info);
14312
+ ir_END_list(slow_inputs);
14313
+ ir_IF_TRUE(if_same_prop_info);
14314
+ }
14315
+ }
14316
+
14294
14317
prop_ref = ir_ADD_OFFSET(obj_ref, prop_info->offset);
14295
14318
prop_addr = ZEND_ADDR_REF_ZVAL(prop_ref);
14296
14319
if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
@@ -14435,7 +14458,7 @@ static int zend_jit_fetch_obj(zend_jit_ctx *jit,
14435
14458
SET_STACK_REG(JIT_G(current_frame)->stack, EX_VAR_TO_NUM(opline->op1.var), ZREG_NONE);
14436
14459
}
14437
14460
14438
- if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE || !prop_info ) {
14461
+ if (slow_inputs ) {
14439
14462
ir_MERGE_list(slow_inputs);
14440
14463
jit_SET_EX_OPLINE(jit, opline);
14441
14464
0 commit comments