]> git.saurik.com Git - bison.git/commitdiff
Don't memcpy C++ structures.
authorAkim Demaille <demaille@gostai.com>
Mon, 21 Jul 2008 20:02:36 +0000 (22:02 +0200)
committerAkim Demaille <demaille@gostai.com>
Tue, 4 Nov 2008 20:43:28 +0000 (21:43 +0100)
* 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
data/lalr1-fusion.cc

index ea2c3d666a5e53567d26789c3f13f38f3c2595f4..ba6b25f41e4b119e4e85de706c2bb98b75e0ccc4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2008-11-04  Akim Demaille  <demaille@gostai.com>
+
+       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  <demaille@gostai.com>
 
        Better defaults for bench.pl.
 2008-11-04  Akim Demaille  <demaille@gostai.com>
 
        Better defaults for bench.pl.
index e3cafff83bb9195a354e2224ab94d9153af4fb1a..f2659fb9bfd24eb6c3f74aa6d6a76aaca0f81233 100644 (file)
@@ -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],
 # 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]))
   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);
     }
 
       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
     /// 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)
   {
   ]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
   }
 
   void