Lines Matching refs:generator

35 ZEND_API void zend_generator_restore_call_stack(zend_generator *generator) /* {{{ */  in zend_generator_restore_call_stack()  argument
39 call = generator->frozen_call_stack; in zend_generator_restore_call_stack()
53 generator->execute_data->call = prev_call; in zend_generator_restore_call_stack()
54 efree(generator->frozen_call_stack); in zend_generator_restore_call_stack()
55 generator->frozen_call_stack = NULL; in zend_generator_restore_call_stack()
113 zend_generator *generator, zend_execute_data *execute_data, uint32_t catch_op_num) /* {{{ */ in zend_generator_cleanup_unfinished_execution() argument
120 if (UNEXPECTED(generator->frozen_call_stack)) { in zend_generator_cleanup_unfinished_execution()
122 zend_execute_data *save_ex = generator->execute_data; in zend_generator_cleanup_unfinished_execution()
123 generator->execute_data = execute_data; in zend_generator_cleanup_unfinished_execution()
124 zend_generator_restore_call_stack(generator); in zend_generator_cleanup_unfinished_execution()
125 generator->execute_data = save_ex; in zend_generator_cleanup_unfinished_execution()
133 ZEND_API void zend_generator_close(zend_generator *generator, zend_bool finished_execution) /* {{{ … in zend_generator_close() argument
135 if (EXPECTED(generator->execute_data)) { in zend_generator_close()
136 zend_execute_data *execute_data = generator->execute_data; in zend_generator_close()
139 generator->execute_data = NULL; in zend_generator_close()
157 generator->execute_data = NULL; in zend_generator_close()
166 zend_generator_cleanup_unfinished_execution(generator, execute_data, 0); in zend_generator_close()
200 static zend_always_inline zend_generator *clear_link_to_leaf(zend_generator *generator) { in clear_link_to_leaf() argument
201 ZEND_ASSERT(!generator->node.parent); in clear_link_to_leaf()
202 zend_generator *leaf = generator->node.ptr.leaf; in clear_link_to_leaf()
205 generator->node.ptr.leaf = NULL; in clear_link_to_leaf()
211 static zend_always_inline void clear_link_to_root(zend_generator *generator) { in clear_link_to_root() argument
212 ZEND_ASSERT(generator->node.parent); in clear_link_to_root()
213 if (generator->node.ptr.root) { in clear_link_to_root()
214 generator->node.ptr.root->node.ptr.leaf = NULL; in clear_link_to_root()
215 generator->node.ptr.root = NULL; in clear_link_to_root()
221 zend_generator *generator = (zend_generator*) object; in zend_generator_dtor_storage() local
222 zend_execute_data *ex = generator->execute_data; in zend_generator_dtor_storage()
227 if (UNEXPECTED(Z_TYPE(generator->values) != IS_UNDEF)) { in zend_generator_dtor_storage()
228 zval_ptr_dtor(&generator->values); in zend_generator_dtor_storage()
229 ZVAL_UNDEF(&generator->values); in zend_generator_dtor_storage()
232 zend_generator *parent = generator->node.parent; in zend_generator_dtor_storage()
234 zend_generator_remove_child(&parent->node, generator); in zend_generator_dtor_storage()
235 clear_link_to_root(generator); in zend_generator_dtor_storage()
236 generator->node.parent = NULL; in zend_generator_dtor_storage()
239 clear_link_to_leaf(generator); in zend_generator_dtor_storage()
272 zend_generator_cleanup_unfinished_execution(generator, ex, try_catch->finally_op); in zend_generator_dtor_storage()
278 generator->flags |= ZEND_GENERATOR_FORCED_CLOSE; in zend_generator_dtor_storage()
279 zend_generator_resume(generator); in zend_generator_dtor_storage()
307 zend_generator *generator = (zend_generator*) object; in zend_generator_free_storage() local
309 zend_generator_close(generator, 0); in zend_generator_free_storage()
312 zval_ptr_dtor(&generator->value); in zend_generator_free_storage()
313 zval_ptr_dtor(&generator->key); in zend_generator_free_storage()
315 if (EXPECTED(!Z_ISUNDEF(generator->retval))) { in zend_generator_free_storage()
316 zval_ptr_dtor(&generator->retval); in zend_generator_free_storage()
319 if (UNEXPECTED(generator->node.children > 1)) { in zend_generator_free_storage()
320 zend_hash_destroy(generator->node.child.ht); in zend_generator_free_storage()
321 efree(generator->node.child.ht); in zend_generator_free_storage()
324 zend_object_std_dtor(&generator->std); in zend_generator_free_storage()
330 zend_generator *generator = (zend_generator*)object; in zend_generator_get_gc() local
331 zend_execute_data *execute_data = generator->execute_data; in zend_generator_get_gc()
337 *table = &generator->value; in zend_generator_get_gc()
342 if (generator->flags & ZEND_GENERATOR_CURRENTLY_RUNNING) { in zend_generator_get_gc()
355 zend_get_gc_buffer_add_zval(gc_buffer, &generator->value); in zend_generator_get_gc()
356 zend_get_gc_buffer_add_zval(gc_buffer, &generator->key); in zend_generator_get_gc()
357 zend_get_gc_buffer_add_zval(gc_buffer, &generator->retval); in zend_generator_get_gc()
358 zend_get_gc_buffer_add_zval(gc_buffer, &generator->values); in zend_generator_get_gc()
387 if (UNEXPECTED(generator->frozen_call_stack)) { in zend_generator_get_gc()
389 zend_execute_data *call = zend_generator_revert_call_stack(generator->frozen_call_stack); in zend_generator_get_gc()
413 if (generator->node.parent) { in zend_generator_get_gc()
414 zend_get_gc_buffer_add_obj(gc_buffer, &generator->node.parent->std); in zend_generator_get_gc()
428 zend_generator *generator; in zend_generator_create() local
430 generator = emalloc(sizeof(zend_generator)); in zend_generator_create()
431 memset(generator, 0, sizeof(zend_generator)); in zend_generator_create()
434 generator->largest_used_integer_key = -1; in zend_generator_create()
436 ZVAL_UNDEF(&generator->retval); in zend_generator_create()
437 ZVAL_UNDEF(&generator->values); in zend_generator_create()
440 generator->node.parent = NULL; in zend_generator_create()
441 generator->node.children = 0; in zend_generator_create()
442 generator->node.ptr.root = NULL; in zend_generator_create()
444 zend_object_std_init(&generator->std, class_type); in zend_generator_create()
445 generator->std.handlers = &zend_generator_handlers; in zend_generator_create()
447 return (zend_object*)generator; in zend_generator_create()
463 zend_generator *generator = (zend_generator *) Z_OBJ(ptr->This); in zend_generator_check_placeholder_frame() local
465 ZEND_ASSERT(generator->node.parent && "Placeholder only used with delegation"); in zend_generator_check_placeholder_frame()
466 while (generator->node.parent->node.parent) { in zend_generator_check_placeholder_frame()
467 generator->execute_data->prev_execute_data = prev; in zend_generator_check_placeholder_frame()
468 prev = generator->execute_data; in zend_generator_check_placeholder_frame()
469 generator = generator->node.parent; in zend_generator_check_placeholder_frame()
471 generator->execute_data->prev_execute_data = prev; in zend_generator_check_placeholder_frame()
472 ptr = generator->execute_data; in zend_generator_check_placeholder_frame()
478 static void zend_generator_throw_exception(zend_generator *generator, zval *exception) in zend_generator_throw_exception() argument
484 EG(current_execute_data) = generator->execute_data; in zend_generator_throw_exception()
485 generator->execute_data->opline--; in zend_generator_throw_exception()
494 if (UNEXPECTED(Z_TYPE(generator->values) != IS_UNDEF)) { in zend_generator_throw_exception()
495 zval_ptr_dtor(&generator->values); in zend_generator_throw_exception()
496 ZVAL_UNDEF(&generator->values); in zend_generator_throw_exception()
499 generator->execute_data->opline++; in zend_generator_throw_exception()
503 static void zend_generator_add_child(zend_generator *generator, zend_generator *child) in zend_generator_add_child() argument
505 zend_generator_node *node = &generator->node; in zend_generator_add_child()
524 void zend_generator_yield_from(zend_generator *generator, zend_generator *from) in zend_generator_yield_from() argument
526 ZEND_ASSERT(!generator->node.parent && "Already has parent?"); in zend_generator_yield_from()
527 zend_generator *leaf = clear_link_to_leaf(generator); in zend_generator_yield_from()
532 generator->node.parent = from; in zend_generator_yield_from()
533 zend_generator_add_child(from, generator); in zend_generator_yield_from()
534 generator->flags |= ZEND_GENERATOR_DO_INIT; in zend_generator_yield_from()
537 ZEND_API zend_generator *zend_generator_update_root(zend_generator *generator) in zend_generator_update_root() argument
539 zend_generator *root = generator->node.parent; in zend_generator_update_root()
545 root->node.ptr.leaf = generator; in zend_generator_update_root()
546 generator->node.ptr.root = root; in zend_generator_update_root()
550 static zend_generator *get_new_root(zend_generator *generator, zend_generator *root) in get_new_root() argument
562 while (generator->node.parent->execute_data) { in get_new_root()
563 generator = generator->node.parent; in get_new_root()
566 return generator; in get_new_root()
569 ZEND_API zend_generator *zend_generator_update_current(zend_generator *generator) in zend_generator_update_current() argument
571 zend_generator *old_root = generator->node.ptr.root; in zend_generator_update_current()
574 zend_generator *new_root = get_new_root(generator, old_root); in zend_generator_update_current()
576 ZEND_ASSERT(old_root->node.ptr.leaf == generator); in zend_generator_update_current()
577 generator->node.ptr.root = new_root; in zend_generator_update_current()
578 new_root->node.ptr.leaf = generator; in zend_generator_update_current()
585 …if (EXPECTED(EG(exception) == NULL) && EXPECTED((OBJ_FLAGS(&generator->std) & IS_OBJ_DESTRUCTOR_CA… in zend_generator_update_current()
594 if (new_root == generator) { in zend_generator_update_current()
597 new_root->execute_data->prev_execute_data = &generator->execute_fake; in zend_generator_update_current()
598 generator->execute_fake.prev_execute_data = original_execute_data; in zend_generator_update_current()
607 if (!((old_root ? old_root : generator)->flags & ZEND_GENERATOR_CURRENTLY_RUNNING)) { in zend_generator_update_current()
610 zend_generator_resume(generator); in zend_generator_update_current()
611 return zend_generator_get_current(generator); in zend_generator_update_current()
627 static zend_result zend_generator_get_next_delegated_value(zend_generator *generator) /* {{{ */ in zend_generator_get_next_delegated_value() argument
629 --generator->execute_data->opline; in zend_generator_get_next_delegated_value()
632 if (Z_TYPE(generator->values) == IS_ARRAY) { in zend_generator_get_next_delegated_value()
633 HashTable *ht = Z_ARR(generator->values); in zend_generator_get_next_delegated_value()
634 HashPosition pos = Z_FE_POS(generator->values); in zend_generator_get_next_delegated_value()
651 zval_ptr_dtor(&generator->value); in zend_generator_get_next_delegated_value()
652 ZVAL_COPY(&generator->value, value); in zend_generator_get_next_delegated_value()
654 zval_ptr_dtor(&generator->key); in zend_generator_get_next_delegated_value()
656 ZVAL_STR_COPY(&generator->key, p->key); in zend_generator_get_next_delegated_value()
658 ZVAL_LONG(&generator->key, p->h); in zend_generator_get_next_delegated_value()
661 Z_FE_POS(generator->values) = pos; in zend_generator_get_next_delegated_value()
663 zend_object_iterator *iter = (zend_object_iterator *) Z_OBJ(generator->values); in zend_generator_get_next_delegated_value()
682 zval_ptr_dtor(&generator->value); in zend_generator_get_next_delegated_value()
683 ZVAL_COPY(&generator->value, value); in zend_generator_get_next_delegated_value()
685 zval_ptr_dtor(&generator->key); in zend_generator_get_next_delegated_value()
687 iter->funcs->get_current_key(iter, &generator->key); in zend_generator_get_next_delegated_value()
689 ZVAL_UNDEF(&generator->key); in zend_generator_get_next_delegated_value()
693 ZVAL_LONG(&generator->key, iter->index); in zend_generator_get_next_delegated_value()
697 ++generator->execute_data->opline; in zend_generator_get_next_delegated_value()
701 zval_ptr_dtor(&generator->values); in zend_generator_get_next_delegated_value()
702 ZVAL_UNDEF(&generator->values); in zend_generator_get_next_delegated_value()
704 ++generator->execute_data->opline; in zend_generator_get_next_delegated_value()
711 zend_generator *generator = zend_generator_get_current(orig_generator); in zend_generator_resume() local
714 if (UNEXPECTED(!generator->execute_data)) { in zend_generator_resume()
719 if (generator->flags & ZEND_GENERATOR_CURRENTLY_RUNNING) { in zend_generator_resume()
724 …if (UNEXPECTED((orig_generator->flags & ZEND_GENERATOR_DO_INIT) != 0 && !Z_ISUNDEF(generator->valu… in zend_generator_resume()
738 EG(current_execute_data) = generator->execute_data; in zend_generator_resume()
744 if (generator == orig_generator) { in zend_generator_resume()
745 generator->execute_data->prev_execute_data = original_execute_data; in zend_generator_resume()
749 generator->execute_data->prev_execute_data = &orig_generator->execute_fake; in zend_generator_resume()
754 if (UNEXPECTED(!Z_ISUNDEF(generator->values))) { in zend_generator_resume()
755 if (EXPECTED(zend_generator_get_next_delegated_value(generator) == SUCCESS)) { in zend_generator_resume()
767 if (UNEXPECTED(generator->frozen_call_stack)) { in zend_generator_resume()
769 zend_generator_restore_call_stack(generator); in zend_generator_resume()
773 generator->flags |= ZEND_GENERATOR_CURRENTLY_RUNNING; in zend_generator_resume()
775 zend_execute_ex(generator->execute_data); in zend_generator_resume()
777 zend_observer_generator_resume(generator->execute_data); in zend_generator_resume()
778 zend_execute_ex(generator->execute_data); in zend_generator_resume()
779 if (generator->execute_data) { in zend_generator_resume()
781 zend_observer_fcall_end(generator->execute_data, &generator->value); in zend_generator_resume()
784 generator->flags &= ~ZEND_GENERATOR_CURRENTLY_RUNNING; in zend_generator_resume()
786 generator->frozen_call_stack = NULL; in zend_generator_resume()
787 if (EXPECTED(generator->execute_data) && in zend_generator_resume()
788 UNEXPECTED(generator->execute_data->call)) { in zend_generator_resume()
790 generator->frozen_call_stack = zend_generator_freeze_call_stack(generator->execute_data); in zend_generator_resume()
802 if (generator == orig_generator) { in zend_generator_resume()
803 zend_generator_close(generator, 0); in zend_generator_resume()
811 generator = zend_generator_get_current(orig_generator); in zend_generator_resume()
812 zend_generator_throw_exception(generator, NULL); in zend_generator_resume()
819 …if (UNEXPECTED((generator != orig_generator && !Z_ISUNDEF(generator->retval)) || (generator->execu… in zend_generator_resume()
820 generator = zend_generator_get_current(orig_generator); in zend_generator_resume()
828 static inline void zend_generator_ensure_initialized(zend_generator *generator) /* {{{ */ in zend_generator_ensure_initialized() argument
830 …if (UNEXPECTED(Z_TYPE(generator->value) == IS_UNDEF) && EXPECTED(generator->execute_data) && EXPEC… in zend_generator_ensure_initialized()
831 zend_generator_resume(generator); in zend_generator_ensure_initialized()
832 generator->flags |= ZEND_GENERATOR_AT_FIRST_YIELD; in zend_generator_ensure_initialized()
837 static inline void zend_generator_rewind(zend_generator *generator) /* {{{ */ in zend_generator_rewind() argument
839 zend_generator_ensure_initialized(generator); in zend_generator_rewind()
841 if (!(generator->flags & ZEND_GENERATOR_AT_FIRST_YIELD)) { in zend_generator_rewind()
850 zend_generator *generator; in ZEND_METHOD() local
854 generator = (zend_generator *) Z_OBJ_P(ZEND_THIS); in ZEND_METHOD()
856 zend_generator_rewind(generator); in ZEND_METHOD()
863 zend_generator *generator; in ZEND_METHOD() local
867 generator = (zend_generator *) Z_OBJ_P(ZEND_THIS); in ZEND_METHOD()
869 zend_generator_ensure_initialized(generator); in ZEND_METHOD()
871 zend_generator_get_current(generator); in ZEND_METHOD()
873 RETURN_BOOL(EXPECTED(generator->execute_data != NULL)); in ZEND_METHOD()
880 zend_generator *generator, *root; in ZEND_METHOD() local
884 generator = (zend_generator *) Z_OBJ_P(ZEND_THIS); in ZEND_METHOD()
886 zend_generator_ensure_initialized(generator); in ZEND_METHOD()
888 root = zend_generator_get_current(generator); in ZEND_METHOD()
889 if (EXPECTED(generator->execute_data != NULL && Z_TYPE(root->value) != IS_UNDEF)) { in ZEND_METHOD()
900 zend_generator *generator, *root; in ZEND_METHOD() local
904 generator = (zend_generator *) Z_OBJ_P(ZEND_THIS); in ZEND_METHOD()
906 zend_generator_ensure_initialized(generator); in ZEND_METHOD()
908 root = zend_generator_get_current(generator); in ZEND_METHOD()
909 if (EXPECTED(generator->execute_data != NULL && Z_TYPE(root->key) != IS_UNDEF)) { in ZEND_METHOD()
920 zend_generator *generator; in ZEND_METHOD() local
924 generator = (zend_generator *) Z_OBJ_P(ZEND_THIS); in ZEND_METHOD()
926 zend_generator_ensure_initialized(generator); in ZEND_METHOD()
928 zend_generator_resume(generator); in ZEND_METHOD()
936 zend_generator *generator, *root; in ZEND_METHOD() local
942 generator = (zend_generator *) Z_OBJ_P(ZEND_THIS); in ZEND_METHOD()
944 zend_generator_ensure_initialized(generator); in ZEND_METHOD()
947 if (UNEXPECTED(!generator->execute_data)) { in ZEND_METHOD()
951 root = zend_generator_get_current(generator); in ZEND_METHOD()
957 zend_generator_resume(generator); in ZEND_METHOD()
959 root = zend_generator_get_current(generator); in ZEND_METHOD()
960 if (EXPECTED(generator->execute_data)) { in ZEND_METHOD()
972 zend_generator *generator; in ZEND_METHOD() local
980 generator = (zend_generator *) Z_OBJ_P(ZEND_THIS); in ZEND_METHOD()
982 zend_generator_ensure_initialized(generator); in ZEND_METHOD()
984 if (generator->execute_data) { in ZEND_METHOD()
985 zend_generator *root = zend_generator_get_current(generator); in ZEND_METHOD()
989 zend_generator_resume(generator); in ZEND_METHOD()
991 root = zend_generator_get_current(generator); in ZEND_METHOD()
992 if (generator->execute_data) { in ZEND_METHOD()
1008 zend_generator *generator; in ZEND_METHOD() local
1012 generator = (zend_generator *) Z_OBJ_P(ZEND_THIS); in ZEND_METHOD()
1014 zend_generator_ensure_initialized(generator); in ZEND_METHOD()
1019 if (Z_ISUNDEF(generator->retval)) { in ZEND_METHOD()
1026 ZVAL_COPY(return_value, &generator->retval); in ZEND_METHOD()
1040 zend_generator *generator = (zend_generator*)Z_OBJ(iterator->data); in zend_generator_iterator_valid() local
1042 zend_generator_ensure_initialized(generator); in zend_generator_iterator_valid()
1044 zend_generator_get_current(generator); in zend_generator_iterator_valid()
1046 return generator->execute_data ? SUCCESS : FAILURE; in zend_generator_iterator_valid()
1052 zend_generator *generator = (zend_generator*)Z_OBJ(iterator->data), *root; in zend_generator_iterator_get_data() local
1054 zend_generator_ensure_initialized(generator); in zend_generator_iterator_get_data()
1056 root = zend_generator_get_current(generator); in zend_generator_iterator_get_data()
1064 zend_generator *generator = (zend_generator*)Z_OBJ(iterator->data), *root; in zend_generator_iterator_get_key() local
1066 zend_generator_ensure_initialized(generator); in zend_generator_iterator_get_key()
1068 root = zend_generator_get_current(generator); in zend_generator_iterator_get_key()
1082 zend_generator *generator = (zend_generator*)Z_OBJ(iterator->data); in zend_generator_iterator_move_forward() local
1084 zend_generator_ensure_initialized(generator); in zend_generator_iterator_move_forward()
1086 zend_generator_resume(generator); in zend_generator_iterator_move_forward()
1092 zend_generator *generator = (zend_generator*)Z_OBJ(iterator->data); in zend_generator_iterator_rewind() local
1094 zend_generator_rewind(generator); in zend_generator_iterator_rewind()
1121 zend_generator *generator = (zend_generator*)Z_OBJ_P(object); in zend_generator_get_iterator() local
1123 if (!generator->execute_data) { in zend_generator_get_iterator()
1128 …if (UNEXPECTED(by_ref) && !(generator->execute_data->func->op_array.fn_flags & ZEND_ACC_RETURN_REF… in zend_generator_get_iterator()