From: Richard M. Stallman Date: Mon, 10 May 2004 16:55:38 +0000 (+0000) Subject: (print_preprocess): Use being_printed, loop_count and X-Git-Tag: ttn-vms-21-2-B4~6302 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=c11326718786ba5aa701fd9ba97c57876deab90e;p=emacs.git (print_preprocess): Use being_printed, loop_count and halftail to detect overdeep nesting and cyclic cdr chains. --- diff --git a/src/print.c b/src/print.c index e729b468fd1..27da81ae8eb 100644 --- a/src/print.c +++ b/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