summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/library/micropython.rst3
-rw-r--r--lib/utils/pyexec.c6
2 files changed, 9 insertions, 0 deletions
diff --git a/docs/library/micropython.rst b/docs/library/micropython.rst
index a6ea738ed..d9f913bff 100644
--- a/docs/library/micropython.rst
+++ b/docs/library/micropython.rst
@@ -90,6 +90,9 @@ Functions
in a row and the lock-depth will increase, and then `heap_unlock()` must be
called the same number of times to make the heap available again.
+ If the REPL becomes active with the heap locked then it will be forcefully
+ unlocked.
+
.. function:: kbd_intr(chr)
Set the character that will raise a `KeyboardInterrupt` exception. By
diff --git a/lib/utils/pyexec.c b/lib/utils/pyexec.c
index 5d72419d1..d8dc60bfe 100644
--- a/lib/utils/pyexec.c
+++ b/lib/utils/pyexec.c
@@ -419,6 +419,12 @@ friendly_repl_reset:
}
#endif
+ // If the GC is locked at this point there is no way out except a reset,
+ // so force the GC to be unlocked to help the user debug what went wrong.
+ if (MP_STATE_MEM(gc_lock_depth) != 0) {
+ MP_STATE_MEM(gc_lock_depth) = 0;
+ }
+
vstr_reset(&line);
int ret = readline(&line, ">>> ");
mp_parse_input_kind_t parse_input_kind = MP_PARSE_SINGLE_INPUT;