comparison src/alloc.c @ 46833:b80760a75295

(mark_object): Detect long lists for debugging. (mark_object_loop_halt): New variable.
author Richard M. Stallman <rms@gnu.org>
date Wed, 07 Aug 2002 14:37:32 +0000
parents 0a9cbcbdbe45
children 2ff45b08a155
comparison
equal deleted inserted replaced
46832:3e86025ff134 46833:b80760a75295
4425 4425
4426 #define LAST_MARKED_SIZE 500 4426 #define LAST_MARKED_SIZE 500
4427 Lisp_Object *last_marked[LAST_MARKED_SIZE]; 4427 Lisp_Object *last_marked[LAST_MARKED_SIZE];
4428 int last_marked_index; 4428 int last_marked_index;
4429 4429
4430 /* For debugging--call abort when we cdr down this many
4431 links of a list, in mark_object. In debugging,
4432 the call to abort will hit a breakpoint.
4433 Normally this is zero and the check never goes off. */
4434 int mark_object_loop_halt;
4435
4430 void 4436 void
4431 mark_object (argptr) 4437 mark_object (argptr)
4432 Lisp_Object *argptr; 4438 Lisp_Object *argptr;
4433 { 4439 {
4434 Lisp_Object *objptr = argptr; 4440 Lisp_Object *objptr = argptr;
4435 register Lisp_Object obj; 4441 register Lisp_Object obj;
4436 #ifdef GC_CHECK_MARKED_OBJECTS 4442 #ifdef GC_CHECK_MARKED_OBJECTS
4437 void *po; 4443 void *po;
4438 struct mem_node *m; 4444 struct mem_node *m;
4439 #endif 4445 #endif
4446 int cdr_count = 0;
4440 4447
4441 loop: 4448 loop:
4442 obj = *objptr; 4449 obj = *objptr;
4443 loop2: 4450 loop2:
4444 XUNMARK (obj); 4451 XUNMARK (obj);
4788 XMARK (ptr->car); 4795 XMARK (ptr->car);
4789 /* If the cdr is nil, avoid recursion for the car. */ 4796 /* If the cdr is nil, avoid recursion for the car. */
4790 if (EQ (ptr->cdr, Qnil)) 4797 if (EQ (ptr->cdr, Qnil))
4791 { 4798 {
4792 objptr = &ptr->car; 4799 objptr = &ptr->car;
4800 cdr_count = 0;
4793 goto loop; 4801 goto loop;
4794 } 4802 }
4795 mark_object (&ptr->car); 4803 mark_object (&ptr->car);
4796 objptr = &ptr->cdr; 4804 objptr = &ptr->cdr;
4805 cdr_count++;
4806 if (cdr_count == mark_object_loop_halt)
4807 abort ();
4797 goto loop; 4808 goto loop;
4798 } 4809 }
4799 4810
4800 case Lisp_Float: 4811 case Lisp_Float:
4801 CHECK_ALLOCATED_AND_LIVE (live_float_p); 4812 CHECK_ALLOCATED_AND_LIVE (live_float_p);