aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2014-11-21 10:56:20 +0200
committerArnold D. Robbins <arnold@skeeve.com>2014-11-21 10:56:20 +0200
commita3454a6b0e25a6d1be66b698c52bae9674309c21 (patch)
tree89bdb0a7955de12386132417c2fe7c5ae891b0cb
parentcbaeeb232619098a4bdd9ad5d322dd9e3f4f1930 (diff)
parent1fc15398cbd381b83e20bca3913c12ee7aa34bd4 (diff)
downloadegawk-a3454a6b0e25a6d1be66b698c52bae9674309c21.tar.gz
egawk-a3454a6b0e25a6d1be66b698c52bae9674309c21.tar.bz2
egawk-a3454a6b0e25a6d1be66b698c52bae9674309c21.zip
Merge branch 'gawk-4.1-stable'
-rw-r--r--ChangeLog5
-rw-r--r--interpret.h36
-rw-r--r--test/ChangeLog5
-rw-r--r--test/Makefile.am5
-rw-r--r--test/Makefile.in10
-rw-r--r--test/Maketests5
-rwxr-xr-xtest/sortglos.awk51
-rwxr-xr-xtest/sortglos.in22
-rw-r--r--test/sortglos.ok15
9 files changed, 144 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index e534b4ac..078216c8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -8,6 +8,11 @@
Revert changes of 2014-11-20 from Paul Eggert. Causes failures
on z/OS.
+ Unrelated: Avoid unnecessary copying of $0.
+
+ * interpret.h (UNFIELD): New macro.
+ (r_interpret): Use it where *lhs is assigned to.
+
2014-11-20 Paul Eggert <eggert@cs.ucla.edu>
Port to systems where malloc (0) and/or realloc(P, 0) returns NULL.
diff --git a/interpret.h b/interpret.h
index 2ffd07f2..3a9cab37 100644
--- a/interpret.h
+++ b/interpret.h
@@ -23,7 +23,19 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
-
+#define UNFIELD(l, r) \
+{ \
+ /* if was a field, turn it into a var */ \
+ if ((r->flags & FIELD) == 0) { \
+ l = r; \
+ } else if (r->valref == 1) { \
+ r->flags &= ~FIELD; \
+ l = r; \
+ } else { \
+ l = dupnode(r); \
+ DEREF(r); \
+ } \
+}
int
r_interpret(INSTRUCTION *code)
{
@@ -340,7 +352,12 @@ uninitialized_scalar:
lhs = r_get_field(t1, (Func_ptr *) 0, true);
decr_sp();
DEREF(t1);
- r = dupnode(*lhs); /* can't use UPREF here */
+ /* only for $0, up ref count */
+ if (*lhs == fields_arr[0]) {
+ r = *lhs;
+ UPREF(r);
+ } else
+ r = dupnode(*lhs);
PUSH(r);
break;
@@ -631,7 +648,8 @@ mod:
}
unref(*lhs);
- *lhs = POP_SCALAR();
+ r = POP_SCALAR();
+ UNFIELD(*lhs, r);
/* execute post-assignment routine if any */
if (t1->astore != NULL)
@@ -649,11 +667,12 @@ mod:
lhs = get_lhs(pc->memory, false);
unref(*lhs);
r = pc->initval; /* constant initializer */
- if (r == NULL)
- *lhs = POP_SCALAR();
- else {
+ if (r != NULL) {
UPREF(r);
*lhs = r;
+ } else {
+ r = POP_SCALAR();
+ UNFIELD(*lhs, r);
}
break;
@@ -669,7 +688,8 @@ mod:
decr_sp();
DEREF(t1);
unref(*lhs);
- *lhs = POP_SCALAR();
+ r = POP_SCALAR();
+ UNFIELD(*lhs, r);
assert(assign != NULL);
assign();
}
@@ -723,8 +743,8 @@ mod:
lhs = POP_ADDRESS();
r = TOP_SCALAR();
unref(*lhs);
- *lhs = r;
UPREF(r);
+ UNFIELD(*lhs, r);
REPLACE(r);
break;
diff --git a/test/ChangeLog b/test/ChangeLog
index 71facf39..2840d35a 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,8 @@
+2014-11-16 Arnold D. Robbins <arnold@skeeve.com>
+
+ * Makefile.am (sortglos): New test.
+ * sortglos.awk, sortglos.in, sortglos.ok: New files.
+
2014-11-09 Arnold D. Robbins <arnold@skeeve.com>
* mbprintf4.awk: Add record and line number for debugging.
diff --git a/test/Makefile.am b/test/Makefile.am
index db1cb086..a00e011e 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -833,6 +833,9 @@ EXTRA_DIST = \
sortfor.awk \
sortfor.in \
sortfor.ok \
+ sortglos.awk \
+ sortglos.in \
+ sortglos.ok \
sortu.awk \
sortu.ok \
space.ok \
@@ -998,7 +1001,7 @@ BASIC_TESTS = \
rand randtest range1 rebt8b1 redfilnm regeq regexprange regrange reindops \
reparse resplit rri1 rs rsnul1nl rsnulbig rsnulbig2 rstest1 rstest2 \
rstest3 rstest4 rstest5 rswhite \
- scalar sclforin sclifin sortempty splitargv splitarr splitdef \
+ scalar sclforin sclifin sortempty sortglos splitargv splitarr splitdef \
splitvar splitwht strcat1 strnum1 strtod subamp subi18n \
subsepnm subslash substr swaplns synerr1 synerr2 tradanch tweakfld \
uninit2 uninit3 uninit4 uninit5 uninitialized unterm uparrfs \
diff --git a/test/Makefile.in b/test/Makefile.in
index 6bf4e698..93a989b5 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -1080,6 +1080,9 @@ EXTRA_DIST = \
sortfor.awk \
sortfor.in \
sortfor.ok \
+ sortglos.awk \
+ sortglos.in \
+ sortglos.ok \
sortu.awk \
sortu.ok \
space.ok \
@@ -1244,7 +1247,7 @@ BASIC_TESTS = \
rand randtest range1 rebt8b1 redfilnm regeq regexprange regrange reindops \
reparse resplit rri1 rs rsnul1nl rsnulbig rsnulbig2 rstest1 rstest2 \
rstest3 rstest4 rstest5 rswhite \
- scalar sclforin sclifin sortempty splitargv splitarr splitdef \
+ scalar sclforin sclifin sortempty sortglos splitargv splitarr splitdef \
splitvar splitwht strcat1 strnum1 strtod subamp subi18n \
subsepnm subslash substr swaplns synerr1 synerr2 tradanch tweakfld \
uninit2 uninit3 uninit4 uninit5 uninitialized unterm uparrfs \
@@ -3202,6 +3205,11 @@ sortempty:
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+sortglos:
+ @echo $@
+ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
splitargv:
@echo $@
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/Maketests b/test/Maketests
index f8d5e8a9..85c13d5d 100644
--- a/test/Maketests
+++ b/test/Maketests
@@ -777,6 +777,11 @@ sortempty:
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+sortglos:
+ @echo $@
+ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
splitargv:
@echo $@
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/sortglos.awk b/test/sortglos.awk
new file mode 100755
index 00000000..e4f910d7
--- /dev/null
+++ b/test/sortglos.awk
@@ -0,0 +1,51 @@
+BEGIN {
+ pr="y";
+ npre=0;
+ po="n";
+ npos=0;
+ }
+
+pr=="y" { npre++; pre[npre]=$0; }
+$1=="@table" && $2=="@asis" { pr="n";nite++; next; }
+
+po=="y" { npos++; pos[npos]=$0; }
+$1=="@end" && $2=="table" {
+ po="y";
+ npos++;
+ pos[npos]=$0;
+ # last item...
+ vec[nite]=nlin;
+}
+
+ { nite++; }
+
+END {
+ for ( i=1; i<=npre; i++ ) { print pre[i]; }
+ if ( srt=="y" ) {
+ n=asorti(entr,ital);
+ ##print "n=",n;
+ for ( i=1; i<=n; i++ ) {
+ #printf("=========> %3.3d %s\n",i,ital[i]);
+ # ital[i] is the sorted key;
+ j=entr[ital[i]];
+ # j is the original item number
+ for ( k=1; k<=vec[j]; k++ ) {
+ print dat[j,k];
+ }
+ }
+ }
+ if ( srt=="n" ) {
+ for ( i=1; i<=nite; i++ ) {
+ printf("=========> %3.3d %2.2d %s\n",i,vec[i],titl[i]);
+ for ( j=1; j<=vec[i]; j++ ) {
+ print dat[i,j];
+ }
+ }
+ print "========================= END";
+ }
+ for ( i=1; i<=npos; i++ ) { print pos[i]; }
+ print "@c npre=" npre;
+ print "@c nite=" nite;
+ print "@c npos=" npos;
+}
+
diff --git a/test/sortglos.in b/test/sortglos.in
new file mode 100755
index 00000000..b24373de
--- /dev/null
+++ b/test/sortglos.in
@@ -0,0 +1,22 @@
+@node Glossario
+@unnumbered Glossario
+
+@table @asis
+@item Azione
+Una serie di istruzioni @command{awk} associate a una regola. Se
+l'espressione di ricerca della regola individua un record in input,
+@command{awk} esegue su quel record l'azione relativa. Le azioni sono
+sempre racchiuse fra parentesi graffe.
+(@xref{Panoramica sulle azioni}).
+
+@item Spazio bianco
+Una sequenza di spazi, TAB, o caratteri di "a capo" presenti in un record in
+input o in una stringa.
+@end table
+
+@end ifclear
+
+@c The GNU General Public License.
+
+@c aggiornato alla versione: settembre 2014
+@c ultimo aggiornamento: 14 novembre 2014
diff --git a/test/sortglos.ok b/test/sortglos.ok
new file mode 100644
index 00000000..69ddbe67
--- /dev/null
+++ b/test/sortglos.ok
@@ -0,0 +1,15 @@
+@node Glossario
+@unnumbered Glossario
+
+@table @asis
+@end table
+
+@end ifclear
+
+@c The GNU General Public License.
+
+@c aggiornato alla versione: settembre 2014
+@c ultimo aggiornamento: 14 novembre 2014
+@c npre=4
+@c nite=22
+@c npos=8