static void semis_dbg(void) { struct debug_xt *debug_xt_item, *debug_xt_up = NULL; /* If current semis is in our debug xt list, disable debug mode */ debug_xt_item = debug_xt_list; while (debug_xt_item->next) { if (debug_xt_item->xt_semis == PC) { if (debug_xt_item->mode != DEBUG_MODE_STEPUP) { /* Handle the normal case */ fstrncpy(xtname, lfa2nfa(debug_xt_item->xt_docol - sizeof(cell)), MAXNFALEN); printf_console("\n[ Finished %s ] ", xtname); /* Reset to step mode in case we were in trace mode */ debug_xt_item->mode = DEBUG_MODE_STEP; } else { /* This word requires execution of the debugger "Up" * semantics. However we can't do this here since we * are iterating through the debug list, and we need * to change it. So we do it afterwards. */ debug_xt_up = debug_xt_item; } } debug_xt_item = debug_xt_item->next; } /* Execute debugger "Up" semantics if required */ if (debug_xt_up) { /* Only add the parent word if it is not within the trampoline */ if (rstack[rstackcnt] != (cell)pointer2cell(&trampoline[1])) { del_debug_xt(debug_xt_up->xt_docol); add_debug_xt(findxtfromcell(rstack[rstackcnt])); fstrncpy(xtname, lfa2nfa(findxtfromcell(rstack[rstackcnt]) - sizeof(cell)), MAXNFALEN); printf_console("\n[ Up to %s ] ", xtname); } else { fstrncpy(xtname, lfa2nfa(findxtfromcell(debug_xt_up->xt_docol) - sizeof(cell)), MAXNFALEN); printf_console("\n[ Finished %s (Unable to go up, hit trampoline) ] ", xtname); del_debug_xt(debug_xt_up->xt_docol); } debug_xt_up = NULL; } PC = POPR(); }
static void do_debug_off( void ) { /* Empty the debug xt linked list */ while (debug_xt_list->next != NULL) del_debug_xt(debug_xt_list->xt_docol); }