]> git.eshelyaron.com Git - emacs.git/commitdiff
Do not use memcpy for copying intervals.
authorDmitry Antipov <dmantipov@yandex.ru>
Fri, 17 Aug 2012 05:35:39 +0000 (09:35 +0400)
committerDmitry Antipov <dmantipov@yandex.ru>
Fri, 17 Aug 2012 05:35:39 +0000 (09:35 +0400)
* intervals.c (reproduce_interval): New function.
(reproduce_tree, reproduce_tree_obj): Use it.
(reproduce_tree_obj): Remove prototype.

src/ChangeLog
src/intervals.c

index b1b6ac1cc4b8a8e01a473f328a155f84ecee8f64..84d6920b3ea4f6fe841f0d544397e6edd62ec25e 100644 (file)
@@ -1,3 +1,10 @@
+2012-08-17  Dmitry Antipov  <dmantipov@yandex.ru>
+
+       Do not use memcpy for copying intervals.
+       * intervals.c (reproduce_interval): New function.
+       (reproduce_tree, reproduce_tree_obj): Use it.
+       (reproduce_tree_obj): Remove prototype.
+
 2012-08-17  Paul Eggert  <eggert@cs.ucla.edu>
 
        * lisp.h (duration_to_sec_usec): Remove unused decl.
index 09949bbbd45dd904262cad2b4945254c2f398860..b0ef7c8d3b99bce369789c2624b69eb24b8ac08b 100644 (file)
@@ -59,7 +59,6 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 static Lisp_Object merge_properties_sticky (Lisp_Object, Lisp_Object);
 static INTERVAL merge_interval_right (INTERVAL);
 static INTERVAL reproduce_tree (INTERVAL, INTERVAL);
-static INTERVAL reproduce_tree_obj (INTERVAL, Lisp_Object);
 \f
 /* Utility functions for intervals.  */
 
@@ -1498,6 +1497,26 @@ merge_interval_left (register INTERVAL i)
   abort ();
 }
 \f
+/* Create a copy of SOURCE but with the default value of UP.  */
+
+static INTERVAL
+reproduce_interval (INTERVAL source)
+{
+  register INTERVAL target = make_interval ();
+
+  target->total_length = source->total_length;
+  target->position = source->position;
+
+  copy_properties (source, target);
+
+  if (! NULL_LEFT_CHILD (source))
+    interval_set_left (target, reproduce_tree (source->left, target));
+  if (! NULL_RIGHT_CHILD (source))
+    interval_set_right (target, reproduce_tree (source->right, target));
+
+  return target;
+}
+
 /* Make an exact copy of interval tree SOURCE which descends from
    PARENT.  This is done by recursing through SOURCE, copying
    the current interval and its properties, and then adjusting
@@ -1506,33 +1525,19 @@ merge_interval_left (register INTERVAL i)
 static INTERVAL
 reproduce_tree (INTERVAL source, INTERVAL parent)
 {
-  register INTERVAL t = make_interval ();
-
-  memcpy (t, source, sizeof *t);
-  copy_properties (source, t);
-  interval_set_parent (t, parent);
-  if (! NULL_LEFT_CHILD (source))
-    interval_set_left (t, reproduce_tree (source->left, t));
-  if (! NULL_RIGHT_CHILD (source))
-    interval_set_right (t, reproduce_tree (source->right, t));
+  register INTERVAL target = reproduce_interval (source);
 
-  return t;
+  interval_set_parent (target, parent);
+  return target;
 }
 
 static INTERVAL
 reproduce_tree_obj (INTERVAL source, Lisp_Object parent)
 {
-  register INTERVAL t = make_interval ();
-
-  memcpy (t, source, sizeof *t);
-  copy_properties (source, t);
-  interval_set_object (t, parent);
-  if (! NULL_LEFT_CHILD (source))
-    interval_set_left (t, reproduce_tree (source->left, t));
-  if (! NULL_RIGHT_CHILD (source))
-    interval_set_right (t, reproduce_tree (source->right, t));
+  register INTERVAL target = reproduce_interval (source);
 
-  return t;
+  interval_set_object (target, parent);
+  return target;
 }
 \f
 /* Insert the intervals of SOURCE into BUFFER at POSITION.