Mercurial > emacs
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); |