diff options
author | Juergen Kahrs <Juergen.Kahrs@googlemail.com> | 2013-12-23 18:26:45 +0100 |
---|---|---|
committer | Juergen Kahrs <Juergen.Kahrs@googlemail.com> | 2013-12-23 18:26:45 +0100 |
commit | ee9707cc44eea3ca64cb71666ac3e8ed26a3bb7f (patch) | |
tree | 3945f1b3afd64a7147582611f21b7f5e59891e41 /eval.c | |
parent | 0ac63db595a009d1f07dba8246e52710348b0798 (diff) | |
parent | c66f7da30bb5635957b6e68c1e1db7e77e7b4174 (diff) | |
download | egawk-ee9707cc44eea3ca64cb71666ac3e8ed26a3bb7f.tar.gz egawk-ee9707cc44eea3ca64cb71666ac3e8ed26a3bb7f.tar.bz2 egawk-ee9707cc44eea3ca64cb71666ac3e8ed26a3bb7f.zip |
Merge remote-tracking branch 'origin/master' into cmake
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 13 |
1 files changed, 10 insertions, 3 deletions
@@ -440,6 +440,7 @@ flags2str(int flagval) { WSTRCUR, "WSTRCUR" }, { MPFN, "MPFN" }, { MPZN, "MPZN" }, + { NULL_FIELD, "NULL_FIELD" }, { ARRAYMAXED, "ARRAYMAXED" }, { HALFHAT, "HALFHAT" }, { XARRAY, "XARRAY" }, @@ -1180,7 +1181,7 @@ r_get_field(NODE *n, Func_ptr *assign, bool reference) *assign = reset_record; } else lhs = get_field(field_num, assign); - if (do_lint && reference && (*lhs == Null_field || *lhs == Nnull_string)) + if (do_lint && reference && ((*lhs)->flags & NULL_FIELD) != 0) lintwarn(_("reference to uninitialized field `$%ld'"), field_num); return lhs; @@ -1240,7 +1241,7 @@ setup_frame(INSTRUCTION *pc) arg_count = (pc + 1)->expr_count; /* tail recursion optimization */ - tail_optimize = ((pc + 1)->tail_call && do_optimize > 1 + tail_optimize = ((pc + 1)->tail_call && do_optimize && ! do_debug && ! do_profile); if (tail_optimize) { @@ -1462,7 +1463,13 @@ unwind_stack(long n) freenode(r); break; default: - if (in_main_context()) + /* + * Check `exiting' and don't produce an error for + * cases like: + * func _fn0() { exit } + * BEGIN { ARRAY[_fn0()] } + */ + if (in_main_context() && ! exiting) fatal(_("unwind_stack: unexpected type `%s'"), nodetype2str(r->type)); /* else |