summaryrefslogtreecommitdiff
path: root/tests/push.at
diff options
context:
space:
mode:
authorJoel E. Denny <jdenny@ces.clemson.edu>2007-08-18 00:45:52 +0000
committerJoel E. Denny <jdenny@ces.clemson.edu>2007-08-18 00:45:52 +0000
commit1b17b01d0fa00512e2d7b561757336bff9784fa0 (patch)
tree2190dc46c36b01cfea52c7d9da9ebdf57a2f981b /tests/push.at
parent9987d1b3cce14fd74c4bc382048254697c2de945 (diff)
downloadbison-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.at74
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