Mercurial > emacs
changeset 55498:2b06def87ce0
(print_preprocess): Use being_printed, loop_count and
halftail to detect overdeep nesting and cyclic cdr chains.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Mon, 10 May 2004 16:55:38 +0000 |
parents | 85aa052b7bf2 |
children | 0658d9d79cd7 |
files | src/print.c |
diffstat | 1 files changed, 29 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/print.c Mon May 10 16:24:26 2004 +0000 +++ b/src/print.c Mon May 10 16:55:38 2004 +0000 @@ -1280,6 +1280,26 @@ { 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 @@ 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 @@ break; } } + print_depth--; } static void @@ -1426,6 +1454,7 @@ print_depth++; + /* See similar code in print_preprocess. */ if (print_depth > PRINT_CIRCLE) error ("Apparently circular structure being printed"); #ifdef MAX_PRINT_CHARS