summaryrefslogtreecommitdiff
path: root/src/print.c
diff options
context:
space:
mode:
authorGemini Lasswell <gazally@runbox.com>2019-08-03 21:39:29 -0700
committerGemini Lasswell <gazally@runbox.com>2019-09-13 13:43:07 -0700
commit0dba340da54f129750096a5a8704805a94f5535c (patch)
tree95751e2ab566b4c861241e3edacfcfbccd6e3ea8 /src/print.c
parent3bd6ef40b55e429a321c87a09fd94e6ca0e50ae7 (diff)
downloademacs-0dba340da54f129750096a5a8704805a94f5535c.tar.gz
emacs-0dba340da54f129750096a5a8704805a94f5535c.tar.bz2
emacs-0dba340da54f129750096a5a8704805a94f5535c.zip
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.
Diffstat (limited to 'src/print.c')
-rw-r--r--src/print.c92
1 files changed, 39 insertions, 53 deletions
diff --git a/src/print.c b/src/print.c
index 18330b0fbf4..c870aa5a088 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");