diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2011-10-09 21:22:55 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2011-10-09 21:22:55 +0200 |
commit | 06f3e569c7c153a5d0f2dc5667822c562e77ca9f (patch) | |
tree | 2a7c5ba3d7fa182edd3cf5d93d0629da22ae9880 /debug.c | |
parent | 194d9dc454d361ee5c707e71a5e3512fbe3a71cd (diff) | |
parent | 35d9ad9209592594905d1c8f15130d09af111411 (diff) | |
download | egawk-06f3e569c7c153a5d0f2dc5667822c562e77ca9f.tar.gz egawk-06f3e569c7c153a5d0f2dc5667822c562e77ca9f.tar.bz2 egawk-06f3e569c7c153a5d0f2dc5667822c562e77ca9f.zip |
Merge branch 'gawk-4.0-stable'
Diffstat (limited to 'debug.c')
-rw-r--r-- | debug.c | 56 |
1 files changed, 47 insertions, 9 deletions
@@ -39,6 +39,7 @@ extern long fcall_count; extern FILE *output_fp; extern IOBUF *curfile; extern const char *command_file; +extern const char *get_spec_varname(Func_ptr fptr); extern int r_interpret(INSTRUCTION *); extern int zzparse(void); #define read_command() (void) zzparse() @@ -3736,11 +3737,19 @@ print_instruction(INSTRUCTION *pc, Func_print print_func, FILE *fp, int in_dump) switch (pc->opcode) { case Op_var_update: - print_func(fp, "[update_%s]\n", pc->memory->vname); + print_func(fp, "[update_%s()]\n", get_spec_varname(pc->update_var)); break; case Op_var_assign: - print_func(fp, "[set_%s]\n", pc->memory->vname); + print_func(fp, "[set_%s()]", get_spec_varname(pc->assign_var)); + if (pc->assign_ctxt != 0) + print_func(fp, " [assign_ctxt = %s]", opcode2str(pc->assign_ctxt)); + print_func(fp, "\n"); + break; + + case Op_field_assign: + print_func(fp, "[%s]\n", pc->field_assign == reset_record ? + "reset_record()" : "invalidate_field0()"); break; case Op_field_spec_lhs: @@ -3787,9 +3796,19 @@ print_instruction(INSTRUCTION *pc, Func_print print_func, FILE *fp, int in_dump) break; case Op_K_nextfile: + print_func(fp, "[target_newfile = %p] [target_endfile = %p]\n", + pc->target_newfile, pc->target_endfile); + break; + case Op_newfile: print_func(fp, "[target_jmp = %p] [target_endfile = %p]\n", pc->target_jmp, pc->target_endfile); + print_func(fp, "%*s[target_get_record = %p]\n", + noffset, "", (pc + 1)->target_get_record); + break; + + case Op_get_record: + print_func(fp, "[target_newfile = %p]\n", pc->target_newfile); break; case Op_jmp: @@ -3830,6 +3849,26 @@ print_instruction(INSTRUCTION *pc, Func_print print_func, FILE *fp, int in_dump) pc->line_range, pc->target_jmp); break; + case Op_sub_builtin: + { + const char *fname = "sub"; + static const struct flagtab values[] = { + { GSUB, "GSUB" }, + { GENSUB, "GENSUB" }, + { LITERAL, "LITERAL" }, + { 0, NULL } + }; + + if (pc->sub_flags & GSUB) + fname = "gsub"; + else if (pc->sub_flags & GENSUB) + fname = "gensub"; + print_func(fp, "%s [arg_count = %ld] [sub_flags = %s]\n", + fname, pc->expr_count, + genflags2str(pc->sub_flags, values)); + } + break; + case Op_builtin: { const char *fname = getfname(pc->builtin); @@ -5345,28 +5384,27 @@ pre_execute_code(INSTRUCTION **pi) return (ei == *pi); } -extern void unwind_stack(STACK_ITEM *sp_bottom); +extern INSTRUCTION *unwind_stack(long n); static NODE * execute_code(volatile INSTRUCTION *code) { volatile NODE *r = NULL; volatile jmp_buf fatal_tag_stack; - STACK_ITEM *ctxt_stack_bottom; + long save_stack_size; /* We use one global stack for all contexts. - * Remember stack bottom for current context; in case of - * a fatal error, unwind stack until stack_ptr is below that 'bottom'. + * Save # of items in stack; in case of + * a fatal error, pop stack until it has that many items. */ - ctxt_stack_bottom = stack_ptr + 1; + save_stack_size = (stack_ptr - stack_bottom) + 1; PUSH_BINDING(fatal_tag_stack, fatal_tag, fatal_tag_valid); if (setjmp(fatal_tag) == 0) { (void) r_interpret((INSTRUCTION *) code); - assert(stack_ptr == ctxt_stack_bottom); r = POP_SCALAR(); } else /* fatal error */ - unwind_stack(ctxt_stack_bottom); + (void) unwind_stack(save_stack_size); POP_BINDING(fatal_tag_stack, fatal_tag, fatal_tag_valid); |