diff options
author | Levi Morrison <levim@php.net> | 2020-09-01 09:57:49 -0600 |
---|---|---|
committer | Levi Morrison <levim@php.net> | 2020-09-01 09:59:59 -0600 |
commit | 66c3e900e2072c2f4bb8d112f7ecb73380e19102 (patch) | |
tree | c24979ff83bf2bece2e881687d6aed312b36510c /Zend/zend_generators.c | |
parent | bd8e0a96a57e4d2d409c2b8c5270e2b38d8c255a (diff) | |
download | php-git-66c3e900e2072c2f4bb8d112f7ecb73380e19102.tar.gz |
Add zend_observer API
Closes GH-5857.
Co-authored-by: Nikita Popov <nikita.ppv@gmail.com>
Co-authored-by: Sammy Powers <sammyk@datadoghq.com>
Diffstat (limited to 'Zend/zend_generators.c')
-rw-r--r-- | Zend/zend_generators.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index 3fbac811ac..c890669a70 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -24,6 +24,7 @@ #include "zend_generators.h" #include "zend_closures.h" #include "zend_generators_arginfo.h" +#include "zend_observer.h" ZEND_API zend_class_entry *zend_ce_generator; ZEND_API zend_class_entry *zend_ce_ClosedGeneratorException; @@ -774,7 +775,25 @@ try_again: /* Resume execution */ generator->flags |= ZEND_GENERATOR_CURRENTLY_RUNNING; - zend_execute_ex(generator->execute_data); + if (!ZEND_OBSERVER_ENABLED) { + zend_execute_ex(generator->execute_data); + } else { + zend_op_array *op_array = &generator->execute_data->func->op_array; + void *observer_handlers = ZEND_OBSERVER_HANDLERS(op_array); + if (!observer_handlers) { + zend_observer_fcall_install((zend_function *)op_array); + observer_handlers = ZEND_OBSERVER_HANDLERS(op_array); + } + ZEND_ASSERT(observer_handlers); + if (observer_handlers != ZEND_OBSERVER_NOT_OBSERVED) { + zend_observe_fcall_begin(observer_handlers, generator->execute_data); + } + zend_execute_ex(generator->execute_data); + if (generator->execute_data) { + /* On the final return, this will be called from ZEND_GENERATOR_RETURN */ + zend_observer_maybe_fcall_call_end(generator->execute_data, &generator->value); + } + } generator->flags &= ~ZEND_GENERATOR_CURRENTLY_RUNNING; generator->frozen_call_stack = NULL; |