]> git.saurik.com Git - bison.git/commitdiff
Add "%define assert" to variants.
authorAkim Demaille <demaille@gostai.com>
Fri, 25 Jul 2008 20:48:42 +0000 (22:48 +0200)
committerAkim Demaille <demaille@gostai.com>
Fri, 7 Nov 2008 20:38:06 +0000 (21:38 +0100)
This is used to help the user catch cases where some value gets
ovewritten by a new one.  This should not happen, as this will
probably leak.

Unfortunately this uncovered a bug in the C++ parser itself: the
lookahead value was not destroyed between two calls to yylex.  For
instance if the previous lookahead was a std::string, and then an int,
then the value of the std::string was correctly taken (i.e., the
lookahead was now an empty string), but std::string structure itself
was not reclaimed.

This is now done in variant::build(other&) (which is used to take the
value of the lookahead): other is not only stolen from its value, it
is also destroyed.  This incurs a new performance penalty of a few
percent, and union becomes faster again.

* data/lalr1-fusion.cc (variant::build(other&)): Destroy other.
(b4_variant_if): New.
(variant::built): New.
Use it whereever the status of the variant changes.
* etc/bench.pl.in: Check the penalty of %define assert.


No differences found