More refactor: in addition to the changes in the previous, this also moves the PDB_extend_const_table from src/debug.c to compilers/imcc/pbc.c, because is the only file that uses it and seems to not be related to the debugger (historical reasons?), renames it and makes it static, and add a few auxiliar functions to clean his usage.
-- Salu2
Index: src/ops/debug.ops =================================================================== --- src/ops/debug.ops (revisión: 28719) +++ src/ops/debug.ops (copia de trabajo) @@ -44,15 +44,7 @@ =cut op debug_init() :base_debug { - PDB_t *pdb; - - if (!(interp->pdb)) { - pdb = (PDB_t *)mem_sys_allocate_zeroed(sizeof (PDB_t)); - - interp->pdb = pdb; - pdb->cur_opcode = interp->code->base.data; - pdb->state |= PDB_RUNNING; - } + Parrot_debugger_init(interp); } ######################################## @@ -64,13 +56,7 @@ =cut op debug_load(inconst STR) :base_debug { - char *f; - - if (!(interp->pdb->state & PDB_BREAK)) { - f = string_to_cstring(interp, ($1)); - PDB_load_source(interp, f); - string_cstring_free(f); - } + Parrot_debugger_load(interp, ($1)); } ######################################## @@ -90,23 +76,7 @@ =cut op debug_break() :base_debug { - const char *command; - - if (!(interp->pdb->state & PDB_BREAK)) { - interp->pdb->state |= PDB_BREAK; - interp->pdb->state |= PDB_STOPPED; - interp->pdb->cur_opcode = (opcode_t *)cur_opcode + 1; - PDB_set_break(interp, NULL); - while (!(interp->pdb->state & PDB_EXIT)) { - PDB_get_command(interp); - command = interp->pdb->cur_command; - PDB_run_command(interp, command); - } - /* RT#42378 this is not ok */ - exit(EXIT_SUCCESS); - } - interp->pdb->cur_opcode = (opcode_t *)cur_opcode + 1; - PDB_set_break(interp, NULL); + Parrot_debugger_break(interp, cur_opcode); } ######################################## Index: src/debug.c =================================================================== --- src/debug.c (revisión: 28719) +++ src/debug.c (copia de trabajo) @@ -36,7 +36,51 @@ IMCC_warning(PARROT_INTERP, ARGIN(const char *fmt), ...); extern void imcc_init(PARROT_INTERP); +/* + * These constants correspond to the debugger commands. + * To map command strings to their numeric values, + * use the algorithm from parse_command(). + */ +enum DebugCmd { + debug_cmd_b = 25245, + debug_cmd_c = 25500, + debug_cmd_d = 25755, + debug_cmd_e = 26010, + debug_cmd_h = 26775, + debug_cmd_i = 27030, + debug_cmd_l = 27795, + debug_cmd_n = 28305, + debug_cmd_p = 28815, + debug_cmd_q = 29070, + debug_cmd_r = 29325, + debug_cmd_s = 29580, + debug_cmd_t = 29835, + debug_cmd_w = 30600, + debug_cmd_int = 175185, + debug_cmd_run = 176460, + debug_cmd_num = 174675, + debug_cmd_str = 179265, + debug_cmd_pmc = 163455, + debug_cmd_eval = 277950, + debug_cmd_help = 282540, + debug_cmd_info = 281775, + debug_cmd_list = 295035, + debug_cmd_load = 268005, + debug_cmd_next = 297330, + debug_cmd_quit = 294780, + debug_cmd_break = 409785, + debug_cmd_print = 441150, + debug_cmd_stack = 414120, + debug_cmd_trace = 405705, + debug_cmd_watch = 416160, + debug_cmd_enable = 571455, + debug_cmd_delete = 588285, + debug_cmd_script_file = 617610, + debug_cmd_disable = 772140, + debug_cmd_continue = 1053405, + debug_cmd_disassemble = 1903830 +}; /* HEADERIZER HFILE: include/parrot/debug.h */ @@ -357,6 +401,83 @@ /* +=item C<void Parrot_debugger_init> + +Init the parrot debugger, if not already done. + +=item C<void Parrot_debugger_load> + +Load a Parrot source file for the current program. + +=item C<void Parrot_debugger_break> + +Break execution and drop into the debugger. +If we are already into the debugger and is the first time we are +called set a breakpoint. + +When you re run/continue the program begin debugged it will pay +no attention to the debug ops. + +RT#42377: clone the interpreter to allow people to play into the +debugger and then continue the normal execution of the program. + +=cut + +*/ + +void +Parrot_debugger_init(PARROT_INTERP) +{ + if (!(interp->pdb)) { + PDB_t * pdb = (PDB_t *)mem_sys_allocate_zeroed(sizeof (PDB_t)); + + interp->pdb = pdb; + pdb->cur_opcode = interp->code->base.data; + pdb->state |= PDB_RUNNING; + } +} + +void +Parrot_debugger_load(PARROT_INTERP, ARGIN_NULLOK(STRING *filename)) +{ + if (!(interp->pdb)) + real_exception(interp, NULL, 0, "No debugger"); + else { + char *f= string_to_cstring(interp, filename); + PDB_load_source(interp, f); + string_cstring_free(f); + } +} + +void +Parrot_debugger_break(PARROT_INTERP, ARGIN(opcode_t * cur_opcode)) +{ + if (!(interp->pdb)) + real_exception(interp, NULL, 0, "No debugger"); + if (!(interp->pdb->file)) + real_exception(interp, NULL, 0, "No file loaded to debug"); + + if (!(interp->pdb->state & PDB_BREAK)) { + const char * command; + + interp->pdb->state |= PDB_BREAK; + interp->pdb->state |= PDB_STOPPED; + interp->pdb->cur_opcode = (opcode_t *)cur_opcode + 1; + PDB_set_break(interp, NULL); + while (!(interp->pdb->state & PDB_EXIT)) { + PDB_get_command(interp); + command = interp->pdb->cur_command; + PDB_run_command(interp, command); + } + /* RT#42378 this is not ok */ + exit(EXIT_SUCCESS); + } + interp->pdb->cur_opcode = (opcode_t *)cur_opcode + 1; + PDB_set_break(interp, NULL); +} + +/* + =item C<void PDB_get_command> Get a command from the user input to execute. @@ -521,75 +642,75 @@ else return 0; - switch (c) { - case PARROT_c_script_file: + switch ((enum DebugCmd)c) { + case debug_cmd_script_file: PDB_script_file(interp, command); break; - case PARROT_c_disassemble: + case debug_cmd_disassemble: PDB_disassemble(interp, command); break; - case PARROT_c_load: + case debug_cmd_load: PDB_load_source(interp, command); break; - case PARROT_c_l: - case PARROT_c_list: + case debug_cmd_l: + case debug_cmd_list: PDB_list(interp, command); break; - case PARROT_c_b: - case PARROT_c_break: + case debug_cmd_b: + case debug_cmd_break: PDB_set_break(interp, command); break; - case PARROT_c_w: - case PARROT_c_watch: + case debug_cmd_w: + case debug_cmd_watch: PDB_watchpoint(interp, command); break; - case PARROT_c_d: - case PARROT_c_delete: + case debug_cmd_d: + case debug_cmd_delete: PDB_delete_breakpoint(interp, command); break; - case PARROT_c_disable: + case debug_cmd_disable: PDB_disable_breakpoint(interp, command); break; - case PARROT_c_enable: + case debug_cmd_enable: PDB_enable_breakpoint(interp, command); break; - case PARROT_c_r: - case PARROT_c_run: + case debug_cmd_r: + case debug_cmd_run: PDB_init(interp, command); PDB_continue(interp, NULL); break; - case PARROT_c_c: - case PARROT_c_continue: + case debug_cmd_c: + case debug_cmd_continue: PDB_continue(interp, command); break; - case PARROT_c_p: - case PARROT_c_print: + case debug_cmd_p: + case debug_cmd_print: PDB_print(interp, command); break; - case PARROT_c_n: - case PARROT_c_next: + case debug_cmd_n: + case debug_cmd_next: PDB_next(interp, command); break; - case PARROT_c_t: - case PARROT_c_trace: + case debug_cmd_t: + case debug_cmd_trace: PDB_trace(interp, command); break; - case PARROT_c_e: - case PARROT_c_eval: + case debug_cmd_e: + case debug_cmd_eval: PDB_eval(interp, command); break; - case PARROT_c_info: + case debug_cmd_info: PDB_info(interp); break; - case PARROT_c_h: - case PARROT_c_help: + case debug_cmd_h: + case debug_cmd_help: PDB_help(interp, command); break; - case PARROT_c_q: - case PARROT_c_quit: + case debug_cmd_q: + case debug_cmd_quit: pdb->state |= PDB_EXIT; break; - case 0: + case (enum DebugCmd)0: if (pdb->last_command) PDB_run_command(interp, pdb->last_command); break; @@ -2319,39 +2440,6 @@ /* -=item C<int PDB_extend_const_table> - -Extend the constant table. - -=cut - -*/ - -int -PDB_extend_const_table(PARROT_INTERP) -{ - int k = ++interp->code->const_table->const_count; - - /* Update the constant count and reallocate */ - if (interp->code->const_table->constants) { - interp->code->const_table->constants = - (PackFile_Constant **)mem_sys_realloc(interp->code->const_table->constants, - k * sizeof (PackFile_Constant *)); - } - else { - interp->code->const_table->constants = - (PackFile_Constant **)mem_sys_allocate(k * sizeof (PackFile_Constant *)); - } - - /* Allocate a new constant */ - interp->code->const_table->constants[--k] = - PackFile_Constant_new(interp); - - return k; -} - -/* - =item C<static void dump_string> Dumps the buflen, flags, bufused, strlen, and offset associated with a string @@ -2457,25 +2545,25 @@ parse_command(command, &c); switch (c) { - case PARROT_c_disassemble: + case debug_cmd_disassemble: PIO_eprintf(interp, "No documentation yet"); break; - case PARROT_c_load: + case debug_cmd_load: PIO_eprintf(interp, "No documentation yet"); break; - case PARROT_c_list: + case debug_cmd_list: PIO_eprintf(interp, "List the source code.\n\n\ Optionally specify the line number to begin the listing from and the number\n\ of lines to display.\n"); break; - case PARROT_c_run: + case debug_cmd_run: PIO_eprintf(interp, "Run (or restart) the program being debugged.\n\n\ Arguments specified after \"run\" are passed as command line arguments to\n\ the program.\n"); break; - case PARROT_c_break: + case debug_cmd_break: PIO_eprintf(interp, "Set a breakpoint at a given line number (which must be specified).\n\n\ Optionally, specify a condition, in which case the breakpoint will only\n\ @@ -2487,32 +2575,32 @@ break 45 if S1 == \"foo\"\n\n\ The command returns a number which is the breakpoint identifier."); break; - case PARROT_c_script_file: + case debug_cmd_script_file: PIO_eprintf(interp, "Interprets a file.\n\ Usage:\n\ (pdb) script file.script\n"); break; - case PARROT_c_watch: + case debug_cmd_watch: PIO_eprintf(interp, "No documentation yet"); break; - case PARROT_c_delete: + case debug_cmd_delete: PIO_eprintf(interp, "Delete a breakpoint.\n\n\ The breakpoint to delete must be specified by its breakpoint number.\n\ Deleted breakpoints are gone completely. If instead you want to\n\ temporarily disable a breakpoint, use \"disable\".\n"); break; - case PARROT_c_disable: + case debug_cmd_disable: PIO_eprintf(interp, "Disable a breakpoint.\n\n\ The breakpoint to disable must be specified by its breakpoint number.\n\ Disabled breakpoints are not forgotten, but have no effect until re-enabled\n\ with the \"enable\" command.\n"); break; - case PARROT_c_enable: + case debug_cmd_enable: PIO_eprintf(interp, "Re-enable a disabled breakpoint.\n"); break; - case PARROT_c_continue: + case debug_cmd_continue: PIO_eprintf(interp, "Continue the program execution.\n\n\ Without arguments, the program runs until a breakpoint is found\n\ @@ -2521,7 +2609,7 @@ If the program has terminated, then \"continue\" will do nothing;\n\ use \"run\" to re-run the program.\n"); break; - case PARROT_c_next: + case debug_cmd_next: PIO_eprintf(interp, "Execute a specified number of instructions.\n\n\ If a number is specified with the command (e.g. \"next 5\"), then\n\ @@ -2529,28 +2617,28 @@ breakpoint, or stops for some other reason.\n\n\ If no number is specified, it defaults to 1.\n"); break; - case PARROT_c_eval: + case debug_cmd_eval: PIO_eprintf(interp, "No documentation yet"); break; - case PARROT_c_trace: + case debug_cmd_trace: PIO_eprintf(interp, "Similar to \"next\", but prints additional trace information.\n\ This is the same as the information you get when running Parrot with\n\ the -t option.\n"); break; - case PARROT_c_print: + case debug_cmd_print: PIO_eprintf(interp, "Print register: e.g. \"p i2\"\n\ Note that the register type is case-insensitive. If no digits appear\n\ after the register type, all registers of that type are printed.\n"); break; - case PARROT_c_info: + case debug_cmd_info: PIO_eprintf(interp, "Print information about the current interpreter\n"); break; - case PARROT_c_quit: + case debug_cmd_quit: PIO_eprintf(interp, "Exit the debugger.\n"); break; - case PARROT_c_help: + case debug_cmd_help: PIO_eprintf(interp, "Print a list of available commands.\n"); break; case 0: Index: include/parrot/debug.h =================================================================== --- include/parrot/debug.h (revisión: 28719) +++ include/parrot/debug.h (copia de trabajo) @@ -172,6 +172,16 @@ /* HEADERIZER BEGIN: src/debug.c */ /* Don't modify between HEADERIZER BEGIN / HEADERIZER END. Your changes will be lost. */ +void Parrot_debugger_break(PARROT_INTERP, ARGIN(opcode_t * cur_opcode)) + __attribute__nonnull__(1) + __attribute__nonnull__(2); + +void Parrot_debugger_init(PARROT_INTERP) + __attribute__nonnull__(1); + +void Parrot_debugger_load(PARROT_INTERP, ARGIN_NULLOK(STRING *filename)) + __attribute__nonnull__(1); + long PDB_add_label( ARGMOD(PDB_file_t *file), ARGIN(const opcode_t *cur_opcode), @@ -249,9 +259,6 @@ __attribute__nonnull__(1) __attribute__nonnull__(2); -int PDB_extend_const_table(PARROT_INTERP) - __attribute__nonnull__(1); - PARROT_CAN_RETURN_NULL PARROT_WARN_UNUSED_RESULT PDB_breakpoint_t * PDB_find_breakpoint(PARROT_INTERP, @@ -327,51 +334,6 @@ /* Don't modify between HEADERIZER BEGIN / HEADERIZER END. Your changes will be lost. */ /* HEADERIZER END: src/debug.c */ - -/* - * These constants correspond to the debugger commands and are - * used in src/debug.c. To map command strings to their - * numeric values, use the algorithm from parse_command() in that file. - */ - -#define PARROT_c_b 25245 -#define PARROT_c_c 25500 -#define PARROT_c_d 25755 -#define PARROT_c_e 26010 -#define PARROT_c_h 26775 -#define PARROT_c_i 27030 -#define PARROT_c_l 27795 -#define PARROT_c_n 28305 -#define PARROT_c_p 28815 -#define PARROT_c_q 29070 -#define PARROT_c_r 29325 -#define PARROT_c_s 29580 -#define PARROT_c_t 29835 -#define PARROT_c_w 30600 -#define PARROT_c_int 175185 -#define PARROT_c_run 176460 -#define PARROT_c_num 174675 -#define PARROT_c_str 179265 -#define PARROT_c_pmc 163455 -#define PARROT_c_eval 277950 -#define PARROT_c_help 282540 -#define PARROT_c_info 281775 -#define PARROT_c_list 295035 -#define PARROT_c_load 268005 -#define PARROT_c_next 297330 -#define PARROT_c_quit 294780 -#define PARROT_c_break 409785 -#define PARROT_c_print 441150 -#define PARROT_c_stack 414120 -#define PARROT_c_trace 405705 -#define PARROT_c_watch 416160 -#define PARROT_c_enable 571455 -#define PARROT_c_delete 588285 -#define PARROT_c_script_file 617610 -#define PARROT_c_disable 772140 -#define PARROT_c_continue 1053405 -#define PARROT_c_disassemble 1903830 - #endif /* PARROT_PDB_H_GUARD */ /* Index: compilers/imcc/pbc.c =================================================================== --- compilers/imcc/pbc.c (revisión: 28719) +++ compilers/imcc/pbc.c (copia de trabajo) @@ -112,6 +112,15 @@ __attribute__nonnull__(1) __attribute__nonnull__(2); +static int add_const_table(PARROT_INTERP) + __attribute__nonnull__(1); + +static int add_const_table_key(PARROT_INTERP, PMC *key) + __attribute__nonnull__(1); + +static int add_const_table_pmc(PARROT_INTERP, PMC *pmc) + __attribute__nonnull__(1); + static opcode_t build_key(PARROT_INTERP, ARGIN(SymReg *key_reg)) __attribute__nonnull__(1) __attribute__nonnull__(2); @@ -256,6 +265,80 @@ /* +=item C<static int add_const_table> + +Add empty item to constant table, return position of the item added. + +=cut + +*/ + +static int +add_const_table(PARROT_INTERP) +{ + const size_t oldcount= interp->code->const_table->const_count; + const size_t newcount= oldcount + 1; + + /* Allocate a new constant */ + PackFile_Constant * new_constant = PackFile_Constant_new(interp); + + /* Update the constant count and reallocate */ + if (interp->code->const_table->constants) { + interp->code->const_table->constants = + (PackFile_Constant **)mem_sys_realloc(interp->code->const_table->constants, + newcount * sizeof (PackFile_Constant *)); + } + else { + interp->code->const_table->constants = + (PackFile_Constant **)mem_sys_allocate(newcount * sizeof (PackFile_Constant *)); + } + + interp->code->const_table->constants[newcount - 1] = new_constant; + + interp->code->const_table->const_count = newcount; + return newcount - 1; +} + +/* + +=item C<static int add_const_table_pmc> + +Add pmc to const table, return position of the item added. + +=cut + +*/ + +static int +add_const_table_pmc(PARROT_INTERP, PMC *pmc) +{ + int newitem = add_const_table(interp); + interp->code->const_table->constants[newitem]->type = PFC_PMC; + interp->code->const_table->constants[newitem]->u.key = pmc; + return newitem; +} + +/* + +=item C<static int add_const_table_key> + +Add key to const table, return position of the item added. + +=cut + +*/ + +static int +add_const_table_key(PARROT_INTERP, PMC *key) +{ + int newitem = add_const_table(interp); + interp->code->const_table->constants[newitem]->type = PFC_KEY; + interp->code->const_table->constants[newitem]->u.key = key; + return newitem; +} + +/* + =item C<int e_pbc_open> RT#48260: Not yet documented!!! @@ -294,7 +377,6 @@ /* we need some segments */ if (!interp->code) { PMC *self; - int k; cs->seg = interp->code = PF_create_default_segs(interp, @@ -308,10 +390,7 @@ */ self = VTABLE_get_pmc_keyed_int(interp, interp->iglobals, IGLOBALS_INTERPRETER); - k = PDB_extend_const_table(interp); - - interp->code->const_table->constants[k]->type = PFC_PMC; - interp->code->const_table->constants[k]->u.key = self; + (void) add_const_table_pmc(interp, self); } globals.cs = cs; @@ -766,7 +845,7 @@ static int add_const_str(PARROT_INTERP, ARGIN(const SymReg *r)) { - const int k = PDB_extend_const_table(interp); + const int k = add_const_table(interp); STRING * const s = IMCC_string_from_reg(interp, r); interp->code->const_table->constants[k]->type = PFC_STRING; @@ -789,7 +868,7 @@ static int add_const_num(PARROT_INTERP, ARGIN_NULLOK(const char *buf)) { - const int k = PDB_extend_const_table(interp); + const int k = add_const_table(interp); STRING * const s = string_from_cstring(interp, buf, 0); interp->code->const_table->constants[k]->type = PFC_NUMBER; @@ -1004,7 +1083,7 @@ PMC *sub_pmc; Parrot_sub *sub; - int k = PDB_extend_const_table(interp); + const int k = add_const_table(interp); IMC_Unit * const unit = globals.cs->subs->unit; PackFile_ConstTable *ct = interp->code->const_table; PackFile_Constant *pfc = ct->constants[k]; @@ -1188,11 +1267,8 @@ "add_const_key: PackFile_Constant error\n"); } - k = PDB_extend_const_table(interp); + k = add_const_table_key(interp, pfc->u.key); - interp->code->const_table->constants[k]->type = PFC_KEY; - interp->code->const_table->constants[k]->u.key = pfc->u.key; - store_key_const(s_key, k); IMCC_debug(interp, DEBUG_PBC_CONST, "\t=> %s #%d size %d\n", @@ -1442,11 +1518,8 @@ p = VTABLE_new_from_string(interp, _class, s, PObj_constant_FLAG); /* append PMC constant */ - k = PDB_extend_const_table(interp); + k = add_const_table_pmc(interp, p); - interp->code->const_table->constants[k]->type = PFC_PMC; - interp->code->const_table->constants[k]->u.key = p; - r->color = k; } @@ -1693,11 +1766,7 @@ if (changed_sig) { /* append PMC constant */ - const int k = PDB_extend_const_table(interp); - - interp->code->const_table->constants[k]->type = PFC_PMC; - interp->code->const_table->constants[k]->u.key = changed_sig; - + const int k = add_const_table_pmc(interp, changed_sig); pc[-1] = k; } }