From 46f2db24d9e7f792f60149f5ee89ef4f22e3f4a9 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Fri, 15 Jul 2011 15:35:34 +0300 Subject: Fix gsub losing white space when working on fields. --- debug.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) (limited to 'debug.c') diff --git a/debug.c b/debug.c index 9b9db345..404042c1 100644 --- a/debug.c +++ b/debug.c @@ -3740,7 +3740,16 @@ print_instruction(INSTRUCTION *pc, Func_print print_func, FILE *fp, int in_dump) break; case Op_var_assign: - print_func(fp, "[set_%s]\n", pc->memory->vname); + if (pc->assign_var) + print_func(fp, "[set_%s()]", pc->memory->vname); + print_func(fp, "\n"); + break; + + case Op_field_assign: + if (pc->field_assign) + print_func(fp, "[%s]", pc->field_assign == reset_record ? + "reset_record()" : "invalidate_field0()"); + print_func(fp, "\n"); break; case Op_field_spec_lhs: @@ -3830,6 +3839,27 @@ 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" }, + { AFTER_ASSIGN, "AFTER_ASSIGN" }, + { 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); -- cgit v1.2.3 From 452f4efefd5511bc7dbe95b0167b10b403cdcf45 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Tue, 26 Jul 2011 06:05:42 +0300 Subject: Fix gsub and getline pass by reference. Add tests. --- debug.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'debug.c') diff --git a/debug.c b/debug.c index 404042c1..4cda95c8 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,20 +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: - if (pc->assign_var) - print_func(fp, "[set_%s()]", 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: - if (pc->field_assign) - print_func(fp, "[%s]", pc->field_assign == reset_record ? + print_func(fp, "[%s]\n", pc->field_assign == reset_record ? "reset_record()" : "invalidate_field0()"); - print_func(fp, "\n"); break; case Op_field_spec_lhs: @@ -3843,9 +3843,8 @@ print_instruction(INSTRUCTION *pc, Func_print print_func, FILE *fp, int in_dump) { const char *fname = "sub"; static const struct flagtab values[] = { - { GSUB, "GSUB" }, + { GSUB, "GSUB" }, { GENSUB, "GENSUB" }, - { AFTER_ASSIGN, "AFTER_ASSIGN" }, { LITERAL, "LITERAL" }, { 0, NULL } }; -- cgit v1.2.3 From b8c993f5a867f38fa9edd343d7d90b4b36800be2 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Wed, 10 Aug 2011 22:36:00 +0300 Subject: BEGINFILE/ENDFILE code redone. --- debug.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) (limited to 'debug.c') diff --git a/debug.c b/debug.c index 4cda95c8..29ce8b1a 100644 --- a/debug.c +++ b/debug.c @@ -3796,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: @@ -5374,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); -- cgit v1.2.3