From a3d4c6fbb1b4d7b98bff774bb05e2cb66890a8b1 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Mon, 28 Jul 2008 16:01:57 +0200 Subject: [PATCH 1/1] Destroy the variants that remain on the stack in case of error. * data/lalr1-fusion.cc (yydestruct_): Invoke the variant's destructor. Display the value only if yymsg is nonnull. (yyreduce): Invoke yydestruct_ when popping lhs symbols. --- ChangeLog | 8 ++++++++ data/lalr1-fusion.cc | 31 +++++++++++++++++++++---------- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index b7cac251..a9f76020 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-11-07 Akim Demaille + + Destroy the variants that remain on the stack in case of error. + * data/lalr1-fusion.cc (yydestruct_): Invoke the variant's + destructor. + Display the value only if yymsg is nonnull. + (yyreduce): Invoke yydestruct_ when popping lhs symbols. + 2008-11-07 Akim Demaille Add "%define assert" to variants. diff --git a/data/lalr1-fusion.cc b/data/lalr1-fusion.cc index 1f1129ae..20f1cb8c 100644 --- a/data/lalr1-fusion.cc +++ b/data/lalr1-fusion.cc @@ -450,6 +450,7 @@ m4_ifdef([b4_stype], /// \brief Reclaim the memory associated to a symbol. /// \param yymsg Why this token is reclaimed. + /// If null, nothing is printed at all. /// \param yytype The symbol type. /// \param yyvalue Its semantic value. /// \param yylocation Its location. @@ -693,14 +694,19 @@ b4_percent_code_get[]dnl YYUSE (yyvalue); YYUSE (yylocation); - YY_SYMBOL_PRINT (yymsg, yytype, yyvalue, yylocation); + if (yymsg) + YY_SYMBOL_PRINT (yymsg, yytype, yyvalue, yylocation); + // User destructor. switch (yytype) { ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[ default: break; - } + }]b4_variant_if([ + + // Type destructor. + b4_symbol_variant([[yytype]], [[yyvalue]], [[destroy]])])[ } ]b4_parser_class_name[::data_type::data_type () @@ -926,16 +932,21 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], yyval, yyloc); - -]b4_variant_if([ +]b4_variant_if([[ // Destroy the lhs symbols. for (int i = 0; i < yylen; ++i) - { - b4_symbol_variant([[yystos_[yystack_@{i@}.state]]], - [[yystack_@{i@}.value]], - [[destroy]]) - }])dnl -[ + // Destroy a variant which value may have be swapped with yyval. + // The value of yyval (hence maybe one of these lhs symbols) + // depends on what does the default contruction for this type. + // In the case of pointers for instance, nothing is done, so the + // value is junk. Therefore do not try to report the content in + // the debug trace, it's junk. Hence yymsg = 0. Besides, that + // keeps exactly the same traces as with the other Bison + // skeletons. + yydestruct_ (0, + yystos_[yystack_[i].state], + yystack_[i].value, yystack_[i].location);]])[ + yypop_ (yylen); yylen = 0; YY_STACK_PRINT (); -- 2.45.2