]> git.eshelyaron.com Git - emacs.git/commitdiff
Restore old code in allocate_string_data to avoid Faset breakage.
authorDmitry Antipov <dmantipov@yandex.ru>
Tue, 17 Jul 2012 12:31:29 +0000 (16:31 +0400)
committerDmitry Antipov <dmantipov@yandex.ru>
Tue, 17 Jul 2012 12:31:29 +0000 (16:31 +0400)
Reported by Julien Danjou <julien@danjou.info> in
http://lists.gnu.org/archive/html/emacs-devel/2012-07/msg00371.html.
* alloc.c (allocate_string_data): Restore old code with minor
adjustments, fix comment to explain this subtle issue.

src/ChangeLog
src/alloc.c

index b78f261b49655efdba56ee37605e24360da31c2e..7487e0723a5911e9afbd1c6526e6b0938407c1a6 100644 (file)
@@ -1,3 +1,11 @@
+2012-07-17  Dmitry Antipov  <dmantipov@yandex.ru>
+
+       Restore old code in allocate_string_data to avoid Faset breakage.
+       Reported by Julien Danjou <julien@danjou.info> in
+       http://lists.gnu.org/archive/html/emacs-devel/2012-07/msg00371.html.
+       * alloc.c (allocate_string_data): Restore old code with minor
+       adjustments, fix comment to explain this subtle issue.
+
 2012-07-17  Eli Zaretskii  <eliz@gnu.org>
 
        Remove FILE_SYSTEM_CASE.
index 67ff3459e719e6a65502e8e5b710f8dc0dae739c..f8456e3645f80eb543a033d5f692b71ef612b844 100644 (file)
@@ -1971,9 +1971,9 @@ void
 allocate_string_data (struct Lisp_String *s,
                      EMACS_INT nchars, EMACS_INT nbytes)
 {
-  struct sdata *data;
+  struct sdata *data, *old_data;
   struct sblock *b;
-  ptrdiff_t needed;
+  ptrdiff_t needed, old_nbytes;
 
   if (STRING_BYTES_MAX < nbytes)
     string_overflow ();
@@ -1981,6 +1981,13 @@ allocate_string_data (struct Lisp_String *s,
   /* Determine the number of bytes needed to store NBYTES bytes
      of string data.  */
   needed = SDATA_SIZE (nbytes);
+  if (s->data)
+    {
+      old_data = SDATA_OF_STRING (s);
+      old_nbytes = GC_STRING_BYTES (s);
+    }
+  else
+    old_data = NULL;
 
   MALLOC_BLOCK_INPUT;
 
@@ -2050,6 +2057,16 @@ allocate_string_data (struct Lisp_String *s,
   memcpy ((char *) data + needed, string_overrun_cookie,
          GC_STRING_OVERRUN_COOKIE_SIZE);
 #endif
+
+  /* Note that Faset may call to this function when S has already data
+     assigned.  In this case, mark data as free by setting it's string
+     back-pointer to null, and record the size of the data in it.  */
+  if (old_data)
+    {
+      SDATA_NBYTES (old_data) = old_nbytes;
+      old_data->string = NULL;
+    }
+
   consing_since_gc += needed;
 }