m4-patches
[Top][All Lists]
Advanced

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

[PATCH 3/3] symtab: use less memory in pushdef stacks


From: Eric Blake
Subject: [PATCH 3/3] symtab: use less memory in pushdef stacks
Date: Sat, 17 Apr 2021 14:58:29 -0500

No need to xstrdup identical names when we can share the same name
across the pushdef stack.

* src/symtab.c (free_symbol): Don't free shared name.
(lookup_symbol): Share name across pushdef stack.
---
 src/symtab.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/symtab.c b/src/symtab.c
index 16ee3f97..842f231f 100644
--- a/src/symtab.c
+++ b/src/symtab.c
@@ -144,7 +144,8 @@ free_symbol (symbol *sym)
     SYMBOL_DELETED (sym) = true;
   else
     {
-      free (SYMBOL_NAME (sym));
+      if (SYMBOL_STACK (sym) == NULL)
+        free (SYMBOL_NAME (sym));
       if (SYMBOL_TYPE (sym) == TOKEN_TEXT)
         free (SYMBOL_TEXT (sym));
       free (sym);
@@ -219,7 +220,8 @@ lookup_symbol (const char *name, symbol_lookup mode)
               SYMBOL_TYPE (sym) = TOKEN_VOID;
               SYMBOL_TRACED (sym) = SYMBOL_TRACED (old);
               sym->hash = h;
-              SYMBOL_NAME (sym) = xstrdup (name);
+              SYMBOL_NAME (sym) = old->name;
+              old->name = xstrdup (name);
               SYMBOL_MACRO_ARGS (sym) = false;
               SYMBOL_BLIND_NO_ARGS (sym) = false;
               SYMBOL_DELETED (sym) = false;
@@ -244,7 +246,6 @@ lookup_symbol (const char *name, symbol_lookup mode)
       SYMBOL_TYPE (sym) = TOKEN_VOID;
       SYMBOL_TRACED (sym) = false;
       sym->hash = h;
-      SYMBOL_NAME (sym) = xstrdup (name);
       SYMBOL_MACRO_ARGS (sym) = false;
       SYMBOL_BLIND_NO_ARGS (sym) = false;
       SYMBOL_DELETED (sym) = false;
@@ -260,7 +261,10 @@ lookup_symbol (const char *name, symbol_lookup mode)
           sym->next = SYMBOL_STACK (sym)->next;
           SYMBOL_STACK (sym)->next = NULL;
           SYMBOL_TRACED (sym) = SYMBOL_TRACED (SYMBOL_STACK (sym));
+          SYMBOL_NAME (sym) = SYMBOL_NAME (SYMBOL_STACK (sym));
         }
+      else
+        SYMBOL_NAME (sym) = xstrdup (name);
       return sym;

     case SYMBOL_DELETE:
-- 
2.31.1




reply via email to

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