]> git.saurik.com Git - bison.git/commit
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)
commit2d32fc9fe2e648418f253405f0be19dc903bf8c9
tree4fb7de613f9d93e589692505ff5a69dc70dc28a5
parentf6038cb8c35c6b1a827fd3f6356d8cc9a002abe0
Add "%define assert" to variants.

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.
ChangeLog
data/lalr1-fusion.cc
etc/bench.pl.in