(print_preprocess): Use being_printed, loop_count and

halftail to detect overdeep nesting and cyclic cdr chains.
This commit is contained in:
Richard M. Stallman 2004-05-10 16:55:38 +00:00
parent 6740652e6d
commit c113267187

View file

@ -1280,6 +1280,26 @@ print_preprocess (obj)
{
int i;
EMACS_INT size;
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))
{
for (i = 0; i < print_depth; i++)
if (EQ (obj, being_printed[i]))
return;
being_printed[print_depth] = obj;
}
/* 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)
return;
print_depth++;
halftail = obj;
loop:
if (STRINGP (obj) || CONSP (obj) || VECTORP (obj)
@ -1340,8 +1360,15 @@ print_preprocess (obj)
break;
case Lisp_Cons:
/* Use HALFTAIL and LOOP_COUNT to detect circular lists,
just as in print_object. */
if (loop_count && EQ (obj, halftail))
break;
print_preprocess (XCAR (obj));
obj = XCDR (obj);
loop_count++;
if (!(loop_count & 1))
halftail = XCDR (halftail);
goto loop;
case Lisp_Vectorlike:
@ -1356,6 +1383,7 @@ print_preprocess (obj)
break;
}
}
print_depth--;
}
static void
@ -1426,6 +1454,7 @@ print_object (obj, printcharfun, escapeflag)
print_depth++;
/* See similar code in print_preprocess. */
if (print_depth > PRINT_CIRCLE)
error ("Apparently circular structure being printed");
#ifdef MAX_PRINT_CHARS