From a539ba89782b82a2016552ecb6580645ea947054 Mon Sep 17 00:00:00 2001 From: lightovernight Date: Sat, 9 Aug 2025 14:30:37 +0800 Subject: [PATCH] implement exit event --- include/pocketpy/debugger/core.h | 9 +++++-- include/pocketpy/debugger/dap.h | 1 - src/debugger/core.c | 41 +++++--------------------------- src/debugger/dap.c | 18 ++++++-------- src2/main.c | 5 ---- 5 files changed, 20 insertions(+), 54 deletions(-) delete mode 100644 include/pocketpy/debugger/dap.h diff --git a/include/pocketpy/debugger/core.h b/include/pocketpy/debugger/core.h index 0508dff4..d5b04051 100644 --- a/include/pocketpy/debugger/core.h +++ b/include/pocketpy/debugger/core.h @@ -7,11 +7,16 @@ typedef enum { C11_STEP_IN, C11_STEP_OVER, C11_STEP_OUT, C11_STEP_CONTINUE } C11_STEP_MODE; -typedef enum { C11_DEBUGGER_SUCCESS, C11_DEBUGGER_UNKNOW_ERROR, C11_DEBUGGER_FILEPATH_ERROR } C11_DEBUGGER_FAIL_REASON; +typedef enum { + C11_DEBUGGER_SUCCESS = 0, + C11_DEBUGGER_EXIT = 1, + C11_DEBUGGER_UNKNOW_ERROR = 3, + C11_DEBUGGER_FILEPATH_ERROR = 7 +} C11_DEBUGGER_STATUS; void c11_debugger_init(void); void c11_debugger_set_step_mode(C11_STEP_MODE mode); -C11_DEBUGGER_FAIL_REASON c11_debugger_on_trace(py_Frame* frame, enum py_TraceEvent event); +C11_DEBUGGER_STATUS c11_debugger_on_trace(py_Frame* frame, enum py_TraceEvent event); void c11_debugger_frames(c11_sbuf* buffer); void c11_debugger_scopes(int frameid, c11_sbuf* buffer); bool c11_debugger_unfold_var(int var_id, c11_sbuf* buffer); diff --git a/include/pocketpy/debugger/dap.h b/include/pocketpy/debugger/dap.h deleted file mode 100644 index 6f70f09b..00000000 --- a/include/pocketpy/debugger/dap.h +++ /dev/null @@ -1 +0,0 @@ -#pragma once diff --git a/src/debugger/core.c b/src/debugger/core.c index addbf963..2f9d6fcd 100644 --- a/src/debugger/core.c +++ b/src/debugger/core.c @@ -41,11 +41,7 @@ static struct c11_debugger { c11_vector py_frames; c11_smallmap_d2index scopes_query_cache; -<<<<<<< HEAD - #define python_vars py_r7() -======= #define python_vars py_r7() ->>>>>>> 429f2e78 (simplify the workdir process) } debugger; @@ -69,21 +65,13 @@ inline static py_Ref get_variable(int var_ref) { return py_list_getitem(python_vars, var_ref); } - -static inline const char* format_filepath(const char* path) { - if (strstr(path, "..")) { - return NULL; - } - if (strstr(path + 1, "./") || strstr(path + 1, ".\\")) { - return NULL; - } - if (path[0] == '.' && (path[1] == '/' || path[1] == '\\')) { - return path + 2; - } +const inline static char* format_filepath(const char* path) { + if(strstr(path, "..")) { return NULL; } + if(strstr(path + 1, "./") || strstr(path + 1, ".\\")) { return NULL; } + if(path[0] == '.' && (path[1] == '/' || path[1] == '\\')) { return path + 2; } return path; } - void c11_debugger_init() { debugger.curr_stack_depth = 0; debugger.current_line = -1; @@ -94,7 +82,7 @@ void c11_debugger_init() { init_structures(); } -C11_DEBUGGER_FAIL_REASON c11_debugger_on_trace(py_Frame* frame, enum py_TraceEvent event) { +C11_DEBUGGER_STATUS c11_debugger_on_trace(py_Frame* frame, enum py_TraceEvent event) { debugger.current_frame = frame; debugger.current_event = event; const char* source_name = py_Frame_sourceloc(debugger.current_frame, &debugger.current_line); @@ -106,6 +94,7 @@ C11_DEBUGGER_FAIL_REASON c11_debugger_on_trace(py_Frame* frame, enum py_TraceEve case TRACE_EVENT_POP: debugger.curr_stack_depth--; break; default: break; } + if(debugger.curr_stack_depth == 0) return C11_DEBUGGER_EXIT; return C11_DEBUGGER_SUCCESS; } @@ -123,10 +112,6 @@ void c11_debugger_set_step_mode(C11_STEP_MODE mode) { debugger.keep_suspend = false; } -<<<<<<< HEAD - -======= ->>>>>>> 429f2e78 (simplify the workdir process) int c11_debugger_setbreakpoint(const char* filename, int lineno) { c11_debugger_breakpoint breakpoint = {.sourcename = c11_strdup(filename), .lineno = lineno}; c11_vector__push(c11_debugger_breakpoint, &debugger.breakpoints, breakpoint); @@ -184,10 +169,6 @@ int c11_debugger_should_pause() { int c11_debugger_should_keep_pause(void) { return debugger.keep_suspend; } -<<<<<<< HEAD - -======= ->>>>>>> 429f2e78 (simplify the workdir process) inline static c11_sv sv_from_cstr(const char* str) { c11_sv sv = {.data = str, .size = strlen(str)}; return sv; @@ -287,12 +268,6 @@ bool c11_debugger_unfold_var(int var_id, c11_sbuf* buffer) { // 3. construct DAP JSON and extend python_vars py_Ref dap_obj = py_pushtmp(); -<<<<<<< HEAD - py_assign(dap_obj, py_retval()); - - // 4. extend python_vars - if(!py_smartexec("_0.extend([kv[1] for kv in _1])", NULL, python_vars, kv_list)) { -======= py_newdict(dap_obj); // 先创建字典 const char* dap_code = "_2['variables'] = []\n" @@ -307,7 +282,6 @@ bool c11_debugger_unfold_var(int var_id, c11_sbuf* buffer) { " })\n" " if has_children: var_ref += 1\n"; if(!py_smartexec(dap_code, NULL, kv_list, base_var_ref, dap_obj)) { ->>>>>>> 429f2e78 (simplify the workdir process) py_printexc(); return false; } @@ -337,8 +311,5 @@ bool c11_debugger_unfold_var(int var_id, c11_sbuf* buffer) { py_pop(); // kv_list return true; } -<<<<<<< HEAD -======= ->>>>>>> 429f2e78 (simplify the workdir process) #undef python_vars diff --git a/src/debugger/dap.c b/src/debugger/dap.c index 272dac2e..3199b169 100644 --- a/src/debugger/dap.c +++ b/src/debugger/dap.c @@ -1,4 +1,5 @@ #include +#include #include "pocketpy/common/socket.h" #include "pocketpy/debugger/core.h" #include "pocketpy/objects/base.h" @@ -54,14 +55,7 @@ void c11_dap_handle_initialize(py_Ref arguments, c11_sbuf* buffer) { c11_sbuf__write_char(buffer, ','); } -<<<<<<< HEAD -void c11_dap_handle_attach(py_Ref arguments, c11_sbuf* buffer) { - server.isatttach = true; - -} -======= void c11_dap_handle_attach(py_Ref arguments, c11_sbuf* buffer) { server.isatttach = true; } ->>>>>>> 429f2e78 (simplify the workdir process) void c11_dap_handle_next(py_Ref arguments, c11_sbuf* buffer) { c11_debugger_set_step_mode(C11_STEP_OVER); @@ -237,8 +231,6 @@ void c11_dap_send_stop_event() { "{\"threadId\":1,\"allThreadsStopped\":true}"); } -<<<<<<< HEAD -======= void c11_dap_send_exited_event(int exitCode) { char body[64]; snprintf(body, sizeof(body), "{\"exitCode\":%d}", exitCode); @@ -251,7 +243,6 @@ void c11_dap_send_fatal_event(const char* message) { c11_dap_send_event("pkpy/fatalError", body); } ->>>>>>> 429f2e78 (simplify the workdir process) void c11_dap_send_initialized_event() { c11_dap_send_event("initialized", "{}"); } int c11_dap_read_content_length(const char* buffer, int* header_length) { @@ -365,7 +356,12 @@ void c11_dap_configure_debugger() { void c11_dap_tracefunc(py_Frame* frame, enum py_TraceEvent event) { py_sys_settrace(NULL, false); - C11_DEBUGGER_FAIL_REASON result = c11_debugger_on_trace(frame, event); + C11_DEBUGGER_STATUS result = c11_debugger_on_trace(frame, event); + if(result == C11_DEBUGGER_EXIT) { + c11_dap_send_exited_event(0); + printf("[DEBUGGER INFO] : program exit\n"); + exit(0); + } if(result != C11_DEBUGGER_SUCCESS) { const char* message = NULL; switch(result) { diff --git a/src2/main.c b/src2/main.c index b6b9a0b8..3477c4c8 100644 --- a/src2/main.c +++ b/src2/main.c @@ -4,7 +4,6 @@ #include #include "pocketpy.h" -#include "pocketpy/debugger/dap.h" #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #include @@ -90,13 +89,9 @@ int main(int argc, char** argv) { } } } else { -<<<<<<< HEAD if(profile) py_profiler_begin(); if(debug) py_debugger_waitforattach("127.0.0.1", 6110); -======= - wait_for_debugger("127.0.0.1", 3939); ->>>>>>> 429f2e78 (simplify the workdir process) char* source = read_file(filename); if(source) { if(!py_exec(source, filename, EXEC_MODE, NULL))