]> git.eshelyaron.com Git - emacs.git/commitdiff
(print_string): When printcharfun is t,
authorRichard M. Stallman <rms@gnu.org>
Wed, 13 Sep 2006 15:16:12 +0000 (15:16 +0000)
committerRichard M. Stallman <rms@gnu.org>
Wed, 13 Sep 2006 15:16:12 +0000 (15:16 +0000)
copy string contents and call strout on the copy.

src/ChangeLog
src/print.c

index 8cafaa59e32eb2edd216d55867609e6b1d7538fc..f2125895c2c2f5798f9769c3900417ffffd614f7 100644 (file)
@@ -1,3 +1,13 @@
+2006-09-13  Richard Stallman  <rms@gnu.org>
+
+       * print.c (print_string): When printcharfun is t,
+       copy string contents and call strout on the copy.
+
+       * keyboard.c (read_char): If end_time specified, don't put the
+       event into this_command_keys.
+       (read_key_sequence): If Voverriding_terminal_local_map is specified,
+       don't check Voverriding_local_map at all.
+
 2006-09-12  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * textprop.c (Fnext_property_change, Fnext_single_property_change)
index 13354763f902efc3d4c690c68a9b162684400d66..57f83cae6966b2815fd11743d09b290a32882e92 100644 (file)
@@ -364,7 +364,10 @@ printchar (ch, fun)
    print_buffer.  PRINTCHARFUN t means output to the echo area or to
    stdout if non-interactive.  If neither nil nor t, call Lisp
    function PRINTCHARFUN for each character printed.  MULTIBYTE
-   non-zero means PTR contains multibyte characters.  */
+   non-zero means PTR contains multibyte characters.
+
+   In the case where PRINTCHARFUN is nil, it is safe for PTR to point
+   to data in a Lisp string.  Otherwise that is not safe.  */
 
 static void
 strout (ptr, size, size_byte, printcharfun, multibyte)
@@ -497,10 +500,29 @@ print_string (string, printcharfun)
       else
        chars = SBYTES (string);
 
-      /* strout is safe for output to a frame (echo area) or to print_buffer.  */
-      strout (SDATA (string),
-             chars, SBYTES (string),
-             printcharfun, STRING_MULTIBYTE (string));
+      if (EQ (printcharfun, Qt))
+       {
+         /* Output to echo area.  */
+         int nbytes = SBYTES (string);
+         char *buffer;
+
+         /* Copy the string contents so that relocation of STRING by
+            GC does not cause trouble.  */
+         USE_SAFE_ALLOCA;
+
+         SAFE_ALLOCA (buffer, char *, nbytes);
+         bcopy (SDATA (string), buffer, nbytes);
+
+         strout (buffer, chars, SBYTES (string),
+                 printcharfun, STRING_MULTIBYTE (string));
+
+         SAFE_FREE ();
+       }
+      else
+       /* No need to copy, since output to print_buffer can't GC.  */
+       strout (SDATA (string),
+               chars, SBYTES (string),
+               printcharfun, STRING_MULTIBYTE (string));
     }
   else
     {