diff options
| author | Damien George <damien.p.george@gmail.com> | 2014-10-25 18:19:55 +0100 |
|---|---|---|
| committer | Damien George <damien.p.george@gmail.com> | 2014-10-25 23:37:57 +0100 |
| commit | 124df6f8d07b53542b6960dbeea9b63bff469a67 (patch) | |
| tree | 39ea11d0bed72ed828c406d2b4a8fc069b00ca4e /py/runtime.c | |
| parent | d7353fe6fe9c9d421ef045c0eea8d4591710e1ba (diff) | |
py: Add mp_pending_exception global variable, for VM soft interrupt.
This allows to implement KeyboardInterrupt on unix, and a much safer
ctrl-C in stmhal port. First ctrl-C is a soft one, with hope that VM
will notice it; second ctrl-C is a hard one that kills anything (for
both unix and stmhal).
One needs to check for a pending exception in the VM only for jump
opcodes. Others can't produce an infinite loop (infinite recursion is
caught by stack check).
Diffstat (limited to 'py/runtime.c')
| -rw-r--r-- | py/runtime.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/py/runtime.c b/py/runtime.c index 6cb5c7e19..f6f34be94 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -62,6 +62,9 @@ #define DEBUG_OP_printf(...) (void)0 #endif +// pending exception object (MP_OBJ_NULL if not pending) +mp_obj_t mp_pending_exception; + // locals and globals need to be pointers because they can be the same in outer module scope STATIC mp_obj_dict_t *dict_locals; STATIC mp_obj_dict_t *dict_globals; @@ -79,6 +82,9 @@ void mp_init(void) { qstr_init(); mp_stack_ctrl_init(); + // no pending exceptions to start with + mp_pending_exception = MP_OBJ_NULL; + #if MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF mp_init_emergency_exception_buf(); #endif |
