aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2022-03-27 08:07:51 +0300
committerArnold D. Robbins <arnold@skeeve.com>2022-03-27 08:07:51 +0300
commitc2f6af30f602aa1a28e59491cbbfcf9145350f78 (patch)
tree0ce9863bebfb4e8b925f16b741a6d793dee1395f
parent0cdb4a0e28663cde0937601d26789ba5a6697848 (diff)
parent656b5bbec59a3094ae13f3bdac7ae2ef1e2fb5e9 (diff)
downloadegawk-c2f6af30f602aa1a28e59491cbbfcf9145350f78.tar.gz
egawk-c2f6af30f602aa1a28e59491cbbfcf9145350f78.tar.bz2
egawk-c2f6af30f602aa1a28e59491cbbfcf9145350f78.zip
Merge branch 'gawk-5.1-stable'
-rw-r--r--ChangeLog8
-rw-r--r--awkgram.c14
-rw-r--r--awkgram.y14
-rw-r--r--pc/ChangeLog4
-rw-r--r--pc/Makefile.tst7
-rw-r--r--test/ChangeLog5
-rw-r--r--test/Makefile.am4
-rw-r--r--test/Makefile.in9
-rw-r--r--test/Maketests5
-rw-r--r--test/indirectcall3.awk16
-rw-r--r--test/indirectcall3.ok0
11 files changed, 69 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index 434748d9..92095c38 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2022-03-27 Arnold D. Robbins <arnold@skeeve.com>
+
+ Allow nested indirect function calls. Thanks to
+ Kaz Kylheku <kaz@kylheku.com> for the report.
+
+ * awkgram.y (at_seen): Turn into an int that is incremented
+ and decremented as appropriate.
+
2022-03-22 Arnold D. Robbins <arnold@skeeve.com>
Make lint checks for builtin functions smarter. Initial
diff --git a/awkgram.c b/awkgram.c
index a4aa170d..6686d27e 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -156,7 +156,7 @@ static void merge_comments(INSTRUCTION *c1, INSTRUCTION *c2);
static INSTRUCTION *make_braced_statements(INSTRUCTION *lbrace, INSTRUCTION *stmts, INSTRUCTION *rbrace);
static void add_sign_to_num(NODE *n, char sign);
-static bool at_seen = false;
+static int at_seen = 0;
static bool want_source = false;
static bool want_namespace = false;
static bool want_regexp = false; /* lexical scanning kludge */
@@ -2056,7 +2056,7 @@ yyreduce:
#line 301 "awkgram.y"
{
want_source = false;
- at_seen = false;
+ at_seen--;
if (yyvsp[-1] != NULL && yyvsp[0] != NULL) {
SRCFILE *s = (SRCFILE *) yyvsp[-1];
s->comment = yyvsp[0];
@@ -2070,7 +2070,7 @@ yyreduce:
#line 311 "awkgram.y"
{
want_source = false;
- at_seen = false;
+ at_seen--;
if (yyvsp[-1] != NULL && yyvsp[0] != NULL) {
SRCFILE *s = (SRCFILE *) yyvsp[-1];
s->comment = yyvsp[0];
@@ -2097,7 +2097,7 @@ yyreduce:
want_source = false;
want_namespace = false;
- at_seen = false;
+ at_seen--;
// this frees $3 storage in all cases
set_namespace(yyvsp[-1], yyvsp[0]);
@@ -2328,7 +2328,7 @@ yyreduce:
#line 505 "awkgram.y"
{
yyval = yyvsp[0];
- at_seen = false;
+ at_seen--;
}
#line 2334 "awkgram.c"
break;
@@ -4297,7 +4297,7 @@ regular_print:
*/
yyval = list_prepend(yyvsp[0], t);
- at_seen = false;
+ at_seen--;
}
#line 4303 "awkgram.c"
break;
@@ -6299,7 +6299,7 @@ retry:
goto collect_regexp;
}
pushback();
- at_seen = true;
+ at_seen++;
return lasttok = '@';
case '\\':
diff --git a/awkgram.y b/awkgram.y
index 6f66fb53..08ee381c 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -111,7 +111,7 @@ static void merge_comments(INSTRUCTION *c1, INSTRUCTION *c2);
static INSTRUCTION *make_braced_statements(INSTRUCTION *lbrace, INSTRUCTION *stmts, INSTRUCTION *rbrace);
static void add_sign_to_num(NODE *n, char sign);
-static bool at_seen = false;
+static int at_seen = 0;
static bool want_source = false;
static bool want_namespace = false;
static bool want_regexp = false; /* lexical scanning kludge */
@@ -300,7 +300,7 @@ rule
| '@' LEX_INCLUDE source statement_term
{
want_source = false;
- at_seen = false;
+ at_seen--;
if ($3 != NULL && $4 != NULL) {
SRCFILE *s = (SRCFILE *) $3;
s->comment = $4;
@@ -310,7 +310,7 @@ rule
| '@' LEX_LOAD library statement_term
{
want_source = false;
- at_seen = false;
+ at_seen--;
if ($3 != NULL && $4 != NULL) {
SRCFILE *s = (SRCFILE *) $3;
s->comment = $4;
@@ -333,7 +333,7 @@ rule
want_source = false;
want_namespace = false;
- at_seen = false;
+ at_seen--;
// this frees $3 storage in all cases
set_namespace($3, $4);
@@ -504,7 +504,7 @@ func_name
| '@' LEX_EVAL
{
$$ = $2;
- at_seen = false;
+ at_seen--;
}
;
@@ -2041,7 +2041,7 @@ func_call
*/
$$ = list_prepend($2, t);
- at_seen = false;
+ at_seen--;
}
;
@@ -3791,7 +3791,7 @@ retry:
goto collect_regexp;
}
pushback();
- at_seen = true;
+ at_seen++;
return lasttok = '@';
case '\\':
diff --git a/pc/ChangeLog b/pc/ChangeLog
index 342ae067..ab61b56c 100644
--- a/pc/ChangeLog
+++ b/pc/ChangeLog
@@ -1,3 +1,7 @@
+2022-03-27 Arnold D. Robbins <arnold@skeeve.com>
+
+ * Makefile.tst: Regenerated.
+
2022-12-10 Andrew J. Schorr <aschorr@telemetry-investments.com>
* Makefile.tst: Regenerated.
diff --git a/pc/Makefile.tst b/pc/Makefile.tst
index d74172d1..98ec2853 100644
--- a/pc/Makefile.tst
+++ b/pc/Makefile.tst
@@ -198,7 +198,7 @@ GAWK_EXT_TESTS = \
icasefs icasers id igncdym igncfs ignrcas2 ignrcas4 ignrcase \
incdupe incdupe2 incdupe3 incdupe4 incdupe5 incdupe6 incdupe7 \
include include2 indirectbuiltin indirectcall indirectcall2 \
- indirectbuiltin2 \
+ indirectcall3 indirectbuiltin2 \
inf-nan-torture intarray iolint isarrayunset lint lintexp \
lintindex lintint lintlength lintold lintplus lintset lintwarn \
manyfiles match1 match2 match3 mbstr1 mbstr2 mixed1 mktime \
@@ -2928,6 +2928,11 @@ indirectcall2:
@-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+indirectcall3:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
inf-nan-torture:
@echo $@ $(ZOS_FAIL)
@echo Expect $@ to fail with MinGW.
diff --git a/test/ChangeLog b/test/ChangeLog
index 44a0e951..51aad696 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,8 @@
+2022-03-27 Arnold D. Robbins <arnold@skeeve.com>
+
+ * Makefile.am (EXTRA_DIST): indirectcall3, new test.
+ * indirectcall3.awk, indirectcall3.ok: New files.
+
2022-02-27 Arnold D. Robbins <arnold@skeeve.com>
* badargs.ok: Updated after code change.
diff --git a/test/Makefile.am b/test/Makefile.am
index ddca3f59..e6652965 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -575,6 +575,8 @@ EXTRA_DIST = \
indirectbuiltin2.ok \
indirectcall2.awk \
indirectcall2.ok \
+ indirectcall3.awk \
+ indirectcall3.ok \
indirectcall.awk \
indirectcall.in \
indirectcall.ok \
@@ -1460,7 +1462,7 @@ GAWK_EXT_TESTS = \
icasefs icasers id igncdym igncfs ignrcas2 ignrcas4 ignrcase \
incdupe incdupe2 incdupe3 incdupe4 incdupe5 incdupe6 incdupe7 \
include include2 indirectbuiltin indirectcall indirectcall2 \
- indirectbuiltin2 \
+ indirectcall3 indirectbuiltin2 \
inf-nan-torture intarray iolint isarrayunset lint lintexp \
lintindex lintint lintlength lintold lintplus lintset lintwarn \
manyfiles match1 match2 match3 mbstr1 mbstr2 mixed1 mktime \
diff --git a/test/Makefile.in b/test/Makefile.in
index d974a98c..ed60771d 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -841,6 +841,8 @@ EXTRA_DIST = \
indirectbuiltin2.ok \
indirectcall2.awk \
indirectcall2.ok \
+ indirectcall3.awk \
+ indirectcall3.ok \
indirectcall.awk \
indirectcall.in \
indirectcall.ok \
@@ -1726,7 +1728,7 @@ GAWK_EXT_TESTS = \
icasefs icasers id igncdym igncfs ignrcas2 ignrcas4 ignrcase \
incdupe incdupe2 incdupe3 incdupe4 incdupe5 incdupe6 incdupe7 \
include include2 indirectbuiltin indirectcall indirectcall2 \
- indirectbuiltin2 \
+ indirectcall3 indirectbuiltin2 \
inf-nan-torture intarray iolint isarrayunset lint lintexp \
lintindex lintint lintlength lintold lintplus lintset lintwarn \
manyfiles match1 match2 match3 mbstr1 mbstr2 mixed1 mktime \
@@ -4620,6 +4622,11 @@ indirectcall2:
@-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+indirectcall3:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
inf-nan-torture:
@echo $@ $(ZOS_FAIL)
@-AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/Maketests b/test/Maketests
index 10ef252f..d21d4c6c 100644
--- a/test/Maketests
+++ b/test/Maketests
@@ -1653,6 +1653,11 @@ indirectcall2:
@-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+indirectcall3:
+ @echo $@
+ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
inf-nan-torture:
@echo $@ $(ZOS_FAIL)
@-AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/indirectcall3.awk b/test/indirectcall3.awk
new file mode 100644
index 00000000..67181112
--- /dev/null
+++ b/test/indirectcall3.awk
@@ -0,0 +1,16 @@
+function okay(f1, f2, arg)
+{
+ return @f1(arg)
+}
+
+function not_so_hot(f1, f2, arg)
+{
+ return @f1(arg, @f2(arg)) # line 8: error here
+}
+
+function workaround(f1, f2, arg,
+ tmp)
+{
+ tmp = @f2(arg)
+ return @f1(arg, tmp)
+}
diff --git a/test/indirectcall3.ok b/test/indirectcall3.ok
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/indirectcall3.ok