]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix unnecessary hash table creation in cl-prin1 (bug#36566)
authorGemini Lasswell <gazally@runbox.com>
Sat, 3 Aug 2019 19:33:20 +0000 (12:33 -0700)
committerGemini Lasswell <gazally@runbox.com>
Fri, 13 Sep 2019 20:43:07 +0000 (13:43 -0700)
cl-prin1 prints all its punctuation by passing strings to prin1.  When
print-circle was set, print_preprocess was creating a new hash table
for each string, causing excessive garbage collection when printing
large Lisp objects with cl-prin1.

* src/print.c (print_number_index): Fix typo in comment above.
(PRINT_CIRCLE_CANDIDATE_P): Don't create print_number_table
for top-level strings with no properties, except when
print_continuous_numbering is on.

src/print.c

index 7c3da68fc9894cb9af87c366ef351924f11f2548..18330b0fbf4f0685431ea06ddcca64c2e3cbd199 100644 (file)
@@ -81,7 +81,7 @@ static ptrdiff_t print_buffer_pos_byte;
      -N   the object will be printed several times and will take number N.
      N    the object has been printed so we can refer to it as #N#.
    print_number_index holds the largest N already used.
-   N has to be striclty larger than 0 since we need to distinguish -N.  */
+   N has to be strictly larger than 0 since we need to distinguish -N.  */
 static ptrdiff_t print_number_index;
 static void print_interval (INTERVAL interval, Lisp_Object printcharfun);
 
@@ -1149,7 +1149,11 @@ print (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag)
 }
 
 #define PRINT_CIRCLE_CANDIDATE_P(obj)                     \
-  (STRINGP (obj) || CONSP (obj)                                   \
+  ((STRINGP (obj)                                          \
+       && (string_intervals (obj)                          \
+         || print_depth > 1                               \
+         || Vprint_continuous_numbering))                 \
+   || CONSP (obj)                                         \
    || (VECTORLIKEP (obj)                                  \
        && (VECTORP (obj) || COMPILEDP (obj)               \
           || CHAR_TABLE_P (obj) || SUB_CHAR_TABLE_P (obj) \