3232 (ZEND_MAP_PTR(function->common.run_time_cache) && !(function->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE))
3333
3434zend_llist zend_observers_fcall_list ;
35+ zend_llist zend_observer_function_declared_callbacks ;
36+ zend_llist zend_observer_class_linked_callbacks ;
3537zend_llist zend_observer_error_callbacks ;
3638zend_llist zend_observer_fiber_init ;
3739zend_llist zend_observer_fiber_switch ;
3840zend_llist zend_observer_fiber_destroy ;
3941
4042int zend_observer_fcall_op_array_extension ;
43+ bool zend_observer_errors_observed ;
44+ bool zend_observer_function_declared_observed ;
45+ bool zend_observer_class_linked_observed ;
4146
4247ZEND_TLS zend_execute_data * current_observed_frame ;
4348
@@ -51,6 +56,8 @@ ZEND_API void zend_observer_fcall_register(zend_observer_fcall_init init)
5156ZEND_API void zend_observer_startup (void )
5257{
5358 zend_llist_init (& zend_observers_fcall_list , sizeof (zend_observer_fcall_init ), NULL , 1 );
59+ zend_llist_init (& zend_observer_function_declared_callbacks , sizeof (zend_observer_function_declared_cb ), NULL , 1 );
60+ zend_llist_init (& zend_observer_class_linked_callbacks , sizeof (zend_observer_class_linked_cb ), NULL , 1 );
5461 zend_llist_init (& zend_observer_error_callbacks , sizeof (zend_observer_error_cb ), NULL , 1 );
5562 zend_llist_init (& zend_observer_fiber_init , sizeof (zend_observer_fiber_init_handler ), NULL , 1 );
5663 zend_llist_init (& zend_observer_fiber_switch , sizeof (zend_observer_fiber_switch_handler ), NULL , 1 );
@@ -100,6 +107,8 @@ ZEND_API void zend_observer_activate(void)
100107ZEND_API void zend_observer_shutdown (void )
101108{
102109 zend_llist_destroy (& zend_observers_fcall_list );
110+ zend_llist_destroy (& zend_observer_function_declared_callbacks );
111+ zend_llist_destroy (& zend_observer_class_linked_callbacks );
103112 zend_llist_destroy (& zend_observer_error_callbacks );
104113 zend_llist_destroy (& zend_observer_fiber_init );
105114 zend_llist_destroy (& zend_observer_fiber_switch );
@@ -286,8 +295,45 @@ ZEND_API void zend_observer_fcall_end_all(void)
286295 EG (current_execute_data ) = original_execute_data ;
287296}
288297
298+ ZEND_API void zend_observer_function_declared_register (zend_observer_function_declared_cb cb )
299+ {
300+ zend_observer_function_declared_observed = true;
301+ zend_llist_add_element (& zend_observer_function_declared_callbacks , & cb );
302+ }
303+
304+ ZEND_API void ZEND_FASTCALL zend_observer_function_declared_notify (zend_op_array * op_array , zend_string * name )
305+ {
306+ if (CG (compiler_options ) & ZEND_COMPILE_IGNORE_OBSERVER ) {
307+ return ;
308+ }
309+
310+ for (zend_llist_element * element = zend_observer_function_declared_callbacks .head ; element ; element = element -> next ) {
311+ zend_observer_function_declared_cb callback = * (zend_observer_function_declared_cb * ) (element -> data );
312+ callback (op_array , name );
313+ }
314+ }
315+
316+ ZEND_API void zend_observer_class_linked_register (zend_observer_class_linked_cb cb )
317+ {
318+ zend_observer_class_linked_observed = true;
319+ zend_llist_add_element (& zend_observer_class_linked_callbacks , & cb );
320+ }
321+
322+ ZEND_API void ZEND_FASTCALL zend_observer_class_linked_notify (zend_class_entry * ce , zend_string * name )
323+ {
324+ if (CG (compiler_options ) & ZEND_COMPILE_IGNORE_OBSERVER ) {
325+ return ;
326+ }
327+
328+ for (zend_llist_element * element = zend_observer_class_linked_callbacks .head ; element ; element = element -> next ) {
329+ zend_observer_class_linked_cb callback = * (zend_observer_class_linked_cb * ) (element -> data );
330+ callback (ce , name );
331+ }
332+ }
333+
289334ZEND_API void zend_observer_error_register (zend_observer_error_cb cb )
290335{
336+ zend_observer_errors_observed = true;
291337 zend_llist_add_element (& zend_observer_error_callbacks , & cb );
292338}
293339
0 commit comments