diff options
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; |