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