summaryrefslogtreecommitdiff
path: root/Zend/zend_generators.c
diff options
context:
space:
mode:
authorLevi Morrison <levim@php.net>2020-09-01 09:57:49 -0600
committerLevi Morrison <levim@php.net>2020-09-01 09:59:59 -0600
commit66c3e900e2072c2f4bb8d112f7ecb73380e19102 (patch)
treec24979ff83bf2bece2e881687d6aed312b36510c /Zend/zend_generators.c
parentbd8e0a96a57e4d2d409c2b8c5270e2b38d8c255a (diff)
downloadphp-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.c21
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;