From: Richard M. Stallman Date: Fri, 30 Dec 1994 01:52:37 +0000 (+0000) Subject: (mark_object): Don't use Lisp_Process, Lisp_Window. X-Git-Tag: emacs-19.34~5565 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=169ee24357c55b3aded78bffdd618f8a036d6b55;p=emacs.git (mark_object): Don't use Lisp_Process, Lisp_Window. Handle frames, compileds and subrs as branch of Lisp_Vectorlike case. (Fmake_byte_code): Use XSETCOMPILED. --- diff --git a/src/alloc.c b/src/alloc.c index 30f851a0bef..1d55fc50d04 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -668,7 +668,7 @@ significance.") args[index] = Fpurecopy (args[index]); p->contents[index] = args[index]; } - XSETTYPE (val, Lisp_Compiled); + XSETCOMPILED (val, val); return val; } @@ -1523,77 +1523,77 @@ mark_object (objptr) break; case Lisp_Vectorlike: - case Lisp_Window: - case Lisp_Process: - { - register struct Lisp_Vector *ptr = XVECTOR (obj); - register EMACS_INT size = ptr->size; - /* The reason we use ptr1 is to avoid an apparent hardware bug - that happens occasionally on the FSF's HP 300s. - The bug is that a2 gets clobbered by recursive calls to mark_object. - The clobberage seems to happen during function entry, - perhaps in the moveml instruction. - Yes, this is a crock, but we have to do it. */ - struct Lisp_Vector *volatile ptr1 = ptr; - register int i; - - if (size & ARRAY_MARK_FLAG) break; /* Already marked */ - ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ - if (size & PSEUDOVECTOR_FLAG) + if (GC_SUBRP (obj)) + break; + else if (GC_COMPILEDP (obj)) + /* We could treat this just like a vector, but it is better + to save the COMPILED_CONSTANTS element for last and avoid recursion + there. */ + { + register struct Lisp_Vector *ptr = XVECTOR (obj); + register EMACS_INT size = ptr->size; + /* See comment above under Lisp_Vector. */ + struct Lisp_Vector *volatile ptr1 = ptr; + register int i; + + if (size & ARRAY_MARK_FLAG) + break; /* Already marked */ + ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ size &= PSEUDOVECTOR_SIZE_MASK; - for (i = 0; i < size; i++) /* and then mark its elements */ - mark_object (&ptr1->contents[i]); - } - break; - - case Lisp_Compiled: - /* We could treat this just like a vector, but it is better - to save the COMPILED_CONSTANTS element for last and avoid recursion - there. */ - { - register struct Lisp_Vector *ptr = XVECTOR (obj); - register EMACS_INT size = ptr->size; - /* See comment above under Lisp_Vector. */ - struct Lisp_Vector *volatile ptr1 = ptr; - register int i; - - if (size & ARRAY_MARK_FLAG) break; /* Already marked */ - ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ - for (i = 0; i < size; i++) /* and then mark its elements */ - { - if (i != COMPILED_CONSTANTS) - mark_object (&ptr1->contents[i]); - } - /* This cast should be unnecessary, but some Mips compiler complains - (MIPS-ABI + SysVR4, DC/OSx, etc). */ - objptr = (Lisp_Object *) &ptr1->contents[COMPILED_CONSTANTS]; - goto loop; - } - + for (i = 0; i < size; i++) /* and then mark its elements */ + { + if (i != COMPILED_CONSTANTS) + mark_object (&ptr1->contents[i]); + } + /* This cast should be unnecessary, but some Mips compiler complains + (MIPS-ABI + SysVR4, DC/OSx, etc). */ + objptr = (Lisp_Object *) &ptr1->contents[COMPILED_CONSTANTS]; + goto loop; + } #ifdef MULTI_FRAME - case Lisp_Frame: - { - /* See comment above under Lisp_Vector for why this is volatile. */ - register struct frame *volatile ptr = XFRAME (obj); - register EMACS_INT size = ptr->size; - - if (size & ARRAY_MARK_FLAG) break; /* Already marked */ - ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ - - mark_object (&ptr->name); - mark_object (&ptr->focus_frame); - mark_object (&ptr->selected_window); - mark_object (&ptr->minibuffer_window); - mark_object (&ptr->param_alist); - mark_object (&ptr->scroll_bars); - mark_object (&ptr->condemned_scroll_bars); - mark_object (&ptr->menu_bar_items); - mark_object (&ptr->face_alist); - mark_object (&ptr->menu_bar_vector); - mark_object (&ptr->buffer_predicate); - } - break; + else if (GC_FRAMEP (obj)) + { + /* See comment above under Lisp_Vector for why this is volatile. */ + register struct frame *volatile ptr = XFRAME (obj); + register EMACS_INT size = ptr->size; + + if (size & ARRAY_MARK_FLAG) break; /* Already marked */ + ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ + + mark_object (&ptr->name); + mark_object (&ptr->focus_frame); + mark_object (&ptr->selected_window); + mark_object (&ptr->minibuffer_window); + mark_object (&ptr->param_alist); + mark_object (&ptr->scroll_bars); + mark_object (&ptr->condemned_scroll_bars); + mark_object (&ptr->menu_bar_items); + mark_object (&ptr->face_alist); + mark_object (&ptr->menu_bar_vector); + mark_object (&ptr->buffer_predicate); + } + else #endif /* MULTI_FRAME */ + { + register struct Lisp_Vector *ptr = XVECTOR (obj); + register EMACS_INT size = ptr->size; + /* The reason we use ptr1 is to avoid an apparent hardware bug + that happens occasionally on the FSF's HP 300s. + The bug is that a2 gets clobbered by recursive calls to mark_object. + The clobberage seems to happen during function entry, + perhaps in the moveml instruction. + Yes, this is a crock, but we have to do it. */ + struct Lisp_Vector *volatile ptr1 = ptr; + register int i; + + if (size & ARRAY_MARK_FLAG) break; /* Already marked */ + ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ + if (size & PSEUDOVECTOR_FLAG) + size &= PSEUDOVECTOR_SIZE_MASK; + for (i = 0; i < size; i++) /* and then mark its elements */ + mark_object (&ptr1->contents[i]); + } + break; case Lisp_Symbol: { @@ -1709,7 +1709,6 @@ mark_object (objptr) break; case Lisp_Int: - case Lisp_Subr: break; default: