gawk-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gawk-diffs] [SCM] gawk branch, master, updated. gawk-4.1.0-3809-g98e500


From: Arnold Robbins
Subject: [gawk-diffs] [SCM] gawk branch, master, updated. gawk-4.1.0-3809-g98e500f
Date: Thu, 15 Aug 2019 14:41:51 -0400 (EDT)

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "gawk".

The branch, master has been updated
       via  98e500ff3ceb035d9d42acf25aa365940cf47568 (commit)
       via  c7c3998ed9d96b61d03c675b2105ca5da77b9bfd (commit)
       via  28403d5a053d80a06bf94b57e1008ea628a12b1f (commit)
      from  631c60699f26dc12f614998b646ab3f213e2a847 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://git.sv.gnu.org/cgit/gawk.git/commit/?id=98e500ff3ceb035d9d42acf25aa365940cf47568

commit 98e500ff3ceb035d9d42acf25aa365940cf47568
Author: Arnold D. Robbins <address@hidden>
Date:   Thu Aug 15 21:19:50 2019 +0300

    Avoid memory growth in format_tree.

diff --git a/ChangeLog b/ChangeLog
index eced419..603e952 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2019-08-15         Arnold D. Robbins     <address@hidden>
+
+       Revert a6df7afc605079df7d85318846a522ef64aaa44d, change of
+       2016-05-03, which used realloc to shrink the buffer, in an
+       attempt to save memory.  In actuality, it could cause increased
+       memory usage, even though there was no memory leak. See
+       https://lists.gnu.org/archive/html/bug-gawk/2019-08/msg00003.html
+       and the rest of thread for more detail.
+
+       * builtin.c (format_tree): Don't use realloc, just call
+       make_str_node with the original buffer. Remove `olen_final'
+       variable and its use.
+
 2019-08-15         Andrew J. Schorr      <address@hidden>
 
        Reduce memory usage by only compiling the IGNORECASE version of
diff --git a/builtin.c b/builtin.c
index 1c205aa..503a386 100644
--- a/builtin.c
+++ b/builtin.c
@@ -685,7 +685,7 @@ format_tree(
        int i, nc;
        bool toofew = false;
        char *obuf, *obufout;
-       size_t osiz, ofre, olen_final;
+       size_t osiz, ofre;
        const char *chbuf;
        const char *s0, *s1;
        int cs1;
@@ -1646,10 +1646,7 @@ mpf1:
                        _("too many arguments supplied for format string"));
        }
        bchunk(s0, s1 - s0);
-       olen_final = obufout - obuf;
-       if (ofre > 0)
-               erealloc(obuf, char *, olen_final + 1, "format_tree");
-       r = make_str_node(obuf, olen_final, ALREADY_MALLOCED);
+       r = make_str_node(obuf, obufout - obuf, ALREADY_MALLOCED);
        obuf = NULL;
 out:
        {

http://git.sv.gnu.org/cgit/gawk.git/commit/?id=c7c3998ed9d96b61d03c675b2105ca5da77b9bfd

commit c7c3998ed9d96b61d03c675b2105ca5da77b9bfd
Author: Arnold D. Robbins <address@hidden>
Date:   Thu Aug 15 20:19:13 2019 +0300

    Reduce up-front compiled regexp memory usage.

diff --git a/ChangeLog b/ChangeLog
index 5a20c09..eced419 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2019-08-15         Andrew J. Schorr      <address@hidden>
+
+       Reduce memory usage by only compiling the IGNORECASE version of
+       regexp when it's actually needed.
+
+       * awkgram.y (make_regnode): Only compile the regular version.
+       * re.c (re_cache_get): New function.
+       (re_update): Use it as appropriate.
+
 2019-07-23         Koichi Murase         <address@hidden>
 
        * builtin.c (do_xor): Remove unneeded local variable `i'. Simplify
diff --git a/awkgram.c b/awkgram.c
index 19a1182..b923f19 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -7764,12 +7764,6 @@ make_regnode(int type, NODE *exp)
                        freenode(n);
                        return NULL;
                }
-               n->re_reg[1] = make_regexp(exp->stptr, exp->stlen, true, true, 
false);
-               if (n->re_reg[1] == NULL) {
-                       refree(n->re_reg[0]);
-                       freenode(n);
-                       return NULL;
-               }
                n->re_exp = exp;
                n->re_flags = CONSTANT;
        }
diff --git a/awkgram.y b/awkgram.y
index aa8ccb1..62865e1 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -5267,12 +5267,6 @@ make_regnode(int type, NODE *exp)
                        freenode(n);
                        return NULL;
                }
-               n->re_reg[1] = make_regexp(exp->stptr, exp->stlen, true, true, 
false);
-               if (n->re_reg[1] == NULL) {
-                       refree(n->re_reg[0]);
-                       freenode(n);
-                       return NULL;
-               }
                n->re_exp = exp;
                n->re_flags = CONSTANT;
        }
diff --git a/re.c b/re.c
index 32d0334..91cff4d 100644
--- a/re.c
+++ b/re.c
@@ -391,6 +391,16 @@ dfaerror(const char *s)
        exit(EXIT_FATAL);       /* for DJGPP */
 }
 
