(print_preprocess): Use being_printed, loop_count and
halftail to detect overdeep nesting and cyclic cdr chains.
This commit is contained in:
parent
6740652e6d
commit
c113267187
1 changed files with 29 additions and 0 deletions
29
src/print.c
29
src/print.c
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue