aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-04-14 06:07:59 -0700
committerKaz Kylheku <kaz@kylheku.com>2022-04-14 06:07:59 -0700
commit71937179ae771612b60fd7c5b08212e38c6f0ddb (patch)
treea8c35a5f0d0d7d9d9a0bd2e1de4f5960b9b9385a
parenta254e53a2c41763dec57ed213dfbd3fc4463acec (diff)
downloadegawk-71937179ae771612b60fd7c5b08212e38c6f0ddb.tar.gz
egawk-71937179ae771612b60fd7c5b08212e38c6f0ddb.tar.bz2
egawk-71937179ae771612b60fd7c5b08212e38c6f0ddb.zip
@let: fix double removal of locals after compiling function.
* symbol.c (remove_locals): Iterate only up to param_cnt, like in upstream Gawk. The locals above param_cnt have been freed by the @let logic in the parser. Iterating up to frame_cnt here was a leftover from the experimental @local implementation that was a precursor to @let. * awkgram.y (mk_function): Update comment above call to remove_locals.
-rw-r--r--awkgram.y2
-rw-r--r--symbol.c5
2 files changed, 5 insertions, 2 deletions
diff --git a/awkgram.y b/awkgram.y
index 423cf66b..4f568e22 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -5208,7 +5208,7 @@ mk_function(INSTRUCTION *fi, INSTRUCTION *def)
/* update lint table info */
func_use(thisfunc->vname, FUNC_DEFINE);
- /* remove params/locals from symbol table */
+ /* remove params from symbol table */
remove_locals(thisfunc);
return fi;
}
diff --git a/symbol.c b/symbol.c
index afa38f1b..9f40568a 100644
--- a/symbol.c
+++ b/symbol.c
@@ -266,7 +266,10 @@ remove_locals(NODE *func)
assert(func->type == Node_func);
- if ( (pcount = func->frame_cnt) <= 0
+ /* Only remove up to param_cnt. The @let locals from param_cnt to frame_cnt
+ * should have already been removed by the parser.
+ */
+ if ( (pcount = func->param_cnt) <= 0
|| (parms = func->fparms) == NULL)
return;