diff options
Diffstat (limited to 'mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c')
| -rw-r--r--[-rwxr-xr-x] | mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c | 101 |
1 files changed, 58 insertions, 43 deletions
diff --git a/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c b/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c index a0969a3ac..009cd955c 100755..100644 --- a/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +++ b/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c @@ -5,22 +5,20 @@ #include <stdlib.h> #include <string.h> -#include <stdio.h> #include <ctype.h> -#include "mruby.h" -#include "mruby/dump.h" -#include "mruby/debug.h" -#include "mruby/class.h" -#include "mruby/opcode.h" -#include "mruby/variable.h" +#include <mruby.h> +#include <mruby/dump.h> +#include <mruby/debug.h> +#include <mruby/class.h> +#include <mruby/opcode.h> +#include <mruby/variable.h> +#include <mruby/proc.h> #include "mrdb.h" #include "apibreak.h" #include "apilist.h" -void mrb_show_version(mrb_state *); -void mrb_show_copyright(mrb_state *); void mrdb_state_free(mrb_state *); static mrb_debug_context *_debug_context = NULL; @@ -54,11 +52,13 @@ static const debug_command debug_command_list[] = { {"eval", NULL, 2, 0, 0, DBGCMD_EVAL, dbgcmd_eval}, /* ev[al] */ {"help", NULL, 1, 0, 1, DBGCMD_HELP, dbgcmd_help}, /* h[elp] */ {"info", "breakpoints", 1, 1, 1, DBGCMD_INFO_BREAK, dbgcmd_info_break}, /* i[nfo] b[reakpoints] */ + {"info", "locals", 1, 1, 0, DBGCMD_INFO_LOCAL, dbgcmd_info_local}, /* i[nfo] l[ocals] */ {"list", NULL, 1, 0, 1, DBGCMD_LIST, dbgcmd_list}, /* l[ist] */ {"print", NULL, 1, 0, 0, DBGCMD_PRINT, dbgcmd_print}, /* p[rint] */ {"quit", NULL, 1, 0, 0, DBGCMD_QUIT, dbgcmd_quit}, /* q[uit] */ {"run", NULL, 1, 0, 0, DBGCMD_RUN, dbgcmd_run}, /* r[un] */ {"step", NULL, 1, 0, 1, DBGCMD_STEP, dbgcmd_step}, /* s[tep] */ + {"next", NULL, 1, 0, 1, DBGCMD_NEXT, dbgcmd_next}, /* n[ext] */ {NULL} }; @@ -185,7 +185,7 @@ cleanup(mrb_state *mrb, struct _args *args) static mrb_debug_context* mrb_debug_context_new(mrb_state *mrb) { - mrb_debug_context *dbg = mrb_malloc(mrb, sizeof(mrb_debug_context)); + mrb_debug_context *dbg = (mrb_debug_context*)mrb_malloc(mrb, sizeof(mrb_debug_context)); memset(dbg, 0, sizeof(mrb_debug_context)); @@ -224,12 +224,12 @@ mrb_debug_context_free(mrb_state *mrb) static mrdb_state* mrdb_state_new(mrb_state *mrb) { - mrdb_state *mrdb = mrb_malloc(mrb, sizeof(mrb_state)); + mrdb_state *mrdb = (mrdb_state*)mrb_malloc(mrb, sizeof(mrdb_state)); - memset(mrdb, 0, sizeof(mrb_state)); + memset(mrdb, 0, sizeof(mrdb_state)); mrdb->dbg = mrb_debug_context_get(mrb); - mrdb->command = mrb_malloc(mrb, MAX_COMMAND_LINE+1); + mrdb->command = (char*)mrb_malloc(mrb, MAX_COMMAND_LINE+1); mrdb->print_no = 1; return mrdb; @@ -275,7 +275,7 @@ get_command(mrb_state *mrb, mrdb_state *mrdb) if (i == 0 && feof(stdin)) { clearerr(stdin); strcpy(mrdb->command, "quit"); - i += strlen("quit"); + i += sizeof("quit") - 1; } if (i == MAX_COMMAND_LINE) { @@ -407,7 +407,7 @@ print_info_stopped_break(mrb_state *mrb, mrdb_state *mrdb) const char *class_name; ret = mrb_debug_get_break(mrb, mrdb->dbg, mrdb->dbg->stopped_bpno, &bp); - if(ret == 0) { + if (ret == 0) { switch(bp.type) { case MRB_DEBUG_BPTYPE_LINE: file = bp.point.linepoint.file; @@ -417,13 +417,13 @@ print_info_stopped_break(mrb_state *mrb, mrdb_state *mrdb) case MRB_DEBUG_BPTYPE_METHOD: method_name = bp.point.methodpoint.method_name; class_name = bp.point.methodpoint.class_name; - if(class_name == NULL) { + if (class_name == NULL) { printf("Breakpoint %d, %s\n", bp.bpno, method_name); } else { printf("Breakpoint %d, %s:%s\n", bp.bpno, class_name, method_name); } - if(mrdb->dbg->isCfunc) { + if (mrdb->dbg->isCfunc) { printf("Stopped before calling the C function.\n"); } break; @@ -446,7 +446,7 @@ print_info_stopped_code(mrb_state *mrb, mrdb_state *mrdb) { char* file = mrb_debug_get_source(mrb, mrdb, mrdb->srcpath, mrdb->dbg->prvfile); uint16_t lineno = mrdb->dbg->prvline; - if(file != NULL) { + if (file != NULL) { mrb_debug_list(mrb, mrdb->dbg, file, lineno, lineno); mrb_free(mrb, file); } @@ -480,6 +480,7 @@ get_and_parse_command(mrb_state *mrb, mrdb_state *mrdb) while (!cmd) { for (p=NULL; !p || *p=='\0'; ) { printf("(%s:%d) ", mrdb->dbg->prvfile, mrdb->dbg->prvline); + fflush(stdout); p = get_command(mrb, mrdb); } @@ -504,12 +505,13 @@ get_and_parse_command(mrb_state *mrb, mrdb_state *mrdb) } static int32_t -check_method_breakpoint(mrb_state *mrb, mrb_irep *irep, mrb_code *pc, mrb_value *regs) +check_method_breakpoint(mrb_state *mrb, const mrb_irep *irep, const mrb_code *pc, mrb_value *regs) { struct RClass* c; mrb_sym sym; int32_t bpno; mrb_bool isCfunc; + struct mrb_insn_data insn; mrb_debug_context *dbg = mrb_debug_context_get(mrb); @@ -517,23 +519,24 @@ check_method_breakpoint(mrb_state *mrb, mrb_irep *irep, mrb_code *pc, mrb_value bpno = dbg->method_bpno; dbg->method_bpno = 0; - switch(GET_OPCODE(*pc)) { + insn = mrb_decode_insn(pc); + switch(insn.insn) { case OP_SEND: case OP_SENDB: - c = mrb_class(mrb, regs[GETARG_A(*pc)]); - sym = irep->syms[GETARG_B(*pc)]; + c = mrb_class(mrb, regs[insn.a]); + sym = irep->syms[insn.b]; break; case OP_SUPER: - c = mrb->c->ci->target_class->super; + c = mrb_vm_ci_target_class(mrb->c->ci)->super; sym = mrb->c->ci->mid; break; default: sym = 0; break; } - if(sym != 0) { + if (sym != 0) { dbg->method_bpno = mrb_debug_check_breakpoint_method(mrb, dbg, c, sym, &isCfunc); - if(isCfunc) { + if (isCfunc) { bpno = dbg->method_bpno; dbg->method_bpno = 0; } @@ -543,7 +546,7 @@ check_method_breakpoint(mrb_state *mrb, mrb_irep *irep, mrb_code *pc, mrb_value } static void -mrb_code_fetch_hook(mrb_state *mrb, mrb_irep *irep, mrb_code *pc, mrb_value *regs) +mrb_code_fetch_hook(mrb_state *mrb, const mrb_irep *irep, const mrb_code *pc, mrb_value *regs) { const char *file; int32_t line; @@ -557,27 +560,39 @@ mrb_code_fetch_hook(mrb_state *mrb, mrb_irep *irep, mrb_code *pc, mrb_value *reg dbg->pc = pc; dbg->regs = regs; - if(dbg->xphase == DBG_PHASE_RESTART) { + if (dbg->xphase == DBG_PHASE_RESTART) { dbg->root_irep = irep; dbg->prvfile = NULL; dbg->prvline = 0; + dbg->prvci = NULL; dbg->xm = DBG_RUN; dbg->xphase = DBG_PHASE_RUNNING; } - file = mrb_debug_get_filename(irep, (uint32_t)(pc - irep->iseq)); - line = mrb_debug_get_line(irep, (uint32_t)(pc - irep->iseq)); + file = mrb_debug_get_filename(mrb, irep, pc - irep->iseq); + line = mrb_debug_get_line(mrb, irep, pc - irep->iseq); switch (dbg->xm) { case DBG_STEP: - case DBG_NEXT: // temporary - if (dbg->prvfile == file && dbg->prvline == line) { + if (!file || (dbg->prvfile == file && dbg->prvline == line)) { return; } dbg->method_bpno = 0; dbg->bm = BRK_STEP; break; + case DBG_NEXT: + if (!file || (dbg->prvfile == file && dbg->prvline == line)) { + return; + } + if ((intptr_t)(dbg->prvci) < (intptr_t)(mrb->c->ci)) { + return; + } + dbg->prvci = NULL; + dbg->method_bpno = 0; + dbg->bm = BRK_NEXT; + break; + case DBG_RUN: bpno = check_method_breakpoint(mrb, irep, pc, regs); if (bpno > 0) { @@ -611,7 +626,7 @@ mrb_code_fetch_hook(mrb_state *mrb, mrb_irep *irep, mrb_code *pc, mrb_value *reg dbg->prvfile = file; dbg->prvline = line; - if(dbg->bm == BRK_BREAK && --dbg->ccnt > 0) { + if (dbg->bm == BRK_BREAK && --dbg->ccnt > 0) { return; } dbg->break_hook(mrb, dbg); @@ -634,7 +649,7 @@ mrb_debug_break_hook(mrb_state *mrb, mrb_debug_context *dbg) st = cmd->func(mrb, mrdb); - if( (st == DBGST_CONTINUE) || (st == DBGST_RESTART) ) break; + if ((st == DBGST_CONTINUE) || (st == DBGST_RESTART)) break; } return dbg->xm; } @@ -651,13 +666,13 @@ main(int argc, char **argv) mrb_debug_context* dbg_backup; debug_command *cmd; + l_restart: + if (mrb == NULL) { fputs("Invalid mrb_state, exiting mruby\n", stderr); return EXIT_FAILURE; } - l_restart: - /* parse command parameters */ n = parse_args(mrb, argc, argv, &args); if (n == EXIT_FAILURE || args.rfp == NULL) { @@ -671,7 +686,7 @@ main(int argc, char **argv) mrb_assert(mrdb && mrdb->dbg); mrdb->srcpath = args.srcpath; - if(mrdb->dbg->xm == DBG_QUIT) { + if (mrdb->dbg->xm == DBG_QUIT) { mrdb->dbg->xphase = DBG_PHASE_RESTART; } else { @@ -679,7 +694,7 @@ main(int argc, char **argv) } mrdb->dbg->xm = DBG_INIT; mrdb->dbg->ccnt = 1; - + /* setup hook functions */ mrb->code_fetch_hook = mrb_code_fetch_hook; mrdb->dbg->break_hook = mrb_debug_break_hook; @@ -726,21 +741,21 @@ main(int argc, char **argv) mrb_p(mrb, v); } } - + mrdb->dbg->prvfile = "-"; mrdb->dbg->prvline = 0; - + while (1) { cmd = get_and_parse_command(mrb, mrdb); mrb_assert(cmd); - + if (cmd->id == DBGCMD_QUIT) { break; } - - if( cmd->func(mrb, mrdb) == DBGST_RESTART ) goto l_restart; + + if ( cmd->func(mrb, mrdb) == DBGST_RESTART ) goto l_restart; } - + cleanup(mrb, &args); return 0; |
