bison-patches
[Top][All Lists]
Advanced

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

goto-number patches for lalr.c, lalr.h, tables.c


From: Paul Eggert
Subject: goto-number patches for lalr.c, lalr.h, tables.c
Date: Tue, 07 Dec 2004 21:57:17 -0800
User-agent: Gnus/5.1006 (Gnus v5.10.6) Emacs/21.3 (gnu/linux)

I mentioned a while ago that I had some goto-number-related patches
for lalr.c, for the unlikely (and untested) case where Bison has more
than 2**31 goto numbers.  Here they are: I installed them.

2004-12-07  Paul Eggert  <address@hidden>

        * src/lalr.h (GOTO_NUMBER_MAXIMUM): New macro.
        * src/lalr.c (set_goto_map): Don't allow ngotos to equal
        GOTO_NUMBER_MAXIMUM, since we occasionally compute
        ngotos + 1 without checking for overflow.
        (build_relations): Use END_NODE, not -1, to denote end of edges.
        * src/lalr.c (set_goto_map, map_goto, initialize_F, add_loopback_edge,
        build_relations): Use goto_number, not int, for goto numbers.
        * src/tables.c (save_column, default_goto): Likewise.

Index: src/lalr.h
===================================================================
RCS file: /cvsroot/bison/bison/src/lalr.h,v
retrieving revision 1.30
diff -p -u -r1.30 lalr.h
--- src/lalr.h  22 Oct 2004 23:14:00 -0000      1.30
+++ src/lalr.h  8 Dec 2004 05:47:17 -0000
@@ -57,6 +57,7 @@ void lalr_free (void);
    TO_STATE of the first of them.  */
 
 typedef size_t goto_number;
+# define GOTO_NUMBER_MAXIMUM ((goto_number) -1)
 
 extern goto_number *goto_map;
 extern state_number *from_state;
Index: src/lalr.c
===================================================================
RCS file: /cvsroot/bison/bison/src/lalr.c,v
retrieving revision 1.100
diff -p -u -r1.100 lalr.c
--- src/lalr.c  22 Nov 2004 21:05:25 -0000      1.100
+++ src/lalr.c  8 Dec 2004 05:47:17 -0000
@@ -91,14 +91,17 @@ set_goto_map (void)
       for (i = sp->num - 1; i >= 0 && TRANSITION_IS_GOTO (sp, i); --i)
        {
          ngotos++;
-         if (! ngotos)
+
+         /* Abort if (ngotos + 1) would overflow.  */
+         if (ngotos == GOTO_NUMBER_MAXIMUM)
            abort ();
+
          goto_map[TRANSITION_SYMBOL (sp, i) - ntokens]++;
        }
     }
 
   {
-    int k = 0;
+    goto_number k = 0;
     int i;
     for (i = ntokens; i < nsyms; i++)
       {
@@ -122,7 +125,7 @@ set_goto_map (void)
       int i;
       for (i = sp->num - 1; i >= 0 && TRANSITION_IS_GOTO (sp, i); --i)
        {
-         int k = temp_map[TRANSITION_SYMBOL (sp, i) - ntokens]++;
+         goto_number k = temp_map[TRANSITION_SYMBOL (sp, i) - ntokens]++;
          from_state[k] = s;
          to_state[k] = sp->states[i]->number;
        }
@@ -137,12 +140,12 @@ set_goto_map (void)
 | Map a state/symbol pair into its numeric representation.  |
 `----------------------------------------------------------*/
 
-static int
+static goto_number
 map_goto (state_number s0, symbol_number sym)
 {
-  int high;
-  int low;
-  int middle;
+  goto_number high;
+  goto_number low;
+  goto_number middle;
   state_number s;
 
   low = goto_map[sym - ntokens];
@@ -169,9 +172,9 @@ initialize_F (void)
 {
   goto_number **reads = CALLOC (reads, ngotos);
   goto_number *edge = CALLOC (edge, ngotos + 1);
-  int nedges = 0;
+  goto_number nedges = 0;
 
-  int i;
+  goto_number i;
 
   F = bitsetv_create (ngotos, ntokens, BITSET_FIXED);
 
@@ -195,7 +198,7 @@ initialize_F (void)
        {
          CALLOC (reads[i], nedges + 1);
          memcpy (reads[i], edge, nedges * sizeof (edge[0]));
-         reads[i][nedges] = -1;
+         reads[i][nedges] = END_NODE;
          nedges = 0;
        }
     }
@@ -211,7 +214,7 @@ initialize_F (void)
 
 
 static void
-add_lookback_edge (state *s, rule *r, int gotono)
+add_lookback_edge (state *s, rule *r, goto_number gotono)
 {
   int ri = state_reduction_find (s, r);
   goto_list *sp = MALLOC (sp, 1);
@@ -227,7 +230,7 @@ build_relations (void)
 {
   goto_number *edge = CALLOC (edge, ngotos + 1);
   state_number *states1 = CALLOC (states1, ritem_longest_rhs () + 1);
-  int i;
+  goto_number i;
 
   CALLOC (includes, ngotos);
 
@@ -279,7 +282,7 @@ build_relations (void)
          CALLOC (includes[i], nedges + 1);
          for (j = 0; j < nedges; j++)
            includes[i][j] = edge[j];
-         includes[i][nedges] = -1;
+         includes[i][nedges] = END_NODE;
        }
     }
 
@@ -294,7 +297,7 @@ build_relations (void)
 static void
 compute_FOLLOWS (void)
 {
-  int i;
+  goto_number i;
 
   relation_digraph (includes, ngotos, &F);
 
Index: src/tables.c
===================================================================
RCS file: /cvsroot/bison/bison/src/tables.c,v
retrieving revision 1.22
diff -p -u -r1.22 tables.c
--- src/tables.c        22 Nov 2004 21:05:25 -0000      1.22
+++ src/tables.c        8 Dec 2004 05:47:17 -0000
@@ -471,7 +471,7 @@ token_actions (void)
 static void
 save_column (symbol_number sym, state_number default_state)
 {
-  int i;
+  goto_number i;
   base_number *sp;
   base_number *sp1;
   base_number *sp2;
@@ -515,7 +515,7 @@ static state_number
 default_goto (symbol_number sym, short int state_count[])
 {
   state_number s;
-  int i;
+  goto_number i;
   goto_number m = goto_map[sym - ntokens];
   goto_number n = goto_map[sym - ntokens + 1];
   state_number default_state = -1;




reply via email to

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