Source-Changes-HG archive

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

[src/trunk]: src/usr.bin/make make: avoid unnecessary calls to strlen when ev...



details:   https://anonhg.NetBSD.org/src/rev/1c1992b9f35b
branches:  trunk
changeset: 982367:1c1992b9f35b
user:      rillig <rillig%NetBSD.org@localhost>
date:      Sun Apr 11 19:05:06 2021 +0000

description:
make: avoid unnecessary calls to strlen when evaluating modifiers

No functional change.

diffstat:

 usr.bin/make/str.c |  49 +++++++++++++++++++++++++++++++++++++------------
 usr.bin/make/str.h |  19 ++++++++++++++++++-
 usr.bin/make/var.c |  14 ++++++--------
 3 files changed, 61 insertions(+), 21 deletions(-)

diffs (201 lines):

diff -r 5e7b1c82d8df -r 1c1992b9f35b usr.bin/make/str.c
--- a/usr.bin/make/str.c        Sun Apr 11 18:44:57 2021 +0000
+++ b/usr.bin/make/str.c        Sun Apr 11 19:05:06 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: str.c,v 1.83 2021/04/03 14:39:02 rillig Exp $  */
+/*     $NetBSD: str.c,v 1.84 2021/04/11 19:05:06 rillig Exp $  */
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -71,7 +71,7 @@
 #include "make.h"
 
 /*     "@(#)str.c      5.8 (Berkeley) 6/1/90"  */
-MAKE_RCSID("$NetBSD: str.c,v 1.83 2021/04/03 14:39:02 rillig Exp $");
+MAKE_RCSID("$NetBSD: str.c,v 1.84 2021/04/11 19:05:06 rillig Exp $");
 
 /* Return the concatenation of s1 and s2, freshly allocated. */
 char *
@@ -125,13 +125,13 @@
  * Returns the fractured words, which must be freed later using Words_Free,
  * unless the returned Words.words was NULL.
  */
-Words
-Str_Words(const char *str, bool expand)
+SubstringWords
+Substring_Words(const char *str, bool expand)
 {
        size_t str_len;
        char *words_buf;
        size_t words_cap;
-       char **words;
+       Substring *words;
        size_t words_len;
        char inquote;
        char *word_start;
@@ -146,7 +146,7 @@
        words_buf = bmake_malloc(str_len + 1);
 
        words_cap = str_len / 5 > 50 ? str_len / 5 : 50;
-       words = bmake_malloc((words_cap + 1) * sizeof(char *));
+       words = bmake_malloc((words_cap + 1) * sizeof(words[0]));
 
        /*
         * copy the string; at the same time, parse backslashes,
@@ -205,15 +205,16 @@
                        *word_end++ = '\0';
                        if (words_len == words_cap) {
                                size_t new_size;
-                               words_cap *= 2;         /* ramp up fast */
-                               new_size = (words_cap + 1) * sizeof(char *);
+                               words_cap *= 2;
+                               new_size = (words_cap + 1) * sizeof(words[0]);
                                words = bmake_realloc(words, new_size);
                        }
-                       words[words_len++] = word_start;
+                       words[words_len++] =
+                           Substring_Init(word_start, word_end - 1);
                        word_start = NULL;
                        if (ch == '\n' || ch == '\0') {
                                if (expand && inquote != '\0') {
-                                       Words res;
+                                       SubstringWords res;
 
                                        free(words);
                                        free(words_buf);
@@ -268,10 +269,10 @@
                *word_end++ = ch;
        }
 done:
-       words[words_len] = NULL;        /* useful for argv */
+       words[words_len] = Substring_Init(NULL, NULL);  /* useful for argv */
 
        {
-               Words result;
+               SubstringWords result;
 
                result.words = words;
                result.len = words_len;
@@ -280,6 +281,30 @@
        }
 }
 
