[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] Don't memcpy C++ structures.
From: |
Akim Demaille |
Subject: |
[PATCH] Don't memcpy C++ structures. |
Date: |
Tue, 04 Nov 2008 20:43:34 -0000 |
* data/lalr1-fusion.cc (b4_symbol_variant): Adjust additional
arguments.
(variant::build): New overload for
copy-construction-that-destroys.
(variant::swap): New.
(parser::yypush_): Use it in variant mode.
---
ChangeLog | 10 ++++++++++
data/lalr1-fusion.cc | 29 +++++++++++++++++++++++++----
2 files changed, 35 insertions(+), 4 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index ea2c3d6..ba6b25f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
2008-11-04 Akim Demaille <address@hidden>
+ Don't memcpy C++ structures.
+ * data/lalr1-fusion.cc (b4_symbol_variant): Adjust additional
+ arguments.
+ (variant::build): New overload for
+ copy-construction-that-destroys.
+ (variant::swap): New.
+ (parser::yypush_): Use it in variant mode.
+
+2008-11-04 Akim Demaille <address@hidden>
+
Better defaults for bench.pl.
* etc/bench.pl.in ($verbose, $cflags, $iterations): Change the
default values.
diff --git a/data/lalr1-fusion.cc b/data/lalr1-fusion.cc
index e3cafff..f2659fb 100644
--- a/data/lalr1-fusion.cc
+++ b/data/lalr1-fusion.cc
@@ -85,13 +85,13 @@ m4_define([b4_symbol_action_],
])])
-# b4_symbol_variant(YYTYPE, YYVAL, ACTION)
-# ----------------------------------------
+# b4_symbol_variant(YYTYPE, YYVAL, ACTION, [ARGS])
+# ------------------------------------------------
# Run some ACTION ("build", or "destroy") on YYVAL of symbol type
# YYTYPE.
m4_define([b4_symbol_variant],
[m4_pushdef([b4_dollar_dollar],
- [$2.$3<$][3>()])dnl
+ [$2.$3<$][3>(m4_shift3($@))])dnl
switch ($1)
{
m4_map([b4_symbol_action_], m4_defn([b4_type_names]))
@@ -202,6 +202,24 @@ dnl FIXME: This is wrong, we want computed header guards.
return reinterpret_cast<const T&>(buffer);
}
+ /// Swap the content with \a other.
+ template <typename T>
+ inline void
+ swap(variant<S>& other)
+ {
+ std::swap(as<T>(), other.as<T>());
+ }
+
+ /// Assign the content of \a other to this.
+ /// Destroys \a other.
+ template <typename T>
+ inline void
+ build(variant<S>& other)
+ {
+ build<T>();
+ swap<T>(other);
+ }
+
/// Destroy the stored \a T.
template <typename T>
inline void
@@ -683,7 +701,10 @@ do { \
]b4_parser_class_name[::yypush_ (state_type s,
semantic_type& v, const location_type& l)
{
- yystack_.push (data_type (s, v, l));
+]b4_variant_if(
+[[ yystack_.push (data_type (s, semantic_type(), l));
+ ]b4_symbol_variant([[yystos_[s]]], [[yystack_[0].value]], [build], [v])],
+[ yystack_.push (data_type (s, v, l));])[
}
void
--
1.6.0.2.588.g3102
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH] Don't memcpy C++ structures.,
Akim Demaille <=