changeset 4394:cacc942c0d0f

Avoid clearing print-gensym-alist inappropriately when printing hash tables. 2008-01-15 Aidan Kehoe <kehoea@parhasard.net> * automated/lisp-tests.el (thing): Check that printing a hash table literal doesn't clear print-gensym-alist. 2008-01-15 Aidan Kehoe <kehoea@parhasard.net> * print.c (prin1_to_string): New. The guts of Fprin1_to_string, without resetting Vprint_gensym_alist. (Fprin1_to_string): Call prin1_to_string, wrapped with RESET_PRINT_GENSYM calls. * doprnt.c (emacs_doprnt_1): Call prin1_to_string, not Fprin1_to_string (dos veces). Avoids an inappropriate reset of print-gensym-alist.
author Aidan Kehoe <kehoea@parhasard.net>
date Tue, 15 Jan 2008 21:35:01 +0100
parents cbf129b005df
children b03b5e362fcf
files src/ChangeLog src/doprnt.c src/lisp.h src/print.c tests/ChangeLog tests/automated/lisp-tests.el
diffstat 6 files changed, 56 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Sat Jan 12 18:04:13 2008 +0100
+++ b/src/ChangeLog	Tue Jan 15 21:35:01 2008 +0100
@@ -1,3 +1,14 @@
+2008-01-15  Aidan Kehoe  <kehoea@parhasard.net>
+
+	* print.c (prin1_to_string): New.
+	The guts of Fprin1_to_string, without resetting
+	Vprint_gensym_alist. 
+	(Fprin1_to_string): 
+	Call prin1_to_string, wrapped with RESET_PRINT_GENSYM calls.
+	* doprnt.c (emacs_doprnt_1): 
+	Call prin1_to_string, not Fprin1_to_string (dos veces). Avoids an
+	inappropriate reset of print-gensym-alist. 
+
 2008-01-12  Aidan Kehoe  <kehoea@parhasard.net>
 
 	* rangetab.c (Fmap_range_table): 
--- a/src/doprnt.c	Sat Jan 12 18:04:13 2008 +0100
+++ b/src/doprnt.c	Tue Jan 15 21:35:01 2008 +0100
@@ -558,7 +558,7 @@
 		{
 		  /* For `S', prin1 the argument and then treat like
 		     a string.  */
-		  ls = Fprin1_to_string (obj, Qnil);
+		  ls = prin1_to_string (obj, 0);
 		}
 	      else if (STRINGP (obj))
 		ls = obj;
@@ -567,7 +567,7 @@
 	      else
 		{
 		  /* convert to string using princ. */
-		  ls = Fprin1_to_string (obj, Qt);
+		  ls = prin1_to_string (obj, 1);
 		}
 	      string = XSTRING_DATA (ls);
 	      string_len = XSTRING_LENGTH (ls);
--- a/src/lisp.h	Sat Jan 12 18:04:13 2008 +0100
+++ b/src/lisp.h	Tue Jan 15 21:35:01 2008 +0100
@@ -4932,6 +4932,7 @@
 EXFUN (Fprinc, 2);
 EXFUN (Fprint, 2);
 
+Lisp_Object prin1_to_string (Lisp_Object, int);
 
 /* Lower-level ways to output data: */
 void default_object_printer (Lisp_Object, Lisp_Object, int);
--- a/src/print.c	Sat Jan 12 18:04:13 2008 +0100
+++ b/src/print.c	Tue Jan 15 21:35:01 2008 +0100
@@ -867,6 +867,26 @@
   return object;
 }
 
+Lisp_Object
+prin1_to_string (Lisp_Object object, int noescape)
+{
+  /* This function can GC */
+  Lisp_Object result = Qnil;
+  Lisp_Object stream = make_resizing_buffer_output_stream ();
+  Lstream *str = XLSTREAM (stream);
+  /* gcpro OBJECT in case a caller forgot to do so */
+  struct gcpro gcpro1, gcpro2, gcpro3;
+  GCPRO3 (object, stream, result);
+
+  print_internal (object, stream, !noescape);
+  Lstream_flush (str);
+  UNGCPRO;
+  result = make_string (resizing_buffer_stream_ptr (str),
+			Lstream_byte_count (str));
+  Lstream_delete (str);
+  return result;
+}
+
 DEFUN ("prin1-to-string", Fprin1_to_string, 1, 2, 0, /*
 Return a string containing the printed representation of OBJECT,
 any Lisp object.  Quoting characters are used when needed to make output
@@ -877,20 +897,11 @@
 {
   /* This function can GC */
   Lisp_Object result = Qnil;
-  Lisp_Object stream = make_resizing_buffer_output_stream ();
-  Lstream *str = XLSTREAM (stream);
-  /* gcpro OBJECT in case a caller forgot to do so */
-  struct gcpro gcpro1, gcpro2, gcpro3;
-  GCPRO3 (object, stream, result);
 
   RESET_PRINT_GENSYM;
-  print_internal (object, stream, NILP (noescape));
+  result = prin1_to_string (object, !(EQ(noescape, Qnil)));
   RESET_PRINT_GENSYM;
-  Lstream_flush (str);
-  UNGCPRO;
-  result = make_string (resizing_buffer_stream_ptr (str),
-			Lstream_byte_count (str));
-  Lstream_delete (str);
+
   return result;
 }
 
--- a/tests/ChangeLog	Sat Jan 12 18:04:13 2008 +0100
+++ b/tests/ChangeLog	Tue Jan 15 21:35:01 2008 +0100
@@ -1,3 +1,9 @@
+2008-01-15  Aidan Kehoe  <kehoea@parhasard.net>
+
+	* automated/lisp-tests.el (thing): 
+	Check that printing a hash table literal doesn't clear
+	print-gensym-alist. 
+
 2008-01-03  Stephen J. Turnbull  <stephen@xemacs.org>
 
 	* automated/symbol-tests.el (Symbol documentation): Add tests to
--- a/tests/automated/lisp-tests.el	Sat Jan 12 18:04:13 2008 +0100
+++ b/tests/automated/lisp-tests.el	Tue Jan 15 21:35:01 2008 +0100
@@ -1299,3 +1299,17 @@
 ;; Check all-completions ignore element start with space.
 (Assert (not (all-completions "" '((" hidden" . "object")))))
 (Assert (all-completions " " '((" hidden" . "object"))))
+
+(let* ((literal-with-uninterned
+	'(first-element
+	  [#1=#:G32976 #2=#:G32974 #3=#:G32971 #4=#:G32969 alias
+		       #s(hash-table size 256 data (969 ?ù 55 ?7 166 ?¦ ))
+		       #5=#:G32970 #6=#:G32972]))
+       (print-readably t)
+       (print-gensym t)
+       (printed-with-uninterned (prin1-to-string literal-with-uninterned))
+       (awkward-regexp "#1=#")
+       (first-match-start (string-match awkward-regexp
+					printed-with-uninterned)))
+  (Assert (null (string-match awkward-regexp printed-with-uninterned
+			      (1+ first-match-start)))))