From: Paul Eggert Date: Fri, 22 Jul 2005 04:56:14 +0000 (+0000) Subject: (yyinitGLRStack, yyreturn): Don't call malloc again if the first call X-Git-Tag: BISON-2_1~62 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/3922956abdb0ea20870750f8b62c168725bd9105?ds=sidebyside (yyinitGLRStack, yyreturn): Don't call malloc again if the first call fails. --- diff --git a/data/glr.c b/data/glr.c index d004cec9..f23f9049 100644 --- a/data/glr.c +++ b/data/glr.c @@ -1018,11 +1018,14 @@ yyinitGLRStack (yyGLRStack* yystack, size_t yysize) yystack->yyerrState = 0; yynerrs = 0; yystack->yyspaceLeft = yysize; - yystack->yynextFree = yystack->yyitems = + yystack->yyitems = (yyGLRStackItem*) YYMALLOC (yysize * sizeof yystack->yynextFree[0]); + if (!yystack->yyitems) + return yyfalse; + yystack->yynextFree = yystack->yyitems; yystack->yysplitPoint = NULL; yystack->yylastDeleted = NULL; - return yyinitStateSet (&yystack->yytops) && yystack->yyitems; + return yyinitStateSet (&yystack->yytops); } #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])[); - /* 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;]] -)[ 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; }