diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2021-11-21 20:13:48 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2021-11-21 20:13:48 +0200 |
commit | 4a7a1509991bfa9b79816a04fbee3398e3be6841 (patch) | |
tree | 6313ec27fa13555778c7c7f415028d435e6890ea | |
parent | 5403687cb350d91f81991ad82721648e70651eb9 (diff) | |
download | egawk-4a7a1509991bfa9b79816a04fbee3398e3be6841.tar.gz egawk-4a7a1509991bfa9b79816a04fbee3398e3be6841.tar.bz2 egawk-4a7a1509991bfa9b79816a04fbee3398e3be6841.zip |
Fix subtle typeof case.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | builtin.c | 23 | ||||
-rw-r--r-- | pc/ChangeLog | 4 | ||||
-rw-r--r-- | pc/Makefile.tst | 7 | ||||
-rw-r--r-- | test/ChangeLog | 6 | ||||
-rw-r--r-- | test/Makefile.am | 4 | ||||
-rw-r--r-- | test/Makefile.in | 9 | ||||
-rw-r--r-- | test/Maketests | 5 | ||||
-rw-r--r-- | test/stupid3.ok | 2 | ||||
-rw-r--r-- | test/stupid4.ok | 2 | ||||
-rw-r--r-- | test/stupid5.awk | 9 | ||||
-rw-r--r-- | test/stupid5.ok | 2 |
12 files changed, 72 insertions, 6 deletions
@@ -1,3 +1,8 @@ +2021-11-21 Arnold D. Robbins <arnold@skeeve.com> + + * builtin.c (do_typeof): Make Node_array_ref handling smarter. + See test/stupid5.awk. + 2021-11-18 Arnold D. Robbins <arnold@skeeve.com> * gawkapi.c (awk_value_to_node): Fix handling of MPFR values @@ -4186,10 +4186,31 @@ do_typeof(int nargs) } break; case Node_var_new: - case Node_array_ref: res = "untyped"; deref = false; break; + case Node_array_ref: + /* + * function f(x) { + * print typeof(x) + * y = x + * print typeof(x) + * } + * + * BEGIN { + * print typeof(x) + * f(x) + * } + */ + if (arg->orig_array->type == Node_var + && (arg->orig_array->var_value == Nnull_string + || (arg->orig_array->var_value->flags & NULL_FIELD) != 0)) { + res = "unassigned"; + } else { + res = "untyped"; + } + deref = false; + break; case Node_var: /* * Note: this doesn't happen because the function calling code diff --git a/pc/ChangeLog b/pc/ChangeLog index e3ffdeab..ba9334fd 100644 --- a/pc/ChangeLog +++ b/pc/ChangeLog @@ -1,3 +1,7 @@ +2021-11-21 Arnold D. Robbins <arnold@skeeve.com> + + * Makefile.tst: Regenerated. + 2021-11-08 Arnold D. Robbins <arnold@skeeve.com> * Makefile.tst: Regenerated. diff --git a/pc/Makefile.tst b/pc/Makefile.tst index bb707042..97be2756 100644 --- a/pc/Makefile.tst +++ b/pc/Makefile.tst @@ -210,7 +210,7 @@ GAWK_EXT_TESTS = \ regx8bit reginttrad reint reint2 rsgetline rsglstdin rsstart1 \ rsstart2 rsstart3 rstest6 sandbox1 shadow shadowbuiltin sortfor \ sortfor2 sortu sourcesplit split_after_fpat splitarg4 strftfld \ - strftime strtonum strtonum1 stupid1 stupid2 stupid3 stupid4 \ + strftime strtonum strtonum1 stupid1 stupid2 stupid3 stupid4 stupid5 \ switch2 symtab1 symtab2 symtab3 symtab4 symtab5 symtab6 symtab7 \ symtab8 symtab9 symtab10 symtab11 timeout typedregex1 typedregex2 \ typedregex3 typedregex4 typedregex5 typedregex6 typeof1 typeof2 \ @@ -3284,6 +3284,11 @@ stupid4: @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ +stupid5: + @echo $@ + @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ + @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ + switch2: @echo $@ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ diff --git a/test/ChangeLog b/test/ChangeLog index 275f487b..3f368170 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,3 +1,9 @@ +2021-11-21 Arnold D. Robbins <arnold@skeeve.com> + + * Makefile.am (EXTRA_DIST): stupid5, new test. + * stupid5.awk, stupid5.ok: New files. + * stupid3.ok, stupid4.ok: Updated after code changes. + 2021-11-18 Arnold D. Robbins <arnold@skeeve.com> * rwarray.awk: Improve test, add string and numbers. diff --git a/test/Makefile.am b/test/Makefile.am index a82c2791..b74056ec 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1241,6 +1241,8 @@ EXTRA_DIST = \ stupid3.ok \ stupid4.awk \ stupid4.ok \ + stupid5.awk \ + stupid5.ok \ subamp.awk \ subamp.in \ subamp.ok \ @@ -1459,7 +1461,7 @@ GAWK_EXT_TESTS = \ regx8bit reginttrad reint reint2 rsgetline rsglstdin rsstart1 \ rsstart2 rsstart3 rstest6 sandbox1 shadow shadowbuiltin sortfor \ sortfor2 sortu sourcesplit split_after_fpat splitarg4 strftfld \ - strftime strtonum strtonum1 stupid1 stupid2 stupid3 stupid4 \ + strftime strtonum strtonum1 stupid1 stupid2 stupid3 stupid4 stupid5 \ switch2 symtab1 symtab2 symtab3 symtab4 symtab5 symtab6 symtab7 \ symtab8 symtab9 symtab10 symtab11 timeout typedregex1 typedregex2 \ typedregex3 typedregex4 typedregex5 typedregex6 typeof1 typeof2 \ diff --git a/test/Makefile.in b/test/Makefile.in index 1f4e0edd..d56e90d1 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -1507,6 +1507,8 @@ EXTRA_DIST = \ stupid3.ok \ stupid4.awk \ stupid4.ok \ + stupid5.awk \ + stupid5.ok \ subamp.awk \ subamp.in \ subamp.ok \ @@ -1725,7 +1727,7 @@ GAWK_EXT_TESTS = \ regx8bit reginttrad reint reint2 rsgetline rsglstdin rsstart1 \ rsstart2 rsstart3 rstest6 sandbox1 shadow shadowbuiltin sortfor \ sortfor2 sortu sourcesplit split_after_fpat splitarg4 strftfld \ - strftime strtonum strtonum1 stupid1 stupid2 stupid3 stupid4 \ + strftime strtonum strtonum1 stupid1 stupid2 stupid3 stupid4 stupid5 \ switch2 symtab1 symtab2 symtab3 symtab4 symtab5 symtab6 symtab7 \ symtab8 symtab9 symtab10 symtab11 timeout typedregex1 typedregex2 \ typedregex3 typedregex4 typedregex5 typedregex6 typeof1 typeof2 \ @@ -4957,6 +4959,11 @@ stupid4: @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ +stupid5: + @echo $@ + @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ + @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ + switch2: @echo $@ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ diff --git a/test/Maketests b/test/Maketests index 5133c676..9e00cd57 100644 --- a/test/Maketests +++ b/test/Maketests @@ -2022,6 +2022,11 @@ stupid4: @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ +stupid5: + @echo $@ + @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ + @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ + switch2: @echo $@ @-AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ diff --git a/test/stupid3.ok b/test/stupid3.ok index 11beb6c9..b647c089 100644 --- a/test/stupid3.ok +++ b/test/stupid3.ok @@ -1,2 +1,2 @@ TYPEOF: untyped -TYPEOF: untyped +TYPEOF: unassigned diff --git a/test/stupid4.ok b/test/stupid4.ok index 1271dad1..42380a42 100644 --- a/test/stupid4.ok +++ b/test/stupid4.ok @@ -1,2 +1,2 @@ untyped -untyped +unassigned diff --git a/test/stupid5.awk b/test/stupid5.awk new file mode 100644 index 00000000..e4c0187a --- /dev/null +++ b/test/stupid5.awk @@ -0,0 +1,9 @@ +BEGIN { + print typeof(x) + f(x) +} + +function f(x) { + y = x + print typeof(x) +} diff --git a/test/stupid5.ok b/test/stupid5.ok new file mode 100644 index 00000000..42380a42 --- /dev/null +++ b/test/stupid5.ok @@ -0,0 +1,2 @@ +untyped +unassigned |