From ad3724e0bc87305f9280f65226066a199042d736 Mon Sep 17 00:00:00 2001 From: Damien George Date: Mon, 17 Oct 2016 13:14:59 +1100 Subject: [PATCH] lib/utils/pyexec: Allow behaviour of SystemExit to be configurable. Setting the pyexec_system_exit variable to PYEXEC_FORCED_EXT allows SystemExit exceptions to terminate the pyexec functions. --- lib/utils/pyexec.c | 6 +++++- lib/utils/pyexec.h | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/utils/pyexec.c b/lib/utils/pyexec.c index 5824e14035..d7c2570240 100644 --- a/lib/utils/pyexec.c +++ b/lib/utils/pyexec.c @@ -45,6 +45,7 @@ #include "genhdr/mpversion.h" pyexec_mode_kind_t pyexec_mode_kind = PYEXEC_MODE_FRIENDLY_REPL; +int pyexec_system_exit = 0; STATIC bool repl_display_debugging_info = 0; #define EXEC_FLAG_PRINT_EOF (1) @@ -61,6 +62,9 @@ STATIC int parse_compile_execute(void *source, mp_parse_input_kind_t input_kind, int ret = 0; uint32_t start = 0; + // by default a SystemExit exception returns 0 + pyexec_system_exit = 0; + nlr_buf_t nlr; if (nlr_push(&nlr) == 0) { mp_obj_t module_fun; @@ -99,7 +103,7 @@ STATIC int parse_compile_execute(void *source, mp_parse_input_kind_t input_kind, // check for SystemExit if (mp_obj_is_subclass_fast(mp_obj_get_type((mp_obj_t)nlr.ret_val), &mp_type_SystemExit)) { // at the moment, the value of SystemExit is unused - ret = 0; + ret = pyexec_system_exit; } else { mp_obj_print_exception(&mp_plat_print, (mp_obj_t)nlr.ret_val); ret = 0; diff --git a/lib/utils/pyexec.h b/lib/utils/pyexec.h index e0f62440e0..ae69a195e7 100644 --- a/lib/utils/pyexec.h +++ b/lib/utils/pyexec.h @@ -33,6 +33,11 @@ typedef enum { extern pyexec_mode_kind_t pyexec_mode_kind; +// Set this to the value (eg PYEXEC_FORCED_EXIT) that will be propagated through +// the pyexec functions if a SystemExit exception is raised by the running code. +// It will reset to 0 at the start of each execution (eg each REPL entry). +extern int pyexec_system_exit; + #define PYEXEC_FORCED_EXIT (0x100) #define PYEXEC_SWITCH_MODE (0x200)