]> git.saurik.com Git - bison.git/commitdiff
(yyinitGLRStack, yyreturn): Don't call malloc again if the first call
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 22 Jul 2005 04:56:14 +0000 (04:56 +0000)
committerPaul Eggert <eggert@cs.ucla.edu>
Fri, 22 Jul 2005 04:56:14 +0000 (04:56 +0000)
fails.

data/glr.c

index d004cec973f39b2f2e259b63eb827730f907b315..f23f90494bac9628df3b73aaa960fcad3f181477 100644 (file)
@@ -1018,11 +1018,14 @@ yyinitGLRStack (yyGLRStack* yystack, size_t yysize)
   yystack->yyerrState = 0;
   yynerrs = 0;
   yystack->yyspaceLeft = yysize;
   yystack->yyerrState = 0;
   yynerrs = 0;
   yystack->yyspaceLeft = yysize;
-  yystack->yynextFree = yystack->yyitems =
+  yystack->yyitems =
     (yyGLRStackItem*) YYMALLOC (yysize * sizeof yystack->yynextFree[0]);
     (yyGLRStackItem*) YYMALLOC (yysize * sizeof yystack->yynextFree[0]);
+  if (!yystack->yyitems)
+    return yyfalse;
+  yystack->yynextFree = yystack->yyitems;
   yystack->yysplitPoint = NULL;
   yystack->yylastDeleted = NULL;
   yystack->yysplitPoint = NULL;
   yystack->yylastDeleted = NULL;
-  return yyinitStateSet (&yystack->yytops) && yystack->yyitems;
+  return yyinitStateSet (&yystack->yytops);
 }
 
 #define YYRELOC(YYFROMITEMS,YYTOITEMS,YYX,YYTYPE) \
 }
 
 #define YYRELOC(YYFROMITEMS,YYTOITEMS,YYX,YYTYPE) \
@@ -2154,24 +2157,27 @@ b4_syncline([@oline@], [@ofile@])])dnl
     yydestruct ("Error: discarding lookahead",
                 yytoken, yylvalp]b4_location_if([, yyllocp])[);
 
     yydestruct ("Error: discarding lookahead",
                 yytoken, yylvalp]b4_location_if([, yyllocp])[);
 
-  /* Now pop stack until empty, destroying its entries as we go.  */
-  {
-    yyGLRState** yystates = yystack.yytops.yystates;
-    if (yystates)
-      while (yystates[0])
-       {
-         yyGLRState *yys = yystates[0];
+  /* If the stack is well-formed, pop the stack until it is empty,
+     destroying its entries as we go.  But free the stack regardless
+     of whether it is well-formed.  */
+  if (yystack.yyitems)
+    {
+      yyGLRState** yystates = yystack.yytops.yystates;
+      if (yystates)
+       while (yystates[0])
+         {
+           yyGLRState *yys = yystates[0];
 ]b4_location_if([[       yystack.yyerror_range[1].yystate.yyloc = yys->yyloc;]]
 ]b4_location_if([[       yystack.yyerror_range[1].yystate.yyloc = yys->yyloc;]]
-)[       yydestruct ("Error: popping",
-                     yystos[yys->yylrState],
-                     &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[);
-         yystates[0] = yys->yypred;
-         yystack.yynextFree -= 1;
-         yystack.yyspaceLeft += 1;
-       }
-  }
+)[         yydestruct ("Error: popping",
+                       yystos[yys->yylrState],
+                       &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[);
+           yystates[0] = yys->yypred;
+           yystack.yynextFree -= 1;
+           yystack.yyspaceLeft += 1;
+         }
+      yyfreeGLRStack (&yystack);
+    }
 
 
-  yyfreeGLRStack (&yystack);
   return yyresult;
 }
 
   return yyresult;
 }