diff --git a/src/debugger.c b/src/debugger.c index b27ab80..45a59c8 100644 --- a/src/debugger.c +++ b/src/debugger.c @@ -51,9 +51,9 @@ void dbg_init(const char *symbols_path, boolean use_dap) { dbg_impl->init(symbols_path); } -void dbg_quit() { +void dbg_quit(bool restart) { if (dbg_impl) - dbg_impl->quit(); + dbg_impl->quit(restart); } int dbg_lookup_var(const char *name) { diff --git a/src/debugger.h b/src/debugger.h index f293ae4..7c42e79 100644 --- a/src/debugger.h +++ b/src/debugger.h @@ -42,7 +42,7 @@ extern DebuggerState dbg_state; #define dbg_trapped() (dbg_state != DBG_RUNNING) void dbg_init(const char *symbols_path, boolean use_dap); -void dbg_quit(); +void dbg_quit(bool restart); void dbg_main(void); void dbg_onsleep(void); BYTE dbg_handle_breakpoint(int page, int addr); @@ -52,7 +52,7 @@ boolean dbg_console_vprintf(int lv, const char *format, va_list ap); #define dbg_trapped() false #define dbg_init(symbols_path, use_dap) -#define dbg_quit() +#define dbg_quit(restart) #define dbg_main() #define dbg_onsleep() #define dbg_handle_breakpoint(page, addr) BREAKPOINT diff --git a/src/debugger_cui.c b/src/debugger_cui.c index 4808d82..0507045 100644 --- a/src/debugger_cui.c +++ b/src/debugger_cui.c @@ -348,7 +348,7 @@ static void dbg_cui_init(const char *symbols_path) { dbg_state = DBG_STOPPED_ENTRY; } -static void dbg_cui_quit(void) { +static void dbg_cui_quit(bool restart) { } typedef struct { diff --git a/src/debugger_dap.c b/src/debugger_dap.c index 2761b23..aefeeb5 100644 --- a/src/debugger_dap.c +++ b/src/debugger_dap.c @@ -81,10 +81,14 @@ static void emit_initialized_event(void) { send_json(event); } -static void emit_terminated_event(void) { - cJSON *event = cJSON_CreateObject(); +static void emit_terminated_event(bool restart) { + cJSON *event = cJSON_CreateObject(), *body; cJSON_AddStringToObject(event, "type", "event"); cJSON_AddStringToObject(event, "event", "terminated"); + if (restart) { + cJSON_AddItemToObjectCS(event, "body", body = cJSON_CreateObject()); + cJSON_AddBoolToObject(body, "restart", true); + } send_json(event); } @@ -584,8 +588,10 @@ static void dbg_dap_init(const char *path) { } } -static void dbg_dap_quit(void) { - emit_terminated_event(); +static void dbg_dap_quit(bool restart) { + emit_terminated_event(restart); + if (restart) + exit(0); // The front end will restart xsystem35, so we can just exit. } static void dbg_dap_repl(void) { diff --git a/src/debugger_private.h b/src/debugger_private.h index d75d260..22569ca 100644 --- a/src/debugger_private.h +++ b/src/debugger_private.h @@ -50,7 +50,7 @@ typedef struct { typedef struct { void (*init)(const char *symbols_path); - void (*quit)(void); + void (*quit)(bool restart); void (*repl)(void); void (*onsleep)(void); void (*console_output)(int lv, const char *output); diff --git a/src/xsystem35.c b/src/xsystem35.c index a470e26..5e77756 100644 --- a/src/xsystem35.c +++ b/src/xsystem35.c @@ -237,7 +237,7 @@ static void sys35_init() { } static void sys35_remove() { - dbg_quit(); + dbg_quit(false); mus_exit(); ags_remove(); #ifdef ENABLE_GTK @@ -251,7 +251,7 @@ void sys_reset() { #ifdef ENABLE_GTK s39ini_remove(); #endif - + dbg_quit(true); // This may exit(). execvp(saved_argv[0], saved_argv); sys_error("exec fail"); }