bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] Destroy the variants that remain on the stack in case of error.


From: Akim Demaille
Subject: [PATCH] Destroy the variants that remain on the stack in case of error.
Date: Fri, 07 Nov 2008 20:38:18 -0000

        * 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 b7cac25..a9f7602 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2008-11-07  Akim Demaille  <address@hidden>
 
+       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  <address@hidden>
+
        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
diff --git a/data/lalr1-fusion.cc b/data/lalr1-fusion.cc
index 1f1129a..20f1cb8 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(address@hidden@}.state]]],
-                          address@hidden@}.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 ();
-- 
1.6.0.2.588.g3102





reply via email to

[Prev in Thread] Current Thread [Next in Thread]