summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--py/objgenerator.c2
-rwxr-xr-xtests/run-tests1
-rw-r--r--tests/stress/recursive_gen.py9
3 files changed, 12 insertions, 0 deletions
diff --git a/py/objgenerator.c b/py/objgenerator.c
index 8c1260b60..5fd13f831 100644
--- a/py/objgenerator.c
+++ b/py/objgenerator.c
@@ -32,6 +32,7 @@
#include "py/bc.h"
#include "py/objgenerator.h"
#include "py/objfun.h"
+#include "py/stackctrl.h"
/******************************************************************************/
/* generator wrapper */
@@ -92,6 +93,7 @@ STATIC void gen_instance_print(const mp_print_t *print, mp_obj_t self_in, mp_pri
}
mp_vm_return_kind_t mp_obj_gen_resume(mp_obj_t self_in, mp_obj_t send_value, mp_obj_t throw_value, mp_obj_t *ret_val) {
+ MP_STACK_CHECK();
mp_check_self(MP_OBJ_IS_TYPE(self_in, &mp_type_gen_instance));
mp_obj_gen_instance_t *self = MP_OBJ_TO_PTR(self_in);
if (self->code_state.ip == 0) {
diff --git a/tests/run-tests b/tests/run-tests
index ef2f4bc6a..42037831d 100755
--- a/tests/run-tests
+++ b/tests/run-tests
@@ -367,6 +367,7 @@ def run_tests(pyb, tests, args, base_path="."):
skip_tests.add('micropython/heapalloc_iter.py') # requires generators
skip_tests.add('micropython/schedule.py') # native code doesn't check pending events
skip_tests.add('stress/gc_trace.py') # requires yield
+ skip_tests.add('stress/recursive_gen.py') # requires yield
for test_file in tests:
test_file = test_file.replace('\\', '/')
diff --git a/tests/stress/recursive_gen.py b/tests/stress/recursive_gen.py
new file mode 100644
index 000000000..65f5d8d47
--- /dev/null
+++ b/tests/stress/recursive_gen.py
@@ -0,0 +1,9 @@
+# test deeply recursive generators
+
+def gen():
+ yield from gen()
+
+try:
+ list(gen())
+except RuntimeError:
+ print('RuntimeError')