summaryrefslogtreecommitdiff
path: root/py/objgenerator.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2018-05-22 16:54:03 +1000
committerDamien George <damien.p.george@gmail.com>2018-05-22 16:54:03 +1000
commit400273a799581e5eb86538d8c88fb872705475ab (patch)
treeeef7253947cfeabef14cd6223a0c965ccd43d2c8 /py/objgenerator.c
parent771cb359af5242762baa29645c37cafa23c47b25 (diff)
py/objgenerator: Protect against reentering a generator.
Generators that are already executing cannot be reexecuted. This patch puts in a check for such a case. Thanks to @jepler for finding the bug.
Diffstat (limited to 'py/objgenerator.c')
-rw-r--r--py/objgenerator.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/py/objgenerator.c b/py/objgenerator.c
index d500dbd9d..a2ad490d6 100644
--- a/py/objgenerator.c
+++ b/py/objgenerator.c
@@ -117,9 +117,19 @@ mp_vm_return_kind_t mp_obj_gen_resume(mp_obj_t self_in, mp_obj_t send_value, mp_
*self->code_state.sp = send_value;
}
}
+
+ // We set self->globals=NULL while executing, for a sentinel to ensure the generator
+ // cannot be reentered during execution
+ if (self->globals == NULL) {
+ mp_raise_ValueError("generator already executing");
+ }
+
+ // Set up the correct globals context for the generator and execute it
self->code_state.old_globals = mp_globals_get();
mp_globals_set(self->globals);
+ self->globals = NULL;
mp_vm_return_kind_t ret_kind = mp_execute_bytecode(&self->code_state, throw_value);
+ self->globals = mp_globals_get();
mp_globals_set(self->code_state.old_globals);
switch (ret_kind) {