+Words
+Str_Words(const char *str, bool expand)
+{
+       SubstringWords swords;
+       Words words;
+       size_t i;
+
+       swords = Substring_Words(str, expand);
+       if (swords.words == NULL) {
+               words.words = NULL;
+               words.len = 0;
+               words.freeIt = NULL;
+               return words;
+       }
+
+       words.words = bmake_malloc((swords.len + 1) * sizeof(words.words[0]));
+       words.len = swords.len;
+       words.freeIt = swords.freeIt;
+       for (i = 0; i < swords.len + 1; i++)
+               words.words[i] = UNCONST(swords.words[i].start);
+       free(swords.words);
+       return words;
+}
+
 /*
  * Str_Match -- Test if a string matches a pattern like "*.[ch]".
  * The following special characters are known *?\[] (as in fnmatch(3)).
diff -r 5e7b1c82d8df -r 1c1992b9f35b usr.bin/make/str.h
--- a/usr.bin/make/str.h        Sun Apr 11 18:44:57 2021 +0000
+++ b/usr.bin/make/str.h        Sun Apr 11 19:05:06 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: str.h,v 1.2 2021/04/11 18:44:57 rillig Exp $   */
+/*     $NetBSD: str.h,v 1.3 2021/04/11 19:05:06 rillig Exp $   */
 
 /*
  Copyright (c) 2021 Roland Illig <rillig%NetBSD.org@localhost>
@@ -70,6 +70,13 @@
        void *freeIt;
 } Words;
 
+/* The result of splitting a string into words. */
+typedef struct SubstringWords {
+       Substring *words;
+       size_t len;
+       void *freeIt;
+} SubstringWords;
+
 
 MAKE_INLINE FStr
 FStr_Init(const char *str, void *freeIt)
@@ -301,6 +308,16 @@
 }
 
 
+SubstringWords Substring_Words(const char *, bool);
+
+MAKE_INLINE void
+SubstringWords_Free(SubstringWords w)
+{
+       free(w.words);
+       free(w.freeIt);
+}
+
+
 char *str_concat2(const char *, const char *);
 char *str_concat3(const char *, const char *, const char *);
 char *str_concat4(const char *, const char *, const char *, const char *);
diff -r 5e7b1c82d8df -r 1c1992b9f35b usr.bin/make/var.c
--- a/usr.bin/make/var.c        Sun Apr 11 18:44:57 2021 +0000
+++ b/usr.bin/make/var.c        Sun Apr 11 19:05:06 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: var.c,v 1.919 2021/04/11 18:44:57 rillig Exp $ */
+/*     $NetBSD: var.c,v 1.920 2021/04/11 19:05:06 rillig Exp $ */
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -140,7 +140,7 @@
 #include "metachar.h"
 
 /*     "@(#)var.c      8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.919 2021/04/11 18:44:57 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.920 2021/04/11 19:05:06 rillig Exp $");
 
 /*
  * Variables are defined using one of the VAR=value assignments.  Their
@@ -2461,7 +2461,7 @@
        Expr *expr = ch->expr;
        const char *val = expr->value.str;
        SepBuf result;
-       Words words;
+       SubstringWords words;
        size_t i;
        Substring word;
 
@@ -2473,21 +2473,19 @@
                goto done;
        }
 
-       words = Str_Words(val, false);
+       words = Substring_Words(val, false);
 
        DEBUG2(VAR, "ModifyWords: split \"%s\" into %u words\n",
            val, (unsigned)words.len);
 
        SepBuf_Init(&result, ch->sep);
        for (i = 0; i < words.len; i++) {
-               /* XXX: performance: Substring_InitStr calls strlen */
-               word = Substring_InitStr(words.words[i]);
-               modifyWord(word, &result, modifyWord_args);
+               modifyWord(words.words[i], &result, modifyWord_args);
                if (result.buf.len > 0)
                        SepBuf_Sep(&result);
        }
 
-       Words_Free(words);
+       SubstringWords_Free(words);
 
 done:
        Expr_SetValueOwn(expr, SepBuf_DoneData(&result));



Home | Main Index | Thread Index | Old Index