23
23
#include "zend_llist.h"
24
24
#include "zend_vm.h"
25
25
26
- #define ZEND_OBSERVER_DATA (op_array ) \
27
- ZEND_OP_ARRAY_EXTENSION(op_array , zend_observer_fcall_op_array_extension)
26
+ #define ZEND_OBSERVER_DATA (function ) \
27
+ ZEND_OP_ARRAY_EXTENSION((&(function)->common) , zend_observer_fcall_op_array_extension)
28
28
29
29
#define ZEND_OBSERVER_NOT_OBSERVED ((void *) 2)
30
30
31
- #define ZEND_OBSERVABLE_FN (fn_flags ) \
32
- (!( fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE))
31
+ #define ZEND_OBSERVABLE_FN (function ) \
32
+ (ZEND_MAP_PTR(function->common.run_time_cache) && !(function->common. fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE))
33
33
34
34
zend_llist zend_observers_fcall_list ;
35
35
zend_llist zend_observer_error_callbacks ;
@@ -100,12 +100,9 @@ static void zend_observer_fcall_install(zend_execute_data *execute_data)
100
100
{
101
101
zend_llist * list = & zend_observers_fcall_list ;
102
102
zend_function * function = execute_data -> func ;
103
- zend_op_array * op_array = & function -> op_array ;
104
103
105
- ZEND_ASSERT (function -> type != ZEND_INTERNAL_FUNCTION );
106
-
107
- ZEND_ASSERT (RUN_TIME_CACHE (op_array ));
108
- zend_observer_fcall_begin_handler * begin_handlers = (zend_observer_fcall_begin_handler * )& ZEND_OBSERVER_DATA (op_array );
104
+ ZEND_ASSERT (RUN_TIME_CACHE (& function -> common ));
105
+ zend_observer_fcall_begin_handler * begin_handlers = (zend_observer_fcall_begin_handler * )& ZEND_OBSERVER_DATA (function );
109
106
zend_observer_fcall_end_handler * end_handlers = (zend_observer_fcall_end_handler * )begin_handlers + list -> count , * end_handlers_start = end_handlers ;
110
107
111
108
* begin_handlers = ZEND_OBSERVER_NOT_OBSERVED ;
@@ -152,9 +149,9 @@ static bool zend_observer_remove_handler(void **first_handler, void *old_handler
152
149
return false;
153
150
}
154
151
155
- ZEND_API void zend_observer_add_begin_handler (zend_op_array * op_array , zend_observer_fcall_begin_handler begin ) {
152
+ ZEND_API void zend_observer_add_begin_handler (zend_function * function , zend_observer_fcall_begin_handler begin ) {
156
153
size_t registered_observers = zend_observers_fcall_list .count ;
157
- zend_observer_fcall_begin_handler * first_handler = (void * )& ZEND_OBSERVER_DATA (op_array ), * last_handler = first_handler + registered_observers - 1 ;
154
+ zend_observer_fcall_begin_handler * first_handler = (void * )& ZEND_OBSERVER_DATA (function ), * last_handler = first_handler + registered_observers - 1 ;
158
155
if (* first_handler == ZEND_OBSERVER_NOT_OBSERVED ) {
159
156
* first_handler = begin ;
160
157
} else {
@@ -169,13 +166,13 @@ ZEND_API void zend_observer_add_begin_handler(zend_op_array *op_array, zend_obse
169
166
}
170
167
}
171
168
172
- ZEND_API bool zend_observer_remove_begin_handler (zend_op_array * op_array , zend_observer_fcall_begin_handler begin ) {
173
- return zend_observer_remove_handler ((void * * )& ZEND_OBSERVER_DATA (op_array ), begin );
169
+ ZEND_API bool zend_observer_remove_begin_handler (zend_function * function , zend_observer_fcall_begin_handler begin ) {
170
+ return zend_observer_remove_handler ((void * * )& ZEND_OBSERVER_DATA (function ), begin );
174
171
}
175
172
176
- ZEND_API void zend_observer_add_end_handler (zend_op_array * op_array , zend_observer_fcall_end_handler end ) {
173
+ ZEND_API void zend_observer_add_end_handler (zend_function * function , zend_observer_fcall_end_handler end ) {
177
174
size_t registered_observers = zend_observers_fcall_list .count ;
178
- zend_observer_fcall_end_handler * end_handler = (zend_observer_fcall_end_handler * )& ZEND_OBSERVER_DATA (op_array ) + registered_observers ;
175
+ zend_observer_fcall_end_handler * end_handler = (zend_observer_fcall_end_handler * )& ZEND_OBSERVER_DATA (function ) + registered_observers ;
179
176
// to allow to preserve the invariant that end handlers are in reverse order of begin handlers, push the new end handler in front
180
177
if (* end_handler != ZEND_OBSERVER_NOT_OBSERVED ) {
181
178
// there's no space for new handlers, then it's forbidden to call this function
@@ -185,9 +182,9 @@ ZEND_API void zend_observer_add_end_handler(zend_op_array *op_array, zend_observ
185
182
* end_handler = end ;
186
183
}
187
184
188
- ZEND_API bool zend_observer_remove_end_handler (zend_op_array * op_array , zend_observer_fcall_end_handler end ) {
185
+ ZEND_API bool zend_observer_remove_end_handler (zend_function * function , zend_observer_fcall_end_handler end ) {
189
186
size_t registered_observers = zend_observers_fcall_list .count ;
190
- return zend_observer_remove_handler ((void * * )& ZEND_OBSERVER_DATA (op_array ) + registered_observers , end );
187
+ return zend_observer_remove_handler ((void * * )& ZEND_OBSERVER_DATA (function ) + registered_observers , end );
191
188
}
192
189
193
190
static void ZEND_FASTCALL _zend_observe_fcall_begin (zend_execute_data * execute_data )
@@ -196,14 +193,13 @@ static void ZEND_FASTCALL _zend_observe_fcall_begin(zend_execute_data *execute_d
196
193
return ;
197
194
}
198
195
199
- zend_op_array * op_array = & execute_data -> func -> op_array ;
200
- uint32_t fn_flags = op_array -> fn_flags ;
196
+ zend_function * function = execute_data -> func ;
201
197
202
- if (!ZEND_OBSERVABLE_FN (fn_flags )) {
198
+ if (!ZEND_OBSERVABLE_FN (function )) {
203
199
return ;
204
200
}
205
201
206
- zend_observer_fcall_begin_handler * handler = (zend_observer_fcall_begin_handler * )& ZEND_OBSERVER_DATA (op_array );
202
+ zend_observer_fcall_begin_handler * handler = (zend_observer_fcall_begin_handler * )& ZEND_OBSERVER_DATA (function );
207
203
if (!* handler ) {
208
204
zend_observer_fcall_install (execute_data );
209
205
}
@@ -243,11 +239,11 @@ ZEND_API void ZEND_FASTCALL zend_observer_fcall_begin(zend_execute_data *execute
243
239
static inline bool zend_observer_is_skipped_frame (zend_execute_data * execute_data ) {
244
240
zend_function * func = execute_data -> func ;
245
241
246
- if (!func || func -> type == ZEND_INTERNAL_FUNCTION || !ZEND_OBSERVABLE_FN (func -> common . fn_flags )) {
242
+ if (!func || !ZEND_OBSERVABLE_FN (func )) {
247
243
return true;
248
244
}
249
245
250
- zend_observer_fcall_end_handler end_handler = (& ZEND_OBSERVER_DATA (& func -> op_array ))[zend_observers_fcall_list .count ];
246
+ zend_observer_fcall_end_handler end_handler = (& ZEND_OBSERVER_DATA (func ))[zend_observers_fcall_list .count ];
251
247
if (end_handler == NULL || end_handler == ZEND_OBSERVER_NOT_OBSERVED ) {
252
248
return true;
253
249
}
@@ -259,11 +255,11 @@ ZEND_API void ZEND_FASTCALL zend_observer_fcall_end(zend_execute_data *execute_d
259
255
{
260
256
zend_function * func = execute_data -> func ;
261
257
262
- if (!ZEND_OBSERVER_ENABLED || !ZEND_OBSERVABLE_FN (func -> common . fn_flags )) {
258
+ if (!ZEND_OBSERVER_ENABLED || !ZEND_OBSERVABLE_FN (func )) {
263
259
return ;
264
260
}
265
261
266
- zend_observer_fcall_end_handler * handler = (zend_observer_fcall_end_handler * )& ZEND_OBSERVER_DATA (& func -> op_array ) + zend_observers_fcall_list .count ;
262
+ zend_observer_fcall_end_handler * handler = (zend_observer_fcall_end_handler * )& ZEND_OBSERVER_DATA (func ) + zend_observers_fcall_list .count ;
267
263
// TODO: Fix exceptions from generators
268
264
// ZEND_ASSERT(fcall_data);
269
265
if (!* handler || * handler == ZEND_OBSERVER_NOT_OBSERVED ) {
@@ -291,7 +287,7 @@ ZEND_API void zend_observer_fcall_end_all(void)
291
287
{
292
288
zend_execute_data * ex = current_observed_frame ;
293
289
while (ex != NULL ) {
294
- if (ex -> func && ex -> func -> type != ZEND_INTERNAL_FUNCTION ) {
290
+ if (ex -> func ) {
295
291
zend_observer_fcall_end (ex , NULL );
296
292
}
297
293
ex = ex -> prev_execute_data ;
0 commit comments