1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-05 11:21:04 -08:00

Fix bug #16576 with PRINTCHARFUN that conses output a lot.

src/print.c (print_object): Use FETCH_STRING_CHAR_ADVANCE, not
 STRING_CHAR_AND_LENGTH, so that if the string is relocated by GC,
 we still use correct addresses.
This commit is contained in:
Eli Zaretskii 2014-01-29 19:52:16 +02:00
parent 908df335d0
commit 198af6dfe2
2 changed files with 9 additions and 12 deletions

View file

@ -1,3 +1,9 @@
2014-01-29 Eli Zaretskii <eliz@gnu.org>
* print.c (print_object): Use FETCH_STRING_CHAR_ADVANCE, not
STRING_CHAR_AND_LENGTH, so that if the string is relocated by GC,
we still use correct addresses. (Bug#16576)
2014-01-27 K. Handa <handa@gnu.org>
Fix bug#16286 by the different way than revno:116158 to preserve

View file

@ -1389,9 +1389,8 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag)
print_string (obj, printcharfun);
else
{
register ptrdiff_t i_byte;
register ptrdiff_t i, i_byte;
struct gcpro gcpro1;
unsigned char *str;
ptrdiff_t size_byte;
/* 1 means we must ensure that the next character we output
cannot be taken as part of a hex character escape. */
@ -1410,23 +1409,15 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag)
}
PRINTCHAR ('\"');
str = SDATA (obj);
size_byte = SBYTES (obj);
for (i_byte = 0; i_byte < size_byte;)
for (i = 0, i_byte = 0; i_byte < size_byte;)
{
/* Here, we must convert each multi-byte form to the
corresponding character code before handing it to PRINTCHAR. */
int len;
int c;
if (multibyte)
{
c = STRING_CHAR_AND_LENGTH (str + i_byte, len);
i_byte += len;
}
else
c = str[i_byte++];
FETCH_STRING_CHAR_ADVANCE (c, obj, i, i_byte);
QUIT;