]> git.eshelyaron.com Git - emacs.git/commitdiff
(allocate_string_data): If string had already data
authorGerd Moellmann <gerd@gnu.org>
Tue, 18 Jul 2000 14:38:20 +0000 (14:38 +0000)
committerGerd Moellmann <gerd@gnu.org>
Tue, 18 Jul 2000 14:38:20 +0000 (14:38 +0000)
assigned, copy old contents to new string data.

src/alloc.c

index 480a30ace51e3a4a123f59fdb319569c22ae106b..4dc0b8165fa362d727cbc395a2cc97071a6f0640 100644 (file)
@@ -1029,9 +1029,9 @@ allocate_string_data (s, nchars, nbytes)
      struct Lisp_String *s;
      int nchars, nbytes;
 {
-  struct sdata *data;
+  struct sdata *data, *old_data;
   struct sblock *b;
-  int needed;
+  int needed, old_nbytes;
 
   /* Determine the number of bytes needed to store NBYTES bytes
      of string data.  */
@@ -1077,16 +1077,9 @@ allocate_string_data (s, nchars, nbytes)
     }
   else
     b = current_sblock;
-      
-  /* If S had already data assigned, mark that as free by setting
-     its string back-pointer to null, and recording the size of
-     the data in it..  */
-  if (s->data)
-    {
-      data = SDATA_OF_STRING (s);
-      data->u.nbytes = GC_STRING_BYTES (s);
-      data->string = NULL;
-    }
+
+  old_data = s->data ? SDATA_OF_STRING (s) : NULL;
+  old_nbytes = GC_STRING_BYTES (s);
   
   data = b->next_free;
   data->string = s;
@@ -1096,6 +1089,16 @@ allocate_string_data (s, nchars, nbytes)
   s->data[nbytes] = '\0';
   b->next_free = (struct sdata *) ((char *) data + needed);
   
+  /* If S had already data assigned, mark that as free by setting its
+     string back-pointer to null, and recording the size of the data
+     in it.. Copy old string contents to the new sdata.  */
+  if (old_data)
+    {
+      bcopy (old_data->u.data, s->data, old_nbytes);
+      old_data->u.nbytes = old_nbytes;
+      old_data->string = NULL;
+    }
+
   consing_since_gc += needed;
 }