/* ** cmdrun.c - mruby debugger run command functions ** */ #include #include "mruby/opcode.h" #include "mrdb.h" dbgcmd_state dbgcmd_run(mrb_state *mrb, mrdb_state *mrdb) { mrb_debug_context *dbg = mrdb->dbg; if (dbg->xm == DBG_INIT) { InterlockedExchange(&dbg->xm, DBG_RUN); } else { InterlockedExchange(&dbg->xm, DBG_QUIT); if (dbg->xphase == DBG_PHASE_RUNNING) { struct RClass *exc; puts("Start it from the beginning."); exc = mrb_define_class(mrb, "DebuggerRestart", mrb_class_get(mrb, "Exception")); mrb_raise(mrb, exc, "Restart mrdb."); } } return DBGST_RESTART; } dbgcmd_state dbgcmd_continue(mrb_state *mrb, mrdb_state *mrdb) { mrb_debug_context *dbg = mrdb->dbg; int ccnt = 1; if (mrdb->wcnt > 1) { sscanf(mrdb->words[1], "%d", &ccnt); } dbg->ccnt = (uint16_t)(ccnt > 0 ? ccnt : 1); /* count of continue */ if (dbg->xphase == DBG_PHASE_AFTER_RUN) { puts("The program is not running."); InterlockedExchange(&dbg->xm, DBG_QUIT); } else { InterlockedExchange(&dbg->xm, DBG_RUN); } return DBGST_CONTINUE; } dbgcmd_state dbgcmd_step(mrb_state *mrb, mrdb_state *mrdb) { InterlockedExchange(&mrdb->dbg->xm, DBG_STEP); return DBGST_CONTINUE; } dbgcmd_state dbgcmd_next(mrb_state *mrb, mrdb_state *mrdb) { InterlockedExchange(&mrdb->dbg->xm, DBG_NEXT); mrdb->dbg->prvci = mrb->c->ci; return DBGST_CONTINUE; }