27#define ZEND_OBSERVER_NOT_OBSERVED ((void *) 2)
30static zend_llist zend_observer_function_declared_callbacks;
31static zend_llist zend_observer_class_linked_callbacks;
32static zend_llist zend_observer_error_callbacks;
66 if (zend_observers_fcall_list.count) {
102 EG(current_observed_frame) =
NULL;
118 zend_llist *list = &zend_observers_fcall_list;
127 bool has_handlers =
false;
131 memcpy(&init, element->data,
sizeof init);
134 *(begin_handlers++) =
handlers.begin;
144 for (--end_handlers; end_handlers_start < end_handlers; --end_handlers, ++end_handlers_start) {
146 *end_handlers = *end_handlers_start;
147 *end_handlers_start = tmp;
160static bool zend_observer_remove_handler(
void **first_handler,
void *old_handler,
void **next_handler) {
161 size_t registered_observers = zend_observers_fcall_list.count;
163 void **last_handler = first_handler + registered_observers - 1;
164 for (
void **cur_handler = first_handler; cur_handler <= last_handler; ++cur_handler) {
165 if (*cur_handler == old_handler) {
166 if (registered_observers == 1 || (cur_handler == first_handler && cur_handler[1] ==
NULL)) {
168 *next_handler =
NULL;
170 if (cur_handler != last_handler) {
171 memmove(cur_handler, cur_handler + 1,
sizeof(cur_handler) * (last_handler - cur_handler));
173 *last_handler =
NULL;
174 *next_handler = *cur_handler;
183 size_t registered_observers = zend_observers_fcall_list.count;
186 *first_handler =
begin;
189 if (*cur_handler ==
NULL) {
190 *cur_handler =
begin;
201 if (zend_observer_remove_handler(begin_handlers,
begin, (
void**)
next)) {
204 size_t registered_observers = zend_observers_fcall_list.count;
215 size_t registered_observers = zend_observers_fcall_list.count;
222 memmove(end_handler + 1, end_handler,
sizeof(end_handler) * (registered_observers - 1));
230 size_t registered_observers = zend_observers_fcall_list.count;
232 void **end_handlers = begin_handlers + registered_observers;
233 if (zend_observer_remove_handler(end_handlers,
end, (
void**)
next)) {
254 zend_observer_fcall_begin_specialized(
execute_data,
true);
263 if (zend_observer_handler_is_unobserved(
handler)) {
322 EG(current_observed_frame) =
NULL;
343 for (
zend_llist_element *element = zend_observer_function_declared_callbacks.head; element; element = element->next) {
361 for (
zend_llist_element *element = zend_observer_class_linked_callbacks.head; element; element = element->next) {
375 for (
zend_llist_element *element = zend_observer_error_callbacks.head; element; element = element->next) {
403 for (element = zend_observer_fiber_init.head; element; element = element->
next) {
418 for (element = zend_observer_fiber_switch.head; element; element = element->
next) {
432 for (element = zend_observer_fiber_destroy.head; element; element = element->
next) {
unsigned const char * end
zend_execute_data * original_execute_data
zend_execute_data * top_observed_frame
struct _zend_llist_element * next
zend_llist_element * head
#define ZEND_USER_CODE(type)
#define RUN_TIME_CACHE(op_array)
#define ZEND_ACC_GENERATOR
struct _zend_op_array zend_op_array
#define ZEND_CALL_NUM_ARGS(call)
struct _zend_internal_function zend_internal_function
#define ZEND_COMPILE_IGNORE_OBSERVER
ZEND_API int zend_get_internal_function_extension_handles(const char *module_name, int handles)
ZEND_API int zend_get_op_array_extension_handles(const char *module_name, int handles)
union _zend_function zend_function
struct _zend_fiber_context zend_fiber_context
#define ZEND_HASH_MAP_FOREACH_PTR(ht, _ptr)
#define ZEND_HASH_FOREACH_PTR(ht, _ptr)
#define ZEND_HASH_FOREACH_END()
ZEND_API void zend_llist_destroy(zend_llist *l)
ZEND_API void zend_llist_add_element(zend_llist *l, const void *element)
ZEND_API void zend_llist_init(zend_llist *l, size_t size, llist_dtor_func_t dtor, unsigned char persistent)
struct _zend_llist_element zend_llist_element
struct _zend_llist zend_llist
struct _zend_string zend_string
ZEND_API bool zend_observer_remove_end_handler(zend_function *function, zend_observer_fcall_end_handler end, zend_observer_fcall_end_handler *next)
ZEND_API void ZEND_FASTCALL zend_observer_fiber_switch_notify(zend_fiber_context *from, zend_fiber_context *to)
ZEND_API void zend_observer_fcall_end_all(void)
ZEND_API void ZEND_FASTCALL zend_observer_fcall_end_prechecked(zend_execute_data *execute_data, zval *return_value)
ZEND_API void zend_observer_fiber_init_register(zend_observer_fiber_init_handler handler)
bool zend_observer_function_declared_observed
ZEND_API void zend_observer_class_linked_register(zend_observer_class_linked_cb cb)
int zend_observer_fcall_op_array_extension
ZEND_API void zend_observer_shutdown(void)
int zend_observer_fcall_internal_function_extension
bool zend_observer_class_linked_observed
bool zend_observer_errors_observed
ZEND_API void ZEND_FASTCALL zend_observer_fiber_destroy_notify(zend_fiber_context *destroying)
ZEND_API void ZEND_FASTCALL zend_observer_fcall_begin_prechecked(zend_execute_data *execute_data, zend_observer_fcall_begin_handler *handler)
ZEND_API void zend_observer_post_startup(void)
ZEND_API void zend_observer_fcall_register(zend_observer_fcall_init init)
ZEND_API void zend_observer_startup(void)
#define ZEND_OBSERVER_NOT_OBSERVED
ZEND_API bool zend_observer_remove_begin_handler(zend_function *function, zend_observer_fcall_begin_handler begin, zend_observer_fcall_begin_handler *next)
ZEND_API void ZEND_FASTCALL _zend_observer_function_declared_notify(zend_op_array *op_array, zend_string *name)
ZEND_API void ZEND_FASTCALL zend_observer_fcall_begin(zend_execute_data *execute_data)
ZEND_API void ZEND_FASTCALL zend_observer_fiber_init_notify(zend_fiber_context *initializing)
ZEND_API void zend_observer_fiber_switch_register(zend_observer_fiber_switch_handler handler)
ZEND_API void zend_observer_error_register(zend_observer_error_cb cb)
ZEND_API void zend_observer_add_end_handler(zend_function *function, zend_observer_fcall_end_handler end)
ZEND_API void _zend_observer_error_notify(int type, zend_string *error_filename, uint32_t error_lineno, zend_string *message)
ZEND_API void zend_observer_function_declared_register(zend_observer_function_declared_cb cb)
ZEND_API void zend_observer_activate(void)
ZEND_API void zend_observer_fiber_destroy_register(zend_observer_fiber_destroy_handler handler)
ZEND_API void ZEND_FASTCALL _zend_observer_class_linked_notify(zend_class_entry *ce, zend_string *name)
ZEND_API void zend_observer_add_begin_handler(zend_function *function, zend_observer_fcall_begin_handler begin)
ZEND_API void ZEND_FASTCALL zend_observer_generator_resume(zend_execute_data *execute_data)
#define ZEND_OBSERVER_DATA(function)
void(* zend_observer_class_linked_cb)(zend_class_entry *ce, zend_string *name)
#define ZEND_OBSERVER_NONE_OBSERVED
#define ZEND_OBSERVER_ENABLED
void(* zend_observer_fiber_switch_handler)(zend_fiber_context *from, zend_fiber_context *to)
void(* zend_observer_fiber_init_handler)(zend_fiber_context *initializing)
void(* zend_observer_function_declared_cb)(zend_op_array *op_array, zend_string *name)
void(* zend_observer_fcall_end_handler)(zend_execute_data *execute_data, zval *retval)
void(* zend_observer_fcall_begin_handler)(zend_execute_data *execute_data)
void(* zend_observer_error_cb)(int type, zend_string *error_filename, uint32_t error_lineno, zend_string *message)
void(* zend_observer_fiber_destroy_handler)(zend_fiber_context *destroying)
zend_observer_fcall_handlers(* zend_observer_fcall_init)(zend_execute_data *execute_data)
struct _zend_observer_fcall_handlers zend_observer_fcall_handlers
#define ZEND_UNREACHABLE()
struct _zend_class_entry zend_class_entry
struct _zend_execute_data zend_execute_data
#define ZEND_VM_SET_OPCODE_HANDLER(opline)
fbc internal_function handler(call, ret)
function(EX_VAR(opline->result.var))