# HG changeset patch # User Richard M. Stallman # Date 1084208138 0 # Node ID 2b06def87ce0fb5768ea33b797ab65be6786cee8 # Parent 85aa052b7bf239298b4be3550808bd29dee032f1 (print_preprocess): Use being_printed, loop_count and halftail to detect overdeep nesting and cyclic cdr chains. diff -r 85aa052b7bf2 -r 2b06def87ce0 src/print.c --- 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