emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 0dba340 5/5: Don't build print-number-table unless


From: Gemini Lasswell
Subject: [Emacs-diffs] master 0dba340 5/5: Don't build print-number-table unless it will be used
Date: Fri, 13 Sep 2019 17:05:21 -0400 (EDT)

branch: master
commit 0dba340da54f129750096a5a8704805a94f5535c
Author: Gemini Lasswell <address@hidden>
Commit: Gemini Lasswell <address@hidden>

    Don't build print-number-table unless it will be used
    
    There are only a few users of print-number-table, and none of them use
    it when print-circle is nil.  A couple of them used to.  print_object
    was changed in 2012-04-20 "* src/print.c (print_preprocess): Only
    check print_depth if print-circle is nil".
    byte-compile-output-docform which uses print-number-table binds
    print-circle to t before printing unless
    byte-compile-disable-print-circle is set, but that variable has been
    marked obsolete since 24.1.
    
    * src/print.c (print_preprocess): Assert Vprint_circle is non-nil.
    Remove code handling the case when Vprint_circle is nil.
    (print, Fprint_preprocess): Don't call print_preprocess unless
    Vprint_circle is non-nil.
    (print_object): Remove comment referencing removed code in
    print_preprocess.
---
 src/print.c | 92 ++++++++++++++++++++++++++-----------------------------------
 1 file changed, 39 insertions(+), 53 deletions(-)

diff --git a/src/print.c b/src/print.c
index 18330b0..c870aa5 100644
--- a/src/print.c
+++ b/src/print.c
@@ -1120,8 +1120,8 @@ print (Lisp_Object obj, Lisp_Object printcharfun, bool 
escapeflag)
       Vprint_number_table = Qnil;
     }
 
-  /* Construct Vprint_number_table for print-gensym and print-circle.  */
-  if (!NILP (Vprint_gensym) || !NILP (Vprint_circle))
+  /* Construct Vprint_number_table for print-circle.  */
+  if (!NILP (Vprint_circle))
     {
       /* Construct Vprint_number_table.
         This increments print_number_index for the objects added.  */
@@ -1163,13 +1163,14 @@ print (Lisp_Object obj, Lisp_Object printcharfun, bool 
escapeflag)
        && SYMBOLP (obj)                                           \
        && !SYMBOL_INTERNED_P (obj)))
 
-/* Construct Vprint_number_table according to the structure of OBJ.
-   OBJ itself and all its elements will be added to Vprint_number_table
-   recursively if it is a list, vector, compiled function, char-table,
-   string (its text properties will be traced), or a symbol that has
-   no obarray (this is for the print-gensym feature).
-   The status fields of Vprint_number_table mean whether each object appears
-   more than once in OBJ: Qnil at the first time, and Qt after that.  */
+/* Construct Vprint_number_table for the print-circle feature
+   according to the structure of OBJ.  OBJ itself and all its elements
+   will be added to Vprint_number_table recursively if it is a list,
+   vector, compiled function, char-table, string (its text properties
+   will be traced), or a symbol that has no obarray (this is for the
+   print-gensym feature).  The status fields of Vprint_number_table
+   mean whether each object appears more than once in OBJ: Qnil at the
+   first time, and Qt after that.  */
 static void
 print_preprocess (Lisp_Object obj)
 {
@@ -1178,20 +1179,7 @@ print_preprocess (Lisp_Object obj)
   int loop_count = 0;
   Lisp_Object halftail;
 
-  /* Avoid infinite recursion for circular nested structure
-     in the case where Vprint_circle is nil.  */
-  if (NILP (Vprint_circle))
-    {
-      /* Give up if we go so deep that print_object will get an error.  */
-      /* See similar code in print_object.  */
-      if (print_depth >= PRINT_CIRCLE)
-       error ("Apparently circular structure being printed");
-
-      for (i = 0; i < print_depth; i++)
-       if (EQ (obj, being_printed[i]))
-         return;
-      being_printed[print_depth] = obj;
-    }
+  eassert (!NILP (Vprint_circle));
 
   print_depth++;
   halftail = obj;
@@ -1202,33 +1190,28 @@ print_preprocess (Lisp_Object obj)
       if (!HASH_TABLE_P (Vprint_number_table))
        Vprint_number_table = CALLN (Fmake_hash_table, QCtest, Qeq);
 
-      /* In case print-circle is nil and print-gensym is t,
-        add OBJ to Vprint_number_table only when OBJ is a symbol.  */
-      if (! NILP (Vprint_circle) || SYMBOLP (obj))
-       {
-         Lisp_Object num = Fgethash (obj, Vprint_number_table, Qnil);
-         if (!NILP (num)
-             /* If Vprint_continuous_numbering is non-nil and OBJ is a gensym,
-                always print the gensym with a number.  This is a special for
-                the lisp function byte-compile-output-docform.  */
-             || (!NILP (Vprint_continuous_numbering)
-                 && SYMBOLP (obj)
-                 && !SYMBOL_INTERNED_P (obj)))
-           { /* OBJ appears more than once.    Let's remember that.  */
-             if (!FIXNUMP (num))
-               {
-                 print_number_index++;
-                 /* Negative number indicates it hasn't been printed yet.  */
-                 Fputhash (obj, make_fixnum (- print_number_index),
-                           Vprint_number_table);
-               }
-             print_depth--;
-             return;
+      Lisp_Object num = Fgethash (obj, Vprint_number_table, Qnil);
+      if (!NILP (num)
+         /* If Vprint_continuous_numbering is non-nil and OBJ is a gensym,
+            always print the gensym with a number.  This is a special for
+            the lisp function byte-compile-output-docform.  */
+         || (!NILP (Vprint_continuous_numbering)
+             && SYMBOLP (obj)
+             && !SYMBOL_INTERNED_P (obj)))
+       { /* OBJ appears more than once.  Let's remember that.  */
+         if (!FIXNUMP (num))
+           {
+             print_number_index++;
+             /* Negative number indicates it hasn't been printed yet.  */
+             Fputhash (obj, make_fixnum (- print_number_index),
+                       Vprint_number_table);
            }
-         else
-           /* OBJ is not yet recorded.  Let's add to the table.  */
-           Fputhash (obj, Qt, Vprint_number_table);
+         print_depth--;
+         return;
        }
+      else
+       /* OBJ is not yet recorded.  Let's add to the table.  */
+       Fputhash (obj, Qt, Vprint_number_table);
 
       switch (XTYPE (obj))
        {
@@ -1275,11 +1258,15 @@ print_preprocess (Lisp_Object obj)
 
 DEFUN ("print--preprocess", Fprint_preprocess, Sprint_preprocess, 1, 1, 0,
        doc: /* Extract sharing info from OBJECT needed to print it.
-Fills `print-number-table'.  */)
-  (Lisp_Object object)
+Fills `print-number-table' if `print-circle' is non-nil.  Does nothing
+if `print-circle' is nil.  */)
+     (Lisp_Object object)
 {
-  print_number_index = 0;
-  print_preprocess (object);
+  if (!NILP (Vprint_circle))
+    {
+      print_number_index = 0;
+      print_preprocess (object);
+    }
   return Qnil;
 }
 
@@ -1864,7 +1851,6 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, 
bool escapeflag)
       /* Simple but incomplete way.  */
       int i;
 
-      /* See similar code in print_preprocess.  */
       if (print_depth >= PRINT_CIRCLE)
        error ("Apparently circular structure being printed");
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]