aboutsummaryrefslogtreecommitdiffstats
path: root/symbol.c
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 /symbol.c
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.
Diffstat (limited to 'symbol.c')
-rw-r--r--symbol.c5
1 files changed, 4 insertions, 1 deletions
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;