+/* re_cache_get --- populate regexp cache if empty */
+
+static inline Regexp *
+re_cache_get(NODE *t)
+{
+       if (t->re_reg[IGNORECASE] == NULL)
+               t->re_reg[IGNORECASE] = make_regexp(t->re_exp->stptr, 
t->re_exp->stlen, IGNORECASE, t->re_cnt, true);
+       return t->re_reg[IGNORECASE];
+}
+
 /* re_update --- recompile a dynamic regexp */
 
 Regexp *
@@ -399,18 +409,18 @@ re_update(NODE *t)
        NODE *t1;
 
        if (t->type == Node_val && (t->flags & REGEX) != 0)
-               return t->typed_re->re_reg[IGNORECASE];
+               return re_cache_get(t->typed_re);
 
        if ((t->re_flags & CONSTANT) != 0) {
                /* it's a constant, so just return it as is */
                assert(t->type == Node_regex);
-               return t->re_reg[IGNORECASE];
+               return re_cache_get(t);
        }
        t1 = t->re_exp;
        if (t->re_text != NULL) {
                /* if contents haven't changed, just return it */
                if (cmp_nodes(t->re_text, t1, true) == 0)
-                       return t->re_reg[IGNORECASE];
+                       return re_cache_get(t);
                /* things changed, fall through to recompile */
                unref(t->re_text);
        }
@@ -420,10 +430,14 @@ re_update(NODE *t)
        /* text changed */
 
        /* free old */
-       if (t->re_reg[0] != NULL)
+       if (t->re_reg[0] != NULL) {
                refree(t->re_reg[0]);
-       if (t->re_reg[1] != NULL)
+               t->re_reg[0] = NULL;
+       }
+       if (t->re_reg[1] != NULL) {
                refree(t->re_reg[1]);
+               t->re_reg[1] = NULL;
+       }
        if (t->re_cnt > 0)
                t->re_cnt++;
        if (t->re_cnt > 10)
@@ -434,13 +448,7 @@ re_update(NODE *t)
                unref(t->re_text);
                t->re_text = dupnode(t1);
        }
-       /* compile it */
-       t->re_reg[0] = make_regexp(t->re_text->stptr, t->re_text->stlen,
-                               false, t->re_cnt, true);
-       t->re_reg[1] = make_regexp(t->re_text->stptr, t->re_text->stlen,
-                               true, t->re_cnt, true);
-
-       return t->re_reg[IGNORECASE];
+       return re_cache_get(t);
 }
 
 /* resetup --- choose what kind of regexps we match */

http://git.sv.gnu.org/cgit/gawk.git/commit/?id=28403d5a053d80a06bf94b57e1008ea628a12b1f

commit 28403d5a053d80a06bf94b57e1008ea628a12b1f
Author: Arnold D. Robbins <address@hidden>
Date:   Thu Aug 15 20:11:33 2019 +0300

    Update Italian manual translation.

diff --git a/doc/it/ChangeLog b/doc/it/ChangeLog
index bfe7ca5..44a47bb 100644
--- a/doc/it/ChangeLog
+++ b/doc/it/ChangeLog
@@ -1,3 +1,7 @@
+2019-08-12         Antonio Giovanni Colombo   <address@hidden>
+
+       * gawktexi.in: Updated.
+
 2019-08-07         Antonio Giovanni Colombo   <address@hidden>
 
        * gawktexi.in: Updated.
diff --git a/doc/it/gawktexi.in b/doc/it/gawktexi.in
index 2a9921b..c41c25d 100644
--- a/doc/it/gawktexi.in
+++ b/doc/it/gawktexi.in
@@ -4693,6 +4693,16 @@ un file.  (Si veda @ref{Opzioni di assegnamento}.)  Nel 
seguente esempio,
 awk -f programma.awk file1 count=1 file2
 @end example
 
+@noindent
+Incidentalmente, se davvero fosse necessario che @command{awk}
+tratti un file dal nome @file{count=1} (o qualsiasi altro file il cui
+nome assomigli a un assegnamento di variabile), il nome di file in
+questione andr@`a fatto precedere da @samp{./}, come nell'esempio seguente:
+
+@example
+awk -f programma.awk file1 ./count=1 file2
+@end example
+
 @cindex @command{gawk}, variabile @code{ARGIND} in
 @cindex @code{ARGIND}, variabile, argomenti da riga di comando
 @cindex @code{ARGV}, vettore, indicizzare all'interno di

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog          | 22 ++++++++++++++++++++++
 awkgram.c          |  6 ------
 awkgram.y          |  6 ------
 builtin.c          |  7 ++-----
 doc/it/ChangeLog   |  4 ++++
 doc/it/gawktexi.in | 10 ++++++++++
 re.c               | 32 ++++++++++++++++++++------------
 7 files changed, 58 insertions(+), 29 deletions(-)


hooks/post-receive
-- 
gawk



reply via email to

[Prev in Thread] Current Thread [Next in Thread]