File tree Expand file tree Collapse file tree 2 files changed +24
-4
lines changed Expand file tree Collapse file tree 2 files changed +24
-4
lines changed Original file line number Diff line number Diff line change @@ -41,9 +41,12 @@ typedef struct _zend_observer_fcall_handlers {
41
41
zend_observer_fcall_end_handler end ;
42
42
} zend_observer_fcall_handlers ;
43
43
44
+
45
+ #define ZEND_OBSERVER_HANDLE (function ) (ZEND_USER_CODE((function)->type) \
46
+ ? zend_observer_fcall_op_array_extension : zend_observer_fcall_internal_function_extension)
47
+
44
48
#define ZEND_OBSERVER_DATA (function ) \
45
- ZEND_OP_ARRAY_EXTENSION((&(function)->common), ZEND_USER_CODE((function)->type) \
46
- ? zend_observer_fcall_op_array_extension : zend_observer_fcall_internal_function_extension)
49
+ ((zend_observer_fcall_begin_handler *)&ZEND_OP_ARRAY_EXTENSION((&(function)->common), ZEND_OBSERVER_HANDLE(function)))
47
50
48
51
#define ZEND_OBSERVER_NONE_OBSERVED ((void *) 3) // Neither begin nor end handler present
49
52
@@ -99,7 +102,7 @@ static zend_always_inline bool zend_observer_fcall_has_no_observers(zend_execute
99
102
return true;
100
103
}
101
104
102
- * handler = (zend_observer_fcall_begin_handler * )ZEND_MAP_PTR_GET (runtime_cache ) + zend_observer_fcall_op_array_extension ;
105
+ * handler = (zend_observer_fcall_begin_handler * )ZEND_MAP_PTR_GET (runtime_cache ) + ZEND_OBSERVER_HANDLE ( function ) ;
103
106
return zend_observer_handler_is_unobserved (* handler );
104
107
}
105
108
Original file line number Diff line number Diff line change @@ -4521,7 +4521,24 @@ static struct jit_observer_fcall_is_unobserved_data jit_observer_fcall_is_unobse
4521
4521
run_time_cache = ir_PHI_2(IR_ADDR, run_time_cache, run_time_cache2);
4522
4522
}
4523
4523
}
4524
- *observer_handler = ir_ADD_OFFSET(run_time_cache, zend_observer_fcall_op_array_extension * sizeof(void *));
4524
+ if (func) {
4525
+ *observer_handler = ir_ADD_OFFSET(run_time_cache, ZEND_OBSERVER_HANDLE(func) * sizeof(void *));
4526
+ } else {
4527
+ // JIT: if (ZEND_USER_CODE(func->type)) {
4528
+ ir_ref tmp = ir_LOAD_U8(ir_ADD_OFFSET(func_ref, offsetof(zend_function, type)));
4529
+ ir_ref if_internal_func = ir_IF(ir_AND_U8(tmp, ir_CONST_U8(1)));
4530
+ ir_IF_TRUE(if_internal_func);
4531
+
4532
+ ir_ref observer_handler_internal = ir_ADD_OFFSET(run_time_cache, zend_observer_fcall_internal_function_extension * sizeof(void *));
4533
+
4534
+ ir_ref if_internal_func_end = ir_END();
4535
+ ir_IF_FALSE(if_internal_func);
4536
+
4537
+ ir_ref observer_handler_user = ir_ADD_OFFSET(run_time_cache, zend_observer_fcall_op_array_extension * sizeof(void *));
4538
+
4539
+ ir_MERGE_WITH(if_internal_func_end);
4540
+ *observer_handler = ir_PHI_2(IR_ADDR, observer_handler_internal, observer_handler_user);
4541
+ }
4525
4542
4526
4543
data.if_unobserved = ir_IF(ir_EQ(ir_LOAD_A(*observer_handler), ir_CONST_ADDR(ZEND_OBSERVER_NONE_OBSERVED)));
4527
4544
ir_IF_FALSE(data.if_unobserved);
You can’t perform that action at this time.
0 commit comments