@@ -38,19 +38,13 @@ typedef struct _zend_observer_fcall_data {
38
38
zend_observer_fcall_handlers handlers [1 ];
39
39
} zend_observer_fcall_data ;
40
40
41
- typedef struct _zend_observer_frame {
42
- zend_execute_data * execute_data ;
43
- struct _zend_observer_frame * prev ;
44
- } zend_observer_frame ;
45
-
46
41
zend_llist zend_observers_fcall_list ;
47
42
zend_llist zend_observer_error_callbacks ;
48
43
49
44
int zend_observer_fcall_op_array_extension = -1 ;
50
45
51
46
ZEND_TLS zend_arena * fcall_handlers_arena = NULL ;
52
- ZEND_TLS zend_arena * observed_stack_arena = NULL ;
53
- ZEND_TLS zend_observer_frame * current_observed_frame = NULL ;
47
+ ZEND_TLS zend_execute_data * current_observed_frame = NULL ;
54
48
55
49
// Call during minit/startup ONLY
56
50
ZEND_API void zend_observer_fcall_register (zend_observer_fcall_init init ) {
@@ -82,14 +76,12 @@ ZEND_API void zend_observer_startup(void) {
82
76
ZEND_API void zend_observer_activate (void ) {
83
77
if (ZEND_OBSERVER_ENABLED ) {
84
78
fcall_handlers_arena = zend_arena_create (4096 );
85
- observed_stack_arena = zend_arena_create (4096 );
86
79
}
87
80
}
88
81
89
82
ZEND_API void zend_observer_deactivate (void ) {
90
83
if (fcall_handlers_arena ) {
91
84
zend_arena_destroy (fcall_handlers_arena );
92
- zend_arena_destroy (observed_stack_arena );
93
85
}
94
86
}
95
87
@@ -146,7 +138,6 @@ static void ZEND_FASTCALL _zend_observe_fcall_begin(zend_execute_data *execute_d
146
138
uint32_t fn_flags ;
147
139
zend_observer_fcall_data * fcall_data ;
148
140
zend_observer_fcall_handlers * handlers , * end ;
149
- zend_observer_frame * frame ;
150
141
151
142
if (!ZEND_OBSERVER_ENABLED ) {
152
143
return ;
@@ -170,10 +161,7 @@ static void ZEND_FASTCALL _zend_observe_fcall_begin(zend_execute_data *execute_d
170
161
return ;
171
162
}
172
163
173
- frame = zend_arena_alloc (& observed_stack_arena , sizeof (zend_observer_frame ));
174
- frame -> execute_data = execute_data ;
175
- frame -> prev = current_observed_frame ;
176
- current_observed_frame = frame ;
164
+ current_observed_frame = execute_data ;
177
165
178
166
end = fcall_data -> end ;
179
167
for (handlers = fcall_data -> handlers ; handlers != end ; ++ handlers ) {
@@ -203,7 +191,6 @@ ZEND_API void ZEND_FASTCALL zend_observer_fcall_end(
203
191
zend_function * func = execute_data -> func ;
204
192
zend_observer_fcall_data * fcall_data ;
205
193
zend_observer_fcall_handlers * handlers , * end ;
206
- zend_observer_frame * frame ;
207
194
208
195
if (!ZEND_OBSERVER_ENABLED
209
196
|| !ZEND_OBSERVABLE_FN (func -> common .fn_flags )) {
@@ -225,16 +212,19 @@ ZEND_API void ZEND_FASTCALL zend_observer_fcall_end(
225
212
}
226
213
}
227
214
228
- frame = current_observed_frame ;
229
- current_observed_frame = frame -> prev ;
230
- zend_arena_release (& observed_stack_arena , frame );
215
+ current_observed_frame = execute_data -> prev_execute_data ;
231
216
}
232
217
233
218
ZEND_API void zend_observer_fcall_end_all (void )
234
219
{
235
- while (current_observed_frame != NULL ) {
236
- zend_observer_fcall_end (current_observed_frame -> execute_data , NULL );
220
+ zend_execute_data * ex = current_observed_frame ;
221
+ while (ex != NULL ) {
222
+ if (ex -> func -> type != ZEND_INTERNAL_FUNCTION ) {
223
+ zend_observer_fcall_end (ex , NULL );
224
+ }
225
+ ex = ex -> prev_execute_data ;
237
226
}
227
+ current_observed_frame = NULL ;
238
228
}
239
229
240
230
ZEND_API void zend_observer_error_register (zend_observer_error_cb cb )
0 commit comments