]> git.eshelyaron.com Git - emacs.git/commitdiff
(print_preprocess): Use being_printed, loop_count and
authorRichard M. Stallman <rms@gnu.org>
Mon, 10 May 2004 16:55:38 +0000 (16:55 +0000)
committerRichard M. Stallman <rms@gnu.org>
Mon, 10 May 2004 16:55:38 +0000 (16:55 +0000)
halftail to detect overdeep nesting and cyclic cdr chains.

src/print.c

index e729b468fd137865b60be0938d20a0af4bcddbfe..27da81ae8eb352c608c719784142b90e4dee46c4 100644 (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