summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorSammy Kaye Powers <sammyk@php.net>2020-09-24 12:57:43 -0700
committerSammy Kaye Powers <sammyk@php.net>2020-09-25 11:46:15 -0700
commite42abeafeca245950ebc47c7312913e68262d40e (patch)
treebf62186a7ea10351ed31063a3bd2455fa7b978b4 /Zend
parenta91cb2f48c275751df1ab0a3f9e9a28c200add77 (diff)
downloadphp-git-e42abeafeca245950ebc47c7312913e68262d40e.tar.gz
Pass zend_execute_data instead of zend_function to fcall init
The motivation for this change is to prevent extensions from having to check executor globals for the current execute_data during function call init. A previous implementation of the observer API initialized the function call from runtime cache initialization before execute_data was allocated which is why zend_function was passed in. But now that the observer API is implemented via opcode specialization, it makes sense to pass in the execute_data. This also keeps the API a bit more consistent for existing extensions that already hook zend_execute_ex. Closes GH-6209
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend_observer.c7
-rw-r--r--Zend/zend_observer.h2
2 files changed, 5 insertions, 4 deletions
diff --git a/Zend/zend_observer.c b/Zend/zend_observer.c
index 68cf43ce66..9c2d1cdf51 100644
--- a/Zend/zend_observer.c
+++ b/Zend/zend_observer.c
@@ -89,9 +89,10 @@ ZEND_API void zend_observer_shutdown(void) {
zend_llist_destroy(&zend_observer_error_callbacks);
}
-static void zend_observer_fcall_install(zend_function *function) {
+static void zend_observer_fcall_install(zend_execute_data *execute_data) {
zend_llist_element *element;
zend_llist *list = &zend_observers_fcall_list;
+ zend_function *function = execute_data->func;
zend_op_array *op_array = &function->op_array;
if (fcall_handlers_arena == NULL) {
@@ -105,7 +106,7 @@ static void zend_observer_fcall_install(zend_function *function) {
for (element = list->head; element; element = element->next) {
zend_observer_fcall_init init;
memcpy(&init, element->data, sizeof init);
- zend_observer_fcall_handlers handlers = init(function);
+ zend_observer_fcall_handlers handlers = init(execute_data);
if (handlers.begin || handlers.end) {
zend_llist_add_element(&handlers_list, &handlers);
}
@@ -150,7 +151,7 @@ static void ZEND_FASTCALL _zend_observe_fcall_begin(zend_execute_data *execute_d
fcall_data = ZEND_OBSERVER_DATA(op_array);
if (!fcall_data) {
- zend_observer_fcall_install((zend_function *)op_array);
+ zend_observer_fcall_install(execute_data);
fcall_data = ZEND_OBSERVER_DATA(op_array);
}
diff --git a/Zend/zend_observer.h b/Zend/zend_observer.h
index 246a3a61be..1d20306a17 100644
--- a/Zend/zend_observer.h
+++ b/Zend/zend_observer.h
@@ -50,7 +50,7 @@ typedef struct _zend_observer_fcall_handlers {
} zend_observer_fcall_handlers;
/* If the fn should not be observed then return {NULL, NULL} */
-typedef zend_observer_fcall_handlers (*zend_observer_fcall_init)(zend_function *func);
+typedef zend_observer_fcall_handlers (*zend_observer_fcall_init)(zend_execute_data *execute_data);
// Call during minit/startup ONLY
ZEND_API void zend_observer_fcall_register(zend_observer_fcall_init);