lib/utils/pyexec: Forcefully unlock the heap if locked and REPL active.

Otherwise there is really nothing that can be done, it can't be unlocked by
the user because there is no way to allocate memory to execute the unlock.

See issue #4205 and #4209.
This commit is contained in:
Damien George 2018-10-13 16:21:08 +11:00
parent 7059b4af6d
commit f5d46a88aa
2 changed files with 9 additions and 0 deletions

View File

@ -90,6 +90,9 @@ Functions
in a row and the lock-depth will increase, and then `heap_unlock()` must be 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. 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) .. function:: kbd_intr(chr)
Set the character that will raise a `KeyboardInterrupt` exception. By Set the character that will raise a `KeyboardInterrupt` exception. By

View File

@ -419,6 +419,12 @@ friendly_repl_reset:
} }
#endif #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); vstr_reset(&line);
int ret = readline(&line, ">>> "); int ret = readline(&line, ">>> ");
mp_parse_input_kind_t parse_input_kind = MP_PARSE_SINGLE_INPUT; mp_parse_input_kind_t parse_input_kind = MP_PARSE_SINGLE_INPUT;