summaryrefslogtreecommitdiff
path: root/Zend/zend_generators.c
diff options
context:
space:
mode:
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;