bison-patches
[Top][All Lists]
Advanced

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

03-fyi-fix-memory-alloc.patch


From: Akim Demaille
Subject: 03-fyi-fix-memory-alloc.patch
Date: Wed, 05 Dec 2001 08:24:17 +0100

Index: ChangeLog
from  Akim Demaille  <address@hidden>
        Because useless nonterminals are now kept alive (instead of being
        `destroyed'), we now sometimes examine them, and store information
        related to them.  Hence we need to know their number, and adjust
        memory allocations.
        
        * src/reduce.c, src/reduce.h (nuseless_nonterminals): No longer
        static.
        * src/LR0.c (allocate_itemsets): The memory allocated to
        `symbol_count' was used for two different purpose: once to count
        the number of occurrences of each symbol, and later reassigned to
        `shift_symbol', containing the symbol that can be shifted from a
        given state.
        Deobfuscate, i.e., allocate, use and free `symbol_count' here
        only, and...
        (new_itemsets): Allocate `shift_symbol' here.
        (allocate_itemsets): symbol_count includes useless nonterminals.
        Make room for them.
        (free_storage): Use `free', not `XFREE', for pointers that cannot
        be null.
        
        
Index: src/LR0.c
--- src/LR0.c Thu, 29 Nov 2001 21:52:19 +0100 akim
+++ src/LR0.c Sat, 01 Dec 2001 13:07:18 +0100 akim
@@ -30,7 +30,7 @@
 #include "complain.h"
 #include "closure.h"
 #include "LR0.h"
-
+#include "reduce.h"
 
 int nstates;
 int final_state;
@@ -63,11 +63,13 @@
 allocate_itemsets (void)
 {
   int i;
-  int count;
-  short *symbol_count = NULL;
 
-  count = 0;
-  symbol_count = XCALLOC (short, nsyms);
+  /* Count the number of occurrences of all the symbols in RITEMS.
+     Note that useless productions (hence useless nonterminals) are
+     browsed too, hence we need to allocate room for _all_ the
+     symbols.  */
+  int count = 0;
+  short *symbol_count = XCALLOC (short, nsyms + nuseless_nonterminals);
 
   for (i = 0; ritem[i]; ++i)
     if (ritem[i] > 0)
@@ -93,7 +95,7 @@
       count += symbol_count[i];
     }
 
-  shift_symbol = symbol_count;
+  free (symbol_count);
   kernel_size = XCALLOC (int, nsyms);
 }
 
@@ -112,13 +114,13 @@
 static void
 free_storage (void)
 {
-  XFREE (shift_symbol);
-  XFREE (redset);
-  XFREE (shiftset);
-  XFREE (kernel_base);
-  XFREE (kernel_size);
+  free (shift_symbol);
+  free (redset);
+  free (shiftset);
+  free (kernel_base);
+  free (kernel_size);
   XFREE (kernel_items);
-  XFREE (state_table);
+  free (state_table);
 }
 
 
@@ -148,6 +150,7 @@
   for (i = 0; i < nsyms; i++)
     kernel_size[i] = 0;
 
+  shift_symbol = XCALLOC (short, nsyms);
   shiftcount = 0;
 
   for (i = 0; i < itemsetsize; ++i)
Index: src/nullable.c
--- src/nullable.c Sat, 01 Dec 2001 12:49:37 +0100 akim
+++ src/nullable.c Sat, 01 Dec 2001 12:52:48 +0100 akim
@@ -28,6 +28,7 @@
 #include "reader.h"
 #include "types.h"
 #include "gram.h"
+#include "reduce.h"
 #include "nullable.h"
 
 char *nullable = NULL;
@@ -64,11 +65,14 @@
   s1 = s2 = squeue;
 
   rcount = XCALLOC (short, nrules + 1);
-  rsets = XCALLOC (shorts *, nvars) - ntokens;
+
+  /* RITEM contains all the rules, including useless productions.
+     Hence we must allocate room for useless nonterminals too.  */
+  rsets = XCALLOC (shorts *, nvars + nuseless_nonterminals) - ntokens;
   /* This is said to be more elements than we actually use.
      Supposedly nitems - nrules is enough.
      But why take the risk?  */
-  relts = XCALLOC (shorts, nitems + nvars + 1);
+  relts = XCALLOC (shorts, nitems + nvars + nuseless_nonterminals + 1);
   p = relts;
 
   for (r = ritem; *r; ++r)
Index: src/reduce.c
--- src/reduce.c Sat, 01 Dec 2001 12:41:03 +0100 akim
+++ src/reduce.c Sat, 01 Dec 2001 12:52:39 +0100 akim
@@ -54,7 +54,7 @@
 static int nuseful_productions;
 static int nuseless_productions;
 static int nuseful_nonterminals;
-static int nuseless_nonterminals;
+int nuseless_nonterminals;
 
 static bool
 bits_equal (BSet L, BSet R, int n)
Index: src/reduce.h
--- src/reduce.h Sat, 10 Nov 2001 14:09:09 +0100 akim
+++ src/reduce.h Sat, 01 Dec 2001 12:52:39 +0100 akim
@@ -24,4 +24,6 @@
 void reduce_grammar PARAMS ((void));
 void reduce_output PARAMS ((FILE *out));
 void reduce_free PARAMS ((void));
+
+extern int nuseless_nonterminals;
 #endif /* !REDUCE_H_ */



reply via email to

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