Mercurial > emacs
comparison src/alloc.c @ 32360:d8b668a486d7
(mark_object): Remove all workarounds installed on
1993-08-08.
| author | Andreas Schwab <schwab@suse.de> |
|---|---|
| date | Tue, 10 Oct 2000 11:10:58 +0000 |
| parents | 31541e0a2704 |
| children | b3918817f15f |
comparison
equal
deleted
inserted
replaced
| 32359:93e229052aa9 | 32360:d8b668a486d7 |
|---|---|
| 3964 save the COMPILED_CONSTANTS element for last and avoid | 3964 save the COMPILED_CONSTANTS element for last and avoid |
| 3965 recursion there. */ | 3965 recursion there. */ |
| 3966 { | 3966 { |
| 3967 register struct Lisp_Vector *ptr = XVECTOR (obj); | 3967 register struct Lisp_Vector *ptr = XVECTOR (obj); |
| 3968 register EMACS_INT size = ptr->size; | 3968 register EMACS_INT size = ptr->size; |
| 3969 /* See comment above under Lisp_Vector. */ | |
| 3970 struct Lisp_Vector *volatile ptr1 = ptr; | |
| 3971 register int i; | 3969 register int i; |
| 3972 | 3970 |
| 3973 if (size & ARRAY_MARK_FLAG) | 3971 if (size & ARRAY_MARK_FLAG) |
| 3974 break; /* Already marked */ | 3972 break; /* Already marked */ |
| 3975 | 3973 |
| 3977 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ | 3975 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ |
| 3978 size &= PSEUDOVECTOR_SIZE_MASK; | 3976 size &= PSEUDOVECTOR_SIZE_MASK; |
| 3979 for (i = 0; i < size; i++) /* and then mark its elements */ | 3977 for (i = 0; i < size; i++) /* and then mark its elements */ |
| 3980 { | 3978 { |
| 3981 if (i != COMPILED_CONSTANTS) | 3979 if (i != COMPILED_CONSTANTS) |
| 3982 mark_object (&ptr1->contents[i]); | 3980 mark_object (&ptr->contents[i]); |
| 3983 } | 3981 } |
| 3984 /* This cast should be unnecessary, but some Mips compiler complains | 3982 /* This cast should be unnecessary, but some Mips compiler complains |
| 3985 (MIPS-ABI + SysVR4, DC/OSx, etc). */ | 3983 (MIPS-ABI + SysVR4, DC/OSx, etc). */ |
| 3986 objptr = (Lisp_Object *) &ptr1->contents[COMPILED_CONSTANTS]; | 3984 objptr = (Lisp_Object *) &ptr->contents[COMPILED_CONSTANTS]; |
| 3987 goto loop; | 3985 goto loop; |
| 3988 } | 3986 } |
| 3989 else if (GC_FRAMEP (obj)) | 3987 else if (GC_FRAMEP (obj)) |
| 3990 { | 3988 { |
| 3991 /* See comment above under Lisp_Vector for why this is volatile. */ | 3989 register struct frame *ptr = XFRAME (obj); |
| 3992 register struct frame *volatile ptr = XFRAME (obj); | |
| 3993 register EMACS_INT size = ptr->size; | 3990 register EMACS_INT size = ptr->size; |
| 3994 | 3991 |
| 3995 if (size & ARRAY_MARK_FLAG) break; /* Already marked */ | 3992 if (size & ARRAY_MARK_FLAG) break; /* Already marked */ |
| 3996 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ | 3993 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ |
| 3997 | 3994 |
| 4033 else if (GC_WINDOWP (obj)) | 4030 else if (GC_WINDOWP (obj)) |
| 4034 { | 4031 { |
| 4035 register struct Lisp_Vector *ptr = XVECTOR (obj); | 4032 register struct Lisp_Vector *ptr = XVECTOR (obj); |
| 4036 struct window *w = XWINDOW (obj); | 4033 struct window *w = XWINDOW (obj); |
| 4037 register EMACS_INT size = ptr->size; | 4034 register EMACS_INT size = ptr->size; |
| 4038 /* The reason we use ptr1 is to avoid an apparent hardware bug | |
| 4039 that happens occasionally on the FSF's HP 300s. | |
| 4040 The bug is that a2 gets clobbered by recursive calls to mark_object. | |
| 4041 The clobberage seems to happen during function entry, | |
| 4042 perhaps in the moveml instruction. | |
| 4043 Yes, this is a crock, but we have to do it. */ | |
| 4044 struct Lisp_Vector *volatile ptr1 = ptr; | |
| 4045 register int i; | 4035 register int i; |
| 4046 | 4036 |
| 4047 /* Stop if already marked. */ | 4037 /* Stop if already marked. */ |
| 4048 if (size & ARRAY_MARK_FLAG) | 4038 if (size & ARRAY_MARK_FLAG) |
| 4049 break; | 4039 break; |
| 4053 ptr->size |= ARRAY_MARK_FLAG; | 4043 ptr->size |= ARRAY_MARK_FLAG; |
| 4054 | 4044 |
| 4055 /* There is no Lisp data above The member CURRENT_MATRIX in | 4045 /* There is no Lisp data above The member CURRENT_MATRIX in |
| 4056 struct WINDOW. Stop marking when that slot is reached. */ | 4046 struct WINDOW. Stop marking when that slot is reached. */ |
| 4057 for (i = 0; | 4047 for (i = 0; |
| 4058 (char *) &ptr1->contents[i] < (char *) &w->current_matrix; | 4048 (char *) &ptr->contents[i] < (char *) &w->current_matrix; |
| 4059 i++) | 4049 i++) |
| 4060 mark_object (&ptr1->contents[i]); | 4050 mark_object (&ptr->contents[i]); |
| 4061 | 4051 |
| 4062 /* Mark glyphs for leaf windows. Marking window matrices is | 4052 /* Mark glyphs for leaf windows. Marking window matrices is |
| 4063 sufficient because frame matrices use the same glyph | 4053 sufficient because frame matrices use the same glyph |
| 4064 memory. */ | 4054 memory. */ |
| 4065 if (NILP (w->hchild) | 4055 if (NILP (w->hchild) |
| 4104 } | 4094 } |
| 4105 else | 4095 else |
| 4106 { | 4096 { |
| 4107 register struct Lisp_Vector *ptr = XVECTOR (obj); | 4097 register struct Lisp_Vector *ptr = XVECTOR (obj); |
| 4108 register EMACS_INT size = ptr->size; | 4098 register EMACS_INT size = ptr->size; |
| 4109 /* The reason we use ptr1 is to avoid an apparent hardware bug | |
| 4110 that happens occasionally on the FSF's HP 300s. | |
| 4111 The bug is that a2 gets clobbered by recursive calls to mark_object. | |
| 4112 The clobberage seems to happen during function entry, | |
| 4113 perhaps in the moveml instruction. | |
| 4114 Yes, this is a crock, but we have to do it. */ | |
| 4115 struct Lisp_Vector *volatile ptr1 = ptr; | |
| 4116 register int i; | 4099 register int i; |
| 4117 | 4100 |
| 4118 if (size & ARRAY_MARK_FLAG) break; /* Already marked */ | 4101 if (size & ARRAY_MARK_FLAG) break; /* Already marked */ |
| 4119 CHECK_LIVE (live_vector_p); | 4102 CHECK_LIVE (live_vector_p); |
| 4120 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ | 4103 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ |
| 4121 if (size & PSEUDOVECTOR_FLAG) | 4104 if (size & PSEUDOVECTOR_FLAG) |
| 4122 size &= PSEUDOVECTOR_SIZE_MASK; | 4105 size &= PSEUDOVECTOR_SIZE_MASK; |
| 4123 | 4106 |
| 4124 for (i = 0; i < size; i++) /* and then mark its elements */ | 4107 for (i = 0; i < size; i++) /* and then mark its elements */ |
| 4125 mark_object (&ptr1->contents[i]); | 4108 mark_object (&ptr->contents[i]); |
| 4126 } | 4109 } |
| 4127 break; | 4110 break; |
| 4128 | 4111 |
| 4129 case Lisp_Symbol: | 4112 case Lisp_Symbol: |
| 4130 { | 4113 { |
| 4131 /* See comment above under Lisp_Vector for why this is volatile. */ | 4114 register struct Lisp_Symbol *ptr = XSYMBOL (obj); |
| 4132 register struct Lisp_Symbol *volatile ptr = XSYMBOL (obj); | |
| 4133 struct Lisp_Symbol *ptrx; | 4115 struct Lisp_Symbol *ptrx; |
| 4134 | 4116 |
| 4135 if (XMARKBIT (ptr->plist)) break; | 4117 if (XMARKBIT (ptr->plist)) break; |
| 4136 CHECK_ALLOCATED_AND_LIVE (live_symbol_p); | 4118 CHECK_ALLOCATED_AND_LIVE (live_symbol_p); |
| 4137 XMARK (ptr->plist); | 4119 XMARK (ptr->plist); |
| 4185 goto loop; | 4167 goto loop; |
| 4186 } | 4168 } |
| 4187 mark_object (&ptr->realvalue); | 4169 mark_object (&ptr->realvalue); |
| 4188 mark_object (&ptr->buffer); | 4170 mark_object (&ptr->buffer); |
| 4189 mark_object (&ptr->frame); | 4171 mark_object (&ptr->frame); |
| 4190 /* See comment above under Lisp_Vector for why not use ptr here. */ | 4172 objptr = &ptr->cdr; |
| 4191 objptr = &XBUFFER_LOCAL_VALUE (obj)->cdr; | |
| 4192 goto loop; | 4173 goto loop; |
| 4193 } | 4174 } |
| 4194 | 4175 |
| 4195 case Lisp_Misc_Intfwd: | 4176 case Lisp_Misc_Intfwd: |
| 4196 case Lisp_Misc_Boolfwd: | 4177 case Lisp_Misc_Boolfwd: |
| 4233 { | 4214 { |
| 4234 objptr = &ptr->car; | 4215 objptr = &ptr->car; |
| 4235 goto loop; | 4216 goto loop; |
| 4236 } | 4217 } |
| 4237 mark_object (&ptr->car); | 4218 mark_object (&ptr->car); |
| 4238 /* See comment above under Lisp_Vector for why not use ptr here. */ | 4219 objptr = &ptr->cdr; |
| 4239 objptr = &XCDR (obj); | |
| 4240 goto loop; | 4220 goto loop; |
| 4241 } | 4221 } |
| 4242 | 4222 |
| 4243 case Lisp_Float: | 4223 case Lisp_Float: |
| 4244 CHECK_ALLOCATED_AND_LIVE (live_float_p); | 4224 CHECK_ALLOCATED_AND_LIVE (live_float_p); |
