diff --git a/py/bc.h b/py/bc.h
index 45c63f356bccd1a5fc6260b0229285f45cc84699..f3885587a9c2af5c64f38e31fe703c907bc41c56 100644
--- a/py/bc.h
+++ b/py/bc.h
@@ -45,6 +45,7 @@ typedef struct _mp_code_state {
     mp_obj_t *sp;
     // bit 0 is saved currently_in_except_block value
     mp_exc_stack_t *exc_sp;
+    mp_obj_dict_t *old_globals;
     mp_uint_t n_state;
     // Variable-length
     mp_obj_t state[0];
diff --git a/py/objfun.c b/py/objfun.c
index 75a326c12413999ec6ef363eb0ffb5cfe1d525ed..dc068d5219e259412961fe8992a543a9a30437d1 100644
--- a/py/objfun.c
+++ b/py/objfun.c
@@ -137,7 +137,7 @@ STATIC void dump_args(const mp_obj_t *a, mp_uint_t sz) {
 // With this macro you can tune the maximum number of function state bytes
 // that will be allocated on the stack.  Any function that needs more
 // than this will use the heap.
-#define VM_MAX_STATE_ON_STACK (10 * sizeof(mp_uint_t))
+#define VM_MAX_STATE_ON_STACK (11 * sizeof(mp_uint_t))
 
 // Set this to enable a simple stack overflow check.
 #define VM_DETECT_STACK_OVERFLOW (0)
@@ -183,10 +183,10 @@ STATIC mp_obj_t fun_bc_call(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw,
     mp_setup_code_state(code_state, self_in, n_args, n_kw, args);
 
     // execute the byte code with the correct globals context
-    mp_obj_dict_t *old_globals = mp_globals_get();
+    code_state->old_globals = mp_globals_get();
     mp_globals_set(self->globals);
     mp_vm_return_kind_t vm_return_kind = mp_execute_bytecode(code_state, MP_OBJ_NULL);
-    mp_globals_set(old_globals);
+    mp_globals_set(code_state->old_globals);
 
 #if VM_DETECT_STACK_OVERFLOW
     if (vm_return_kind == MP_VM_RETURN_NORMAL) {