aboutsummaryrefslogtreecommitdiffstats
path: root/debug.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2011-10-09 21:22:55 +0200
committerArnold D. Robbins <arnold@skeeve.com>2011-10-09 21:22:55 +0200
commit06f3e569c7c153a5d0f2dc5667822c562e77ca9f (patch)
tree2a7c5ba3d7fa182edd3cf5d93d0629da22ae9880 /debug.c
parent194d9dc454d361ee5c707e71a5e3512fbe3a71cd (diff)
parent35d9ad9209592594905d1c8f15130d09af111411 (diff)
downloadegawk-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.c56
1 files changed, 47 insertions, 9 deletions
diff --git a/debug.c b/debug.c
index 9b9db345..29ce8b1a 100644
--- a/debug.c
+++ b/debug.c
@@ -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);