diff options
| author | Richard M. Stallman | 1994-12-30 01:52:37 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1994-12-30 01:52:37 +0000 |
| commit | 169ee24357c55b3aded78bffdd618f8a036d6b55 (patch) | |
| tree | dbddf39135d9182776349a7031ee45a0ca06d120 /src/alloc.c | |
| parent | 7f358972bc81e4d92a7e1d6d6e6a265c4fe8f5b9 (diff) | |
| download | emacs-169ee24357c55b3aded78bffdd618f8a036d6b55.tar.gz emacs-169ee24357c55b3aded78bffdd618f8a036d6b55.zip | |
(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.
Diffstat (limited to 'src/alloc.c')
| -rw-r--r-- | src/alloc.c | 139 |
1 files changed, 69 insertions, 70 deletions
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.") | |||
| 668 | args[index] = Fpurecopy (args[index]); | 668 | args[index] = Fpurecopy (args[index]); |
| 669 | p->contents[index] = args[index]; | 669 | p->contents[index] = args[index]; |
| 670 | } | 670 | } |
| 671 | XSETTYPE (val, Lisp_Compiled); | 671 | XSETCOMPILED (val, val); |
| 672 | return val; | 672 | return val; |
| 673 | } | 673 | } |
| 674 | 674 | ||
| @@ -1523,77 +1523,77 @@ mark_object (objptr) | |||
| 1523 | break; | 1523 | break; |
| 1524 | 1524 | ||
| 1525 | case Lisp_Vectorlike: | 1525 | case Lisp_Vectorlike: |
| 1526 | case Lisp_Window: | 1526 | if (GC_SUBRP (obj)) |
| 1527 | case Lisp_Process: | 1527 | break; |
| 1528 | { | 1528 | else if (GC_COMPILEDP (obj)) |
| 1529 | register struct Lisp_Vector *ptr = XVECTOR (obj); | 1529 | /* We could treat this just like a vector, but it is better |
| 1530 | register EMACS_INT size = ptr->size; | 1530 | to save the COMPILED_CONSTANTS element for last and avoid recursion |
| 1531 | /* The reason we use ptr1 is to avoid an apparent hardware bug | 1531 | there. */ |
| 1532 | that happens occasionally on the FSF's HP 300s. | 1532 | { |
| 1533 | The bug is that a2 gets clobbered by recursive calls to mark_object. | 1533 | register struct Lisp_Vector *ptr = XVECTOR (obj); |
| 1534 | The clobberage seems to happen during function entry, | 1534 | register EMACS_INT size = ptr->size; |
| 1535 | perhaps in the moveml instruction. | 1535 | /* See comment above under Lisp_Vector. */ |
| 1536 | Yes, this is a crock, but we have to do it. */ | 1536 | struct Lisp_Vector *volatile ptr1 = ptr; |
| 1537 | struct Lisp_Vector *volatile ptr1 = ptr; | 1537 | register int i; |
| 1538 | register int i; | 1538 | |
| 1539 | 1539 | if (size & ARRAY_MARK_FLAG) | |
| 1540 | if (size & ARRAY_MARK_FLAG) break; /* Already marked */ | 1540 | break; /* Already marked */ |
| 1541 | ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ | 1541 | ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ |
| 1542 | if (size & PSEUDOVECTOR_FLAG) | ||
| 1543 | size &= PSEUDOVECTOR_SIZE_MASK; | 1542 | size &= PSEUDOVECTOR_SIZE_MASK; |
| 1544 | for (i = 0; i < size; i++) /* and then mark its elements */ | 1543 | for (i = 0; i < size; i++) /* and then mark its elements */ |
| 1545 | mark_object (&ptr1->contents[i]); | 1544 | { |
| 1546 | } | 1545 | if (i != COMPILED_CONSTANTS) |
| 1547 | break; | 1546 | mark_object (&ptr1->contents[i]); |
| 1548 | 1547 | } | |
| 1549 | case Lisp_Compiled: | 1548 | /* This cast should be unnecessary, but some Mips compiler complains |
| 1550 | /* We could treat this just like a vector, but it is better | 1549 | (MIPS-ABI + SysVR4, DC/OSx, etc). */ |
| 1551 | to save the COMPILED_CONSTANTS element for last and avoid recursion | 1550 | objptr = (Lisp_Object *) &ptr1->contents[COMPILED_CONSTANTS]; |
| 1552 | there. */ | 1551 | goto loop; |
| 1553 | { | 1552 | } |
| 1554 | register struct Lisp_Vector *ptr = XVECTOR (obj); | ||
| 1555 | register EMACS_INT size = ptr->size; | ||
| 1556 | /* See comment above under Lisp_Vector. */ | ||
| 1557 | struct Lisp_Vector *volatile ptr1 = ptr; | ||
| 1558 | register int i; | ||
| 1559 | |||
| 1560 | if (size & ARRAY_MARK_FLAG) break; /* Already marked */ | ||
| 1561 | ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ | ||
| 1562 | for (i = 0; i < size; i++) /* and then mark its elements */ | ||
| 1563 | { | ||
| 1564 | if (i != COMPILED_CONSTANTS) | ||
| 1565 | mark_object (&ptr1->contents[i]); | ||
| 1566 | } | ||
| 1567 | /* This cast should be unnecessary, but some Mips compiler complains | ||
| 1568 | (MIPS-ABI + SysVR4, DC/OSx, etc). */ | ||
| 1569 | objptr = (Lisp_Object *) &ptr1->contents[COMPILED_CONSTANTS]; | ||
| 1570 | goto loop; | ||
| 1571 | } | ||
| 1572 | |||
| 1573 | #ifdef MULTI_FRAME | 1553 | #ifdef MULTI_FRAME |
| 1574 | case Lisp_Frame: | 1554 | else if (GC_FRAMEP (obj)) |
| 1575 | { | 1555 | { |
| 1576 | /* See comment above under Lisp_Vector for why this is volatile. */ | 1556 | /* See comment above under Lisp_Vector for why this is volatile. */ |
| 1577 | register struct frame *volatile ptr = XFRAME (obj); | 1557 | register struct frame *volatile ptr = XFRAME (obj); |
| 1578 | register EMACS_INT size = ptr->size; | 1558 | register EMACS_INT size = ptr->size; |
| 1579 | 1559 | ||
| 1580 | if (size & ARRAY_MARK_FLAG) break; /* Already marked */ | 1560 | if (size & ARRAY_MARK_FLAG) break; /* Already marked */ |
| 1581 | ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ | 1561 | ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ |
| 1582 | 1562 | ||
| 1583 | mark_object (&ptr->name); | 1563 | mark_object (&ptr->name); |
| 1584 | mark_object (&ptr->focus_frame); | 1564 | mark_object (&ptr->focus_frame); |
| 1585 | mark_object (&ptr->selected_window); | 1565 | mark_object (&ptr->selected_window); |
| 1586 | mark_object (&ptr->minibuffer_window); | 1566 | mark_object (&ptr->minibuffer_window); |
| 1587 | mark_object (&ptr->param_alist); | 1567 | mark_object (&ptr->param_alist); |
| 1588 | mark_object (&ptr->scroll_bars); | 1568 | mark_object (&ptr->scroll_bars); |
| 1589 | mark_object (&ptr->condemned_scroll_bars); | 1569 | mark_object (&ptr->condemned_scroll_bars); |
| 1590 | mark_object (&ptr->menu_bar_items); | 1570 | mark_object (&ptr->menu_bar_items); |
| 1591 | mark_object (&ptr->face_alist); | 1571 | mark_object (&ptr->face_alist); |
| 1592 | mark_object (&ptr->menu_bar_vector); | 1572 | mark_object (&ptr->menu_bar_vector); |
| 1593 | mark_object (&ptr->buffer_predicate); | 1573 | mark_object (&ptr->buffer_predicate); |
| 1594 | } | 1574 | } |
| 1595 | break; | 1575 | else |
| 1596 | #endif /* MULTI_FRAME */ | 1576 | #endif /* MULTI_FRAME */ |
| 1577 | { | ||
| 1578 | register struct Lisp_Vector *ptr = XVECTOR (obj); | ||
| 1579 | register EMACS_INT size = ptr->size; | ||
| 1580 | /* The reason we use ptr1 is to avoid an apparent hardware bug | ||
| 1581 | that happens occasionally on the FSF's HP 300s. | ||
| 1582 | The bug is that a2 gets clobbered by recursive calls to mark_object. | ||
| 1583 | The clobberage seems to happen during function entry, | ||
| 1584 | perhaps in the moveml instruction. | ||
| 1585 | Yes, this is a crock, but we have to do it. */ | ||
| 1586 | struct Lisp_Vector *volatile ptr1 = ptr; | ||
| 1587 | register int i; | ||
| 1588 | |||
| 1589 | if (size & ARRAY_MARK_FLAG) break; /* Already marked */ | ||
| 1590 | ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ | ||
| 1591 | if (size & PSEUDOVECTOR_FLAG) | ||
| 1592 | size &= PSEUDOVECTOR_SIZE_MASK; | ||
| 1593 | for (i = 0; i < size; i++) /* and then mark its elements */ | ||
| 1594 | mark_object (&ptr1->contents[i]); | ||
| 1595 | } | ||
| 1596 | break; | ||
| 1597 | 1597 | ||
| 1598 | case Lisp_Symbol: | 1598 | case Lisp_Symbol: |
| 1599 | { | 1599 | { |
| @@ -1709,7 +1709,6 @@ mark_object (objptr) | |||
| 1709 | break; | 1709 | break; |
| 1710 | 1710 | ||
| 1711 | case Lisp_Int: | 1711 | case Lisp_Int: |
| 1712 | case Lisp_Subr: | ||
| 1713 | break; | 1712 | break; |
| 1714 | 1713 | ||
| 1715 | default: | 1714 | default: |