[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH] Destroy the variants that remain on the stack in case of error.,
Akim Demaille <=