diff options
author | Joel E. Denny <jdenny@ces.clemson.edu> | 2007-08-18 00:45:52 +0000 |
---|---|---|
committer | Joel E. Denny <jdenny@ces.clemson.edu> | 2007-08-18 00:45:52 +0000 |
commit | 1b17b01d0fa00512e2d7b561757336bff9784fa0 (patch) | |
tree | 2190dc46c36b01cfea52c7d9da9ebdf57a2f981b /tests/push.at | |
parent | 9987d1b3cce14fd74c4bc382048254697c2de945 (diff) | |
download | bison-1b17b01d0fa00512e2d7b561757336bff9784fa0.tar.gz |
In impure push mode, don't allow more than one yypstate to be allocated
since multiple impure parsers would corrupt yynerrs.
* data/push.c (yypstate_allocated): New static global variable
initialized to 0.
(yypull_parse): If yypstate_new returns 0, don't report it as memory
exhaustion if yypstate_allocated is 1, but still return 2.
(yypstate_new): Invoke yyerror and return 0 if yypstate_allocated is
already 1. Otherwise, set it to 1.
(yypstate_delete): Set it to 0.
* tests/push.at (Push Parsing: Multiple impure instances): New test
case.
Diffstat (limited to 'tests/push.at')
-rw-r--r-- | tests/push.at | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/tests/push.at b/tests/push.at index 4f128b26..16ca4132 100644 --- a/tests/push.at +++ b/tests/push.at @@ -76,3 +76,77 @@ AT_COMPILE([[input]]) AT_PARSER_CHECK([[./input]]) AT_CLEANUP + + +## ----------------------------------------- ## +## Push Parsing: Multiple impure instances. ## +## ----------------------------------------- ## + +AT_SETUP([[Push Parsing: Multiple impure instances]]) + +AT_DATA_GRAMMAR([[input.y]], +[[ +%{ + #include <assert.h> + #include <stdio.h> + void yyerror (char const *msg); + int yylex (void); +%} + +%push-pull-parser + +%% + +start: ; + +%% + +void +yyerror (char const *msg) +{ + fprintf (stderr, "%s\n", msg); +} + +int +yylex (void) +{ + return 0; +} + +int +main (void) +{ + yypstate *ps; + int i; + + for (i = 0; i < 2; ++i) + { + ps = yypstate_new (); + assert (ps); + assert (yypstate_new () == NULL); + assert (yyparse () == 2); + yychar = 0; + assert (yypush_parse (ps) == 0); + assert (yypstate_new () == NULL); + assert (yyparse () == 2); + yypstate_delete (ps); + } + + return 0; +} +]]) + +AT_CHECK([[bison -o input.c input.y]]) +AT_COMPILE([[input]]) +AT_PARSER_CHECK([[./input]], 0, [], +[[cannot allocate multiple impure push-parser instances +cannot allocate multiple impure push-parser instances +cannot allocate multiple impure push-parser instances +cannot allocate multiple impure push-parser instances +cannot allocate multiple impure push-parser instances +cannot allocate multiple impure push-parser instances +cannot allocate multiple impure push-parser instances +cannot allocate multiple impure push-parser instances +]]) + +AT_CLEANUP |