diff options
| author | Stefan Monnier | 2003-07-06 19:35:58 +0000 |
|---|---|---|
| committer | Stefan Monnier | 2003-07-06 19:35:58 +0000 |
| commit | 49723c0471a49ae0d66ab3e0aa0b771bbd85bd7e (patch) | |
| tree | 813accbd4eb62e39b76caf348ae70d56afbaa989 /src/alloc.c | |
| parent | fcfee3c42ea97f6351cf3a9d33c41e30beb60225 (diff) | |
| download | emacs-49723c0471a49ae0d66ab3e0aa0b771bbd85bd7e.tar.gz emacs-49723c0471a49ae0d66ab3e0aa0b771bbd85bd7e.zip | |
(mark_object): Change arg to only take Lisp_Object rather than *Lisp_Object.
(last_marked): Change accordingly.
(mark_interval, mark_maybe_object, mark_maybe_pointer)
(Fgarbage_collect, mark_glyph_matrix, mark_face_cache, mark_image)
(mark_buffer): Update calls to mark_object.
Diffstat (limited to 'src/alloc.c')
| -rw-r--r-- | src/alloc.c | 159 |
1 files changed, 75 insertions, 84 deletions
diff --git a/src/alloc.c b/src/alloc.c index 2232b7b82d2..92fd44dcdac 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -1164,7 +1164,7 @@ mark_interval (i, dummy) | |||
| 1164 | { | 1164 | { |
| 1165 | eassert (!i->gcmarkbit); /* Intervals are never shared. */ | 1165 | eassert (!i->gcmarkbit); /* Intervals are never shared. */ |
| 1166 | i->gcmarkbit = 1; | 1166 | i->gcmarkbit = 1; |
| 1167 | mark_object (&i->plist); | 1167 | mark_object (i->plist); |
| 1168 | } | 1168 | } |
| 1169 | 1169 | ||
| 1170 | 1170 | ||
| @@ -3646,7 +3646,7 @@ mark_maybe_object (obj) | |||
| 3646 | zombies[nzombies] = obj; | 3646 | zombies[nzombies] = obj; |
| 3647 | ++nzombies; | 3647 | ++nzombies; |
| 3648 | #endif | 3648 | #endif |
| 3649 | mark_object (&obj); | 3649 | mark_object (obj); |
| 3650 | } | 3650 | } |
| 3651 | } | 3651 | } |
| 3652 | } | 3652 | } |
| @@ -3728,7 +3728,7 @@ mark_maybe_pointer (p) | |||
| 3728 | } | 3728 | } |
| 3729 | 3729 | ||
| 3730 | if (!GC_NILP (obj)) | 3730 | if (!GC_NILP (obj)) |
| 3731 | mark_object (&obj); | 3731 | mark_object (obj); |
| 3732 | } | 3732 | } |
| 3733 | } | 3733 | } |
| 3734 | 3734 | ||
| @@ -4370,7 +4370,7 @@ Garbage collection happens automatically if you cons more than | |||
| 4370 | For these, we use MARKBIT to avoid double marking of the slot. */ | 4370 | For these, we use MARKBIT to avoid double marking of the slot. */ |
| 4371 | 4371 | ||
| 4372 | for (i = 0; i < staticidx; i++) | 4372 | for (i = 0; i < staticidx; i++) |
| 4373 | mark_object (staticvec[i]); | 4373 | mark_object (*staticvec[i]); |
| 4374 | 4374 | ||
| 4375 | #if (GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS \ | 4375 | #if (GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS \ |
| 4376 | || GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS) | 4376 | || GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS) |
| @@ -4384,7 +4384,7 @@ Garbage collection happens automatically if you cons more than | |||
| 4384 | { | 4384 | { |
| 4385 | /* Explicit casting prevents compiler warning about | 4385 | /* Explicit casting prevents compiler warning about |
| 4386 | discarding the `volatile' qualifier. */ | 4386 | discarding the `volatile' qualifier. */ |
| 4387 | mark_object ((Lisp_Object *)&tail->var[i]); | 4387 | mark_object (tail->var[i]); |
| 4388 | XMARK (tail->var[i]); | 4388 | XMARK (tail->var[i]); |
| 4389 | } | 4389 | } |
| 4390 | } | 4390 | } |
| @@ -4394,24 +4394,24 @@ Garbage collection happens automatically if you cons more than | |||
| 4394 | for (bind = specpdl; bind != specpdl_ptr; bind++) | 4394 | for (bind = specpdl; bind != specpdl_ptr; bind++) |
| 4395 | { | 4395 | { |
| 4396 | /* These casts avoid a warning for discarding `volatile'. */ | 4396 | /* These casts avoid a warning for discarding `volatile'. */ |
| 4397 | mark_object ((Lisp_Object *) &bind->symbol); | 4397 | mark_object (bind->symbol); |
| 4398 | mark_object ((Lisp_Object *) &bind->old_value); | 4398 | mark_object (bind->old_value); |
| 4399 | } | 4399 | } |
| 4400 | for (catch = catchlist; catch; catch = catch->next) | 4400 | for (catch = catchlist; catch; catch = catch->next) |
| 4401 | { | 4401 | { |
| 4402 | mark_object (&catch->tag); | 4402 | mark_object (catch->tag); |
| 4403 | mark_object (&catch->val); | 4403 | mark_object (catch->val); |
| 4404 | } | 4404 | } |
| 4405 | for (handler = handlerlist; handler; handler = handler->next) | 4405 | for (handler = handlerlist; handler; handler = handler->next) |
| 4406 | { | 4406 | { |
| 4407 | mark_object (&handler->handler); | 4407 | mark_object (handler->handler); |
| 4408 | mark_object (&handler->var); | 4408 | mark_object (handler->var); |
| 4409 | } | 4409 | } |
| 4410 | for (backlist = backtrace_list; backlist; backlist = backlist->next) | 4410 | for (backlist = backtrace_list; backlist; backlist = backlist->next) |
| 4411 | { | 4411 | { |
| 4412 | if (!XMARKBIT (*backlist->function)) | 4412 | if (!XMARKBIT (*backlist->function)) |
| 4413 | { | 4413 | { |
| 4414 | mark_object (backlist->function); | 4414 | mark_object (*backlist->function); |
| 4415 | XMARK (*backlist->function); | 4415 | XMARK (*backlist->function); |
| 4416 | } | 4416 | } |
| 4417 | if (backlist->nargs == UNEVALLED || backlist->nargs == MANY) | 4417 | if (backlist->nargs == UNEVALLED || backlist->nargs == MANY) |
| @@ -4421,7 +4421,7 @@ Garbage collection happens automatically if you cons more than | |||
| 4421 | for (; i >= 0; i--) | 4421 | for (; i >= 0; i--) |
| 4422 | if (!XMARKBIT (backlist->args[i])) | 4422 | if (!XMARKBIT (backlist->args[i])) |
| 4423 | { | 4423 | { |
| 4424 | mark_object (&backlist->args[i]); | 4424 | mark_object (backlist->args[i]); |
| 4425 | XMARK (backlist->args[i]); | 4425 | XMARK (backlist->args[i]); |
| 4426 | } | 4426 | } |
| 4427 | } | 4427 | } |
| @@ -4607,7 +4607,7 @@ mark_glyph_matrix (matrix) | |||
| 4607 | for (; glyph < end_glyph; ++glyph) | 4607 | for (; glyph < end_glyph; ++glyph) |
| 4608 | if (GC_STRINGP (glyph->object) | 4608 | if (GC_STRINGP (glyph->object) |
| 4609 | && !STRING_MARKED_P (XSTRING (glyph->object))) | 4609 | && !STRING_MARKED_P (XSTRING (glyph->object))) |
| 4610 | mark_object (&glyph->object); | 4610 | mark_object (glyph->object); |
| 4611 | } | 4611 | } |
| 4612 | } | 4612 | } |
| 4613 | } | 4613 | } |
| @@ -4629,7 +4629,7 @@ mark_face_cache (c) | |||
| 4629 | if (face) | 4629 | if (face) |
| 4630 | { | 4630 | { |
| 4631 | for (j = 0; j < LFACE_VECTOR_SIZE; ++j) | 4631 | for (j = 0; j < LFACE_VECTOR_SIZE; ++j) |
| 4632 | mark_object (&face->lface[j]); | 4632 | mark_object (face->lface[j]); |
| 4633 | } | 4633 | } |
| 4634 | } | 4634 | } |
| 4635 | } | 4635 | } |
| @@ -4644,10 +4644,10 @@ static void | |||
| 4644 | mark_image (img) | 4644 | mark_image (img) |
| 4645 | struct image *img; | 4645 | struct image *img; |
| 4646 | { | 4646 | { |
| 4647 | mark_object (&img->spec); | 4647 | mark_object (img->spec); |
| 4648 | 4648 | ||
| 4649 | if (!NILP (img->data.lisp_val)) | 4649 | if (!NILP (img->data.lisp_val)) |
| 4650 | mark_object (&img->data.lisp_val); | 4650 | mark_object (img->data.lisp_val); |
| 4651 | } | 4651 | } |
| 4652 | 4652 | ||
| 4653 | 4653 | ||
| @@ -4670,7 +4670,7 @@ mark_image_cache (f) | |||
| 4670 | all the references contained in it. */ | 4670 | all the references contained in it. */ |
| 4671 | 4671 | ||
| 4672 | #define LAST_MARKED_SIZE 500 | 4672 | #define LAST_MARKED_SIZE 500 |
| 4673 | Lisp_Object *last_marked[LAST_MARKED_SIZE]; | 4673 | Lisp_Object last_marked[LAST_MARKED_SIZE]; |
| 4674 | int last_marked_index; | 4674 | int last_marked_index; |
| 4675 | 4675 | ||
| 4676 | /* For debugging--call abort when we cdr down this many | 4676 | /* For debugging--call abort when we cdr down this many |
| @@ -4680,11 +4680,10 @@ int last_marked_index; | |||
| 4680 | int mark_object_loop_halt; | 4680 | int mark_object_loop_halt; |
| 4681 | 4681 | ||
| 4682 | void | 4682 | void |
| 4683 | mark_object (argptr) | 4683 | mark_object (arg) |
| 4684 | Lisp_Object *argptr; | 4684 | Lisp_Object arg; |
| 4685 | { | 4685 | { |
| 4686 | Lisp_Object *objptr = argptr; | 4686 | register Lisp_Object obj = arg; |
| 4687 | register Lisp_Object obj; | ||
| 4688 | #ifdef GC_CHECK_MARKED_OBJECTS | 4687 | #ifdef GC_CHECK_MARKED_OBJECTS |
| 4689 | void *po; | 4688 | void *po; |
| 4690 | struct mem_node *m; | 4689 | struct mem_node *m; |
| @@ -4692,14 +4691,12 @@ mark_object (argptr) | |||
| 4692 | int cdr_count = 0; | 4691 | int cdr_count = 0; |
| 4693 | 4692 | ||
| 4694 | loop: | 4693 | loop: |
| 4695 | obj = *objptr; | ||
| 4696 | loop2: | ||
| 4697 | XUNMARK (obj); | 4694 | XUNMARK (obj); |
| 4698 | 4695 | ||
| 4699 | if (PURE_POINTER_P (XPNTR (obj))) | 4696 | if (PURE_POINTER_P (XPNTR (obj))) |
| 4700 | return; | 4697 | return; |
| 4701 | 4698 | ||
| 4702 | last_marked[last_marked_index++] = objptr; | 4699 | last_marked[last_marked_index++] = obj; |
| 4703 | if (last_marked_index == LAST_MARKED_SIZE) | 4700 | if (last_marked_index == LAST_MARKED_SIZE) |
| 4704 | last_marked_index = 0; | 4701 | last_marked_index = 0; |
| 4705 | 4702 | ||
| @@ -4804,11 +4801,9 @@ mark_object (argptr) | |||
| 4804 | for (i = 0; i < size; i++) /* and then mark its elements */ | 4801 | for (i = 0; i < size; i++) /* and then mark its elements */ |
| 4805 | { | 4802 | { |
| 4806 | if (i != COMPILED_CONSTANTS) | 4803 | if (i != COMPILED_CONSTANTS) |
| 4807 | mark_object (&ptr->contents[i]); | 4804 | mark_object (ptr->contents[i]); |
| 4808 | } | 4805 | } |
| 4809 | /* This cast should be unnecessary, but some Mips compiler complains | 4806 | obj = ptr->contents[COMPILED_CONSTANTS]; |
| 4810 | (MIPS-ABI + SysVR4, DC/OSx, etc). */ | ||
| 4811 | objptr = (Lisp_Object *) &ptr->contents[COMPILED_CONSTANTS]; | ||
| 4812 | goto loop; | 4807 | goto loop; |
| 4813 | } | 4808 | } |
| 4814 | else if (GC_FRAMEP (obj)) | 4809 | else if (GC_FRAMEP (obj)) |
| @@ -4819,28 +4814,28 @@ mark_object (argptr) | |||
| 4819 | VECTOR_MARK (ptr); /* Else mark it */ | 4814 | VECTOR_MARK (ptr); /* Else mark it */ |
| 4820 | 4815 | ||
| 4821 | CHECK_LIVE (live_vector_p); | 4816 | CHECK_LIVE (live_vector_p); |
| 4822 | mark_object (&ptr->name); | 4817 | mark_object (ptr->name); |
| 4823 | mark_object (&ptr->icon_name); | 4818 | mark_object (ptr->icon_name); |
| 4824 | mark_object (&ptr->title); | 4819 | mark_object (ptr->title); |
| 4825 | mark_object (&ptr->focus_frame); | 4820 | mark_object (ptr->focus_frame); |
| 4826 | mark_object (&ptr->selected_window); | 4821 | mark_object (ptr->selected_window); |
| 4827 | mark_object (&ptr->minibuffer_window); | 4822 | mark_object (ptr->minibuffer_window); |
| 4828 | mark_object (&ptr->param_alist); | 4823 | mark_object (ptr->param_alist); |
| 4829 | mark_object (&ptr->scroll_bars); | 4824 | mark_object (ptr->scroll_bars); |
| 4830 | mark_object (&ptr->condemned_scroll_bars); | 4825 | mark_object (ptr->condemned_scroll_bars); |
| 4831 | mark_object (&ptr->menu_bar_items); | 4826 | mark_object (ptr->menu_bar_items); |
| 4832 | mark_object (&ptr->face_alist); | 4827 | mark_object (ptr->face_alist); |
| 4833 | mark_object (&ptr->menu_bar_vector); | 4828 | mark_object (ptr->menu_bar_vector); |
| 4834 | mark_object (&ptr->buffer_predicate); | 4829 | mark_object (ptr->buffer_predicate); |
| 4835 | mark_object (&ptr->buffer_list); | 4830 | mark_object (ptr->buffer_list); |
| 4836 | mark_object (&ptr->menu_bar_window); | 4831 | mark_object (ptr->menu_bar_window); |
| 4837 | mark_object (&ptr->tool_bar_window); | 4832 | mark_object (ptr->tool_bar_window); |
| 4838 | mark_face_cache (ptr->face_cache); | 4833 | mark_face_cache (ptr->face_cache); |
| 4839 | #ifdef HAVE_WINDOW_SYSTEM | 4834 | #ifdef HAVE_WINDOW_SYSTEM |
| 4840 | mark_image_cache (ptr); | 4835 | mark_image_cache (ptr); |
| 4841 | mark_object (&ptr->tool_bar_items); | 4836 | mark_object (ptr->tool_bar_items); |
| 4842 | mark_object (&ptr->desired_tool_bar_string); | 4837 | mark_object (ptr->desired_tool_bar_string); |
| 4843 | mark_object (&ptr->current_tool_bar_string); | 4838 | mark_object (ptr->current_tool_bar_string); |
| 4844 | #endif /* HAVE_WINDOW_SYSTEM */ | 4839 | #endif /* HAVE_WINDOW_SYSTEM */ |
| 4845 | } | 4840 | } |
| 4846 | else if (GC_BOOL_VECTOR_P (obj)) | 4841 | else if (GC_BOOL_VECTOR_P (obj)) |
| @@ -4871,7 +4866,7 @@ mark_object (argptr) | |||
| 4871 | for (i = 0; | 4866 | for (i = 0; |
| 4872 | (char *) &ptr->contents[i] < (char *) &w->current_matrix; | 4867 | (char *) &ptr->contents[i] < (char *) &w->current_matrix; |
| 4873 | i++) | 4868 | i++) |
| 4874 | mark_object (&ptr->contents[i]); | 4869 | mark_object (ptr->contents[i]); |
| 4875 | 4870 | ||
| 4876 | /* Mark glyphs for leaf windows. Marking window matrices is | 4871 | /* Mark glyphs for leaf windows. Marking window matrices is |
| 4877 | sufficient because frame matrices use the same glyph | 4872 | sufficient because frame matrices use the same glyph |
| @@ -4901,20 +4896,20 @@ mark_object (argptr) | |||
| 4901 | Being in the next_weak chain | 4896 | Being in the next_weak chain |
| 4902 | should not keep the hash table alive. | 4897 | should not keep the hash table alive. |
| 4903 | No need to mark `count' since it is an integer. */ | 4898 | No need to mark `count' since it is an integer. */ |
| 4904 | mark_object (&h->test); | 4899 | mark_object (h->test); |
| 4905 | mark_object (&h->weak); | 4900 | mark_object (h->weak); |
| 4906 | mark_object (&h->rehash_size); | 4901 | mark_object (h->rehash_size); |
| 4907 | mark_object (&h->rehash_threshold); | 4902 | mark_object (h->rehash_threshold); |
| 4908 | mark_object (&h->hash); | 4903 | mark_object (h->hash); |
| 4909 | mark_object (&h->next); | 4904 | mark_object (h->next); |
| 4910 | mark_object (&h->index); | 4905 | mark_object (h->index); |
| 4911 | mark_object (&h->user_hash_function); | 4906 | mark_object (h->user_hash_function); |
| 4912 | mark_object (&h->user_cmp_function); | 4907 | mark_object (h->user_cmp_function); |
| 4913 | 4908 | ||
| 4914 | /* If hash table is not weak, mark all keys and values. | 4909 | /* If hash table is not weak, mark all keys and values. |
| 4915 | For weak tables, mark only the vector. */ | 4910 | For weak tables, mark only the vector. */ |
| 4916 | if (GC_NILP (h->weak)) | 4911 | if (GC_NILP (h->weak)) |
| 4917 | mark_object (&h->key_and_value); | 4912 | mark_object (h->key_and_value); |
| 4918 | else | 4913 | else |
| 4919 | VECTOR_MARK (XVECTOR (h->key_and_value)); | 4914 | VECTOR_MARK (XVECTOR (h->key_and_value)); |
| 4920 | } | 4915 | } |
| @@ -4931,7 +4926,7 @@ mark_object (argptr) | |||
| 4931 | size &= PSEUDOVECTOR_SIZE_MASK; | 4926 | size &= PSEUDOVECTOR_SIZE_MASK; |
| 4932 | 4927 | ||
| 4933 | for (i = 0; i < size; i++) /* and then mark its elements */ | 4928 | for (i = 0; i < size; i++) /* and then mark its elements */ |
| 4934 | mark_object (&ptr->contents[i]); | 4929 | mark_object (ptr->contents[i]); |
| 4935 | } | 4930 | } |
| 4936 | break; | 4931 | break; |
| 4937 | 4932 | ||
| @@ -4943,9 +4938,9 @@ mark_object (argptr) | |||
| 4943 | if (ptr->gcmarkbit) break; | 4938 | if (ptr->gcmarkbit) break; |
| 4944 | CHECK_ALLOCATED_AND_LIVE (live_symbol_p); | 4939 | CHECK_ALLOCATED_AND_LIVE (live_symbol_p); |
| 4945 | ptr->gcmarkbit = 1; | 4940 | ptr->gcmarkbit = 1; |
| 4946 | mark_object ((Lisp_Object *) &ptr->value); | 4941 | mark_object (ptr->value); |
| 4947 | mark_object (&ptr->function); | 4942 | mark_object (ptr->function); |
| 4948 | mark_object (&ptr->plist); | 4943 | mark_object (ptr->plist); |
| 4949 | 4944 | ||
| 4950 | if (!PURE_POINTER_P (XSTRING (ptr->xname))) | 4945 | if (!PURE_POINTER_P (XSTRING (ptr->xname))) |
| 4951 | MARK_STRING (XSTRING (ptr->xname)); | 4946 | MARK_STRING (XSTRING (ptr->xname)); |
| @@ -4957,13 +4952,9 @@ mark_object (argptr) | |||
| 4957 | ptr = ptr->next; | 4952 | ptr = ptr->next; |
| 4958 | if (ptr) | 4953 | if (ptr) |
| 4959 | { | 4954 | { |
| 4960 | /* For the benefit of the last_marked log. */ | ||
| 4961 | objptr = (Lisp_Object *)&XSYMBOL (obj)->next; | ||
| 4962 | ptrx = ptr; /* Use of ptrx avoids compiler bug on Sun */ | 4955 | ptrx = ptr; /* Use of ptrx avoids compiler bug on Sun */ |
| 4963 | XSETSYMBOL (obj, ptrx); | 4956 | XSETSYMBOL (obj, ptrx); |
| 4964 | /* We can't goto loop here because *objptr doesn't contain an | 4957 | goto loop; |
| 4965 | actual Lisp_Object with valid datatype field. */ | ||
| 4966 | goto loop2; | ||
| 4967 | } | 4958 | } |
| 4968 | } | 4959 | } |
| 4969 | break; | 4960 | break; |
| @@ -4983,13 +4974,13 @@ mark_object (argptr) | |||
| 4983 | /* If the cdr is nil, avoid recursion for the car. */ | 4974 | /* If the cdr is nil, avoid recursion for the car. */ |
| 4984 | if (EQ (ptr->cdr, Qnil)) | 4975 | if (EQ (ptr->cdr, Qnil)) |
| 4985 | { | 4976 | { |
| 4986 | objptr = &ptr->realvalue; | 4977 | obj = ptr->realvalue; |
| 4987 | goto loop; | 4978 | goto loop; |
| 4988 | } | 4979 | } |
| 4989 | mark_object (&ptr->realvalue); | 4980 | mark_object (ptr->realvalue); |
| 4990 | mark_object (&ptr->buffer); | 4981 | mark_object (ptr->buffer); |
| 4991 | mark_object (&ptr->frame); | 4982 | mark_object (ptr->frame); |
| 4992 | objptr = &ptr->cdr; | 4983 | obj = ptr->cdr; |
| 4993 | goto loop; | 4984 | goto loop; |
| 4994 | } | 4985 | } |
| 4995 | 4986 | ||
| @@ -5011,9 +5002,9 @@ mark_object (argptr) | |||
| 5011 | case Lisp_Misc_Overlay: | 5002 | case Lisp_Misc_Overlay: |
| 5012 | { | 5003 | { |
| 5013 | struct Lisp_Overlay *ptr = XOVERLAY (obj); | 5004 | struct Lisp_Overlay *ptr = XOVERLAY (obj); |
| 5014 | mark_object (&ptr->start); | 5005 | mark_object (ptr->start); |
| 5015 | mark_object (&ptr->end); | 5006 | mark_object (ptr->end); |
| 5016 | objptr = &ptr->plist; | 5007 | obj = ptr->plist; |
| 5017 | goto loop; | 5008 | goto loop; |
| 5018 | } | 5009 | } |
| 5019 | break; | 5010 | break; |
| @@ -5032,12 +5023,12 @@ mark_object (argptr) | |||
| 5032 | /* If the cdr is nil, avoid recursion for the car. */ | 5023 | /* If the cdr is nil, avoid recursion for the car. */ |
| 5033 | if (EQ (ptr->cdr, Qnil)) | 5024 | if (EQ (ptr->cdr, Qnil)) |
| 5034 | { | 5025 | { |
| 5035 | objptr = &ptr->car; | 5026 | obj = ptr->car; |
| 5036 | cdr_count = 0; | 5027 | cdr_count = 0; |
| 5037 | goto loop; | 5028 | goto loop; |
| 5038 | } | 5029 | } |
| 5039 | mark_object (&ptr->car); | 5030 | mark_object (ptr->car); |
| 5040 | objptr = &ptr->cdr; | 5031 | obj = ptr->cdr; |
| 5041 | cdr_count++; | 5032 | cdr_count++; |
| 5042 | if (cdr_count == mark_object_loop_halt) | 5033 | if (cdr_count == mark_object_loop_halt) |
| 5043 | abort (); | 5034 | abort (); |
| @@ -5095,10 +5086,10 @@ mark_buffer (buf) | |||
| 5095 | && GC_MARKERP (XCAR (ptr->car))) | 5086 | && GC_MARKERP (XCAR (ptr->car))) |
| 5096 | { | 5087 | { |
| 5097 | XMARK (XCAR_AS_LVALUE (ptr->car)); | 5088 | XMARK (XCAR_AS_LVALUE (ptr->car)); |
| 5098 | mark_object (&XCDR_AS_LVALUE (ptr->car)); | 5089 | mark_object (XCDR (ptr->car)); |
| 5099 | } | 5090 | } |
| 5100 | else | 5091 | else |
| 5101 | mark_object (&ptr->car); | 5092 | mark_object (ptr->car); |
| 5102 | 5093 | ||
| 5103 | if (CONSP (ptr->cdr)) | 5094 | if (CONSP (ptr->cdr)) |
| 5104 | tail = ptr->cdr; | 5095 | tail = ptr->cdr; |
| @@ -5106,15 +5097,15 @@ mark_buffer (buf) | |||
| 5106 | break; | 5097 | break; |
| 5107 | } | 5098 | } |
| 5108 | 5099 | ||
| 5109 | mark_object (&XCDR_AS_LVALUE (tail)); | 5100 | mark_object (XCDR (tail)); |
| 5110 | } | 5101 | } |
| 5111 | else | 5102 | else |
| 5112 | mark_object (&buffer->undo_list); | 5103 | mark_object (buffer->undo_list); |
| 5113 | 5104 | ||
| 5114 | for (ptr = &buffer->name; | 5105 | for (ptr = &buffer->name; |
| 5115 | (char *)ptr < (char *)buffer + sizeof (struct buffer); | 5106 | (char *)ptr < (char *)buffer + sizeof (struct buffer); |
| 5116 | ptr++) | 5107 | ptr++) |
| 5117 | mark_object (ptr); | 5108 | mark_object (*ptr); |
| 5118 | 5109 | ||
| 5119 | /* If this is an indirect buffer, mark its base buffer. */ | 5110 | /* If this is an indirect buffer, mark its base buffer. */ |
| 5120 | if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer)) | 5111 | if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer)) |