From 2c21e1a95926883fbf559d8bb652264da380f677 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 24 Feb 2026 09:00:49 +0900 Subject: [PATCH] apibreak.c: extract alloc_breakpoint() helper Extract common breakpoint slot allocation logic from mrb_debug_set_break_line() and mrb_debug_set_break_method() into a shared alloc_breakpoint() helper. Co-authored-by: Claude --- .../mruby-bin-debugger/tools/mrdb/apibreak.c | 72 +++++++++---------- 1 file changed, 33 insertions(+), 39 deletions(-) diff --git a/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c b/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c index e3e0e666a..0a151e755 100644 --- a/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +++ b/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c @@ -83,6 +83,28 @@ get_break_index(mrb_debug_context *dbg, uint32_t bpno) return index; } +static int32_t +alloc_breakpoint(mrb_debug_context *dbg, mrb_debug_bptype type) +{ + int32_t index; + + if (dbg->bpnum >= MAX_BREAKPOINT) { + return MRB_DEBUG_BREAK_NUM_OVER; + } + if (dbg->next_bpno > MAX_BREAKPOINTNO) { + return MRB_DEBUG_BREAK_NO_OVER; + } + + index = dbg->bpnum; + dbg->bp[index].bpno = dbg->next_bpno; + dbg->next_bpno++; + dbg->bp[index].enable = TRUE; + dbg->bp[index].type = type; + dbg->bpnum++; + + return index; +} + static void free_breakpoint(mrb_state *mrb, mrb_debug_breakpoint *bp) { @@ -189,21 +211,12 @@ int32_t mrb_debug_set_break_line(mrb_state *mrb, mrb_debug_context *dbg, const char *file, uint16_t lineno) { int32_t index; - char* set_file; uint16_t result; if ((mrb == NULL)||(dbg == NULL)||(file == NULL)) { return MRB_DEBUG_INVALID_ARGUMENT; } - if (dbg->bpnum >= MAX_BREAKPOINT) { - return MRB_DEBUG_BREAK_NUM_OVER; - } - - if (dbg->next_bpno > MAX_BREAKPOINTNO) { - return MRB_DEBUG_BREAK_NO_OVER; - } - /* file and lineno check. */ result = check_file_lineno(mrb, dbg->root_irep, file, lineno); if (result == 0) { @@ -213,17 +226,11 @@ mrb_debug_set_break_line(mrb_state *mrb, mrb_debug_context *dbg, const char *fil return MRB_DEBUG_BREAK_INVALID_LINENO; } - set_file = mrdb_strdup(mrb, file); + index = alloc_breakpoint(dbg, MRB_DEBUG_BPTYPE_LINE); + if (index < 0) return index; - index = dbg->bpnum; - dbg->bp[index].bpno = dbg->next_bpno; - dbg->next_bpno++; - dbg->bp[index].enable = TRUE; - dbg->bp[index].type = MRB_DEBUG_BPTYPE_LINE; + dbg->bp[index].point.linepoint.file = mrdb_strdup(mrb, file); dbg->bp[index].point.linepoint.lineno = lineno; - dbg->bpnum++; - - dbg->bp[index].point.linepoint.file = set_file; return dbg->bp[index].bpno; } @@ -239,34 +246,21 @@ mrb_debug_set_break_method(mrb_state *mrb, mrb_debug_context *dbg, const char *c return MRB_DEBUG_INVALID_ARGUMENT; } - if (dbg->bpnum >= MAX_BREAKPOINT) { - return MRB_DEBUG_BREAK_NUM_OVER; - } - - if (dbg->next_bpno > MAX_BREAKPOINTNO) { - return MRB_DEBUG_BREAK_NO_OVER; - } - - if (class_name != NULL) { - set_class = mrdb_strdup(mrb, class_name); - } - else { - set_class = NULL; - } - + set_class = class_name != NULL ? mrdb_strdup(mrb, class_name) : NULL; set_method = mrdb_strdup(mrb, method_name); if (set_method == NULL) { mrb_free(mrb, set_class); } - index = dbg->bpnum; - dbg->bp[index].bpno = dbg->next_bpno; - dbg->next_bpno++; - dbg->bp[index].enable = TRUE; - dbg->bp[index].type = MRB_DEBUG_BPTYPE_METHOD; + index = alloc_breakpoint(dbg, MRB_DEBUG_BPTYPE_METHOD); + if (index < 0) { + mrb_free(mrb, set_method); + mrb_free(mrb, set_class); + return index; + } + dbg->bp[index].point.methodpoint.method_name = set_method; dbg->bp[index].point.methodpoint.class_name = set_class; - dbg->bpnum++; return dbg->bp[index].bpno; }