Commit b7ffe040 authored by Dmitry Antipov's avatar Dmitry Antipov

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.
parent 4dc7c8d5
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.
......
......@@ -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;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment