Ignore YYSTACK_USE_ALLOCA for push parsers since the stacks can't be

locals.  Reported by Juan Manuel Guerrero at
<http://lists.gnu.org/archive/html/bug-bison/2007-01/msg00000.html>.
* data/push.c: Enclose the #ifdef YYSTACK_USE_ALLOCA in b4_push_if.
Fix some indentation also.
* tests/torture.at (Exploding the Stack Size with Alloca): Add comment
explaining this issue.
This commit is contained in:
Joel E. Denny
2007-01-10 00:50:55 +00:00
parent 8f7ebfc81f
commit 78143faa16
3 changed files with 26 additions and 11 deletions

View File

@@ -1,3 +1,13 @@
2007-01-09 Joel E. Denny <jdenny@ces.clemson.edu>
Ignore YYSTACK_USE_ALLOCA for push parsers since the stacks can't be
locals. Reported by Juan Manuel Guerrero at
<http://lists.gnu.org/archive/html/bug-bison/2007-01/msg00000.html>.
* data/push.c: Enclose the #ifdef YYSTACK_USE_ALLOCA in b4_push_if.
Fix some indentation also.
* tests/torture.at (Exploding the Stack Size with Alloca): Add comment
explaining this issue.
2007-01-09 Paolo Bonzini <bonzini@gnu.org> 2007-01-09 Paolo Bonzini <bonzini@gnu.org>
and Joel E. Denny <jdenny@ces.clemson.edu> and Joel E. Denny <jdenny@ces.clemson.edu>

View File

@@ -332,7 +332,8 @@ typedef short int yytype_int16;
#if ! defined yyoverflow || YYERROR_VERBOSE #if ! defined yyoverflow || YYERROR_VERBOSE
/* The parser invokes alloca or malloc; define the necessary symbols. */ ]b4_push_if([],
[[/* The parser invokes alloca or malloc; define the necessary symbols. */
# ifdef YYSTACK_USE_ALLOCA # ifdef YYSTACK_USE_ALLOCA
# if YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA
@@ -357,7 +358,8 @@ typedef short int yytype_int16;
# endif # endif
# endif # endif
# ifdef YYSTACK_ALLOC ]])dnl
[# ifdef YYSTACK_ALLOC
/* Pacify GCC's `empty if-body' warning. */ /* Pacify GCC's `empty if-body' warning. */
# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
# ifndef YYSTACK_ALLOC_MAXIMUM # ifndef YYSTACK_ALLOC_MAXIMUM
@@ -1089,13 +1091,13 @@ b4_push_if(
]b4_locations_if([[ YYLTYPE yylloc; ]b4_locations_if([[ YYLTYPE yylloc;
]])])[ ]])])[
if (yyps == 0) if (yyps == 0)
yyps_local = yypstate_new (); yyps_local = yypstate_new ();
else else
yyps_local = yyps; yyps_local = yyps;
do { do {
yychar = YYLEX; yychar = YYLEX;
yystatus = yystatus =
yypush_parse (yyps_local]b4_pure_if([[, yychar, &yylval]b4_locations_if([[, &yylloc]])])m4_ifset([b4_parse_param], [, b4_c_args(b4_parse_param)])[); yypush_parse (yyps_local]b4_pure_if([[, yychar, &yylval]b4_locations_if([[, &yylloc]])])m4_ifset([b4_parse_param], [, b4_c_args(b4_parse_param)])[);
} while (yystatus == YYPUSH_MORE); } while (yystatus == YYPUSH_MORE);
if (yyps == 0) if (yyps == 0)
yypstate_delete (yyps_local); yypstate_delete (yyps_local);
@@ -1149,8 +1151,8 @@ b4_c_function_def([yyparse], [int], [[void *YYPARSE_PARAM], [YYPARSE_PARAM]])
b4_c_function_def([yyparse], [int], b4_parse_param) b4_c_function_def([yyparse], [int], b4_parse_param)
#endif])[ #endif])[
{ {
]b4_pure_if([b4_declare_scanner_communication_variables]) ]b4_pure_if([b4_declare_scanner_communication_variables])
b4_push_if([b4_pure_if([], [[ int yypushed_char = yychar; b4_push_if([b4_pure_if([], [[ int yypushed_char = yychar;
YYSTYPE yypushed_val = yylval; YYSTYPE yypushed_val = yylval;
]b4_locations_if([[YYLTYPE yypushed_loc = yylloc; ]b4_locations_if([[YYLTYPE yypushed_loc = yylloc;
]])])], ]])])],

View File

@@ -490,6 +490,9 @@ AT_PARSER_CHECK([./input 900], 0, [], [ignore])
# multiply by two starting at 200 => 5120 is the last possible). # multiply by two starting at 200 => 5120 is the last possible).
AT_PARSER_CHECK([./input 10000], 2, [], [ignore]) AT_PARSER_CHECK([./input 10000], 2, [], [ignore])
# The push parser can't use alloca since the stacks can't be locals. This test
# just helps guarantee we don't let the YYSTACK_USE_ALLOCA feature affect
# push parsers.
AT_DATA_STACK_TORTURE([AT_USE_ALLOCA], AT_DATA_STACK_TORTURE([AT_USE_ALLOCA],
[[%push-pull-parser [[%push-pull-parser
]]) ]])