]> git.saurik.com Git - bison.git/blobdiff - src/closure.c
* src/conflicts.c (print_reductions): Improve variable locality.
[bison.git] / src / closure.c
index ad3a5be7af70a3870d6cbed9905646518285cd22..2cee4f80903669a1376dd268f1eb3ad60fc040ef 100644 (file)
@@ -235,14 +235,14 @@ new_closure (int n)
 void
 closure (short *core, int n)
 {
-  int ruleno;
   /* Index over CORE. */
   int c;
 
   /* Index over RULESET. */
   int r;
 
-  int itemno;
+  /* A bit index over RULESET. */
+  int ruleno;
 
   if (trace_flag)
     {
@@ -268,31 +268,21 @@ closure (short *core, int n)
            ruleset[r] |= FDERIVES (ritem[core[c]])[r];
     }
 
-  ruleno = 0;
   itemsetsize = 0;
   c = 0;
-  for (r = 0; r < rulesetsize; ++r)
-    {
-      int b;
-
-      for (b = 0; b < BITS_PER_WORD; b++)
-       {
-         if (ruleset[r] & (1 << b))
-           {
-             itemno = rule_table[ruleno].rhs;
-             while (c < n && core[c] < itemno)
-               {
-                 itemset[itemsetsize] = core[c];
-                 itemsetsize++;
-                 c++;
-               }
-             itemset[itemsetsize] = itemno;
-             itemsetsize++;
-           }
-
-         ruleno++;
-       }
-    }
+  for (ruleno = 0; ruleno < rulesetsize * BITS_PER_WORD; ++ruleno)
+    if (BITISSET (ruleset, ruleno))
+      {
+       int itemno = rule_table[ruleno].rhs;
+       while (c < n && core[c] < itemno)
+         {
+           itemset[itemsetsize] = core[c];
+           itemsetsize++;
+           c++;
+         }
+       itemset[itemsetsize] = itemno;
+       itemsetsize++;
+      }
 
   while (c < n)
     {