aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
authorRichard M. Stallman1994-12-30 01:52:37 +0000
committerRichard M. Stallman1994-12-30 01:52:37 +0000
commit169ee24357c55b3aded78bffdd618f8a036d6b55 (patch)
treedbddf39135d9182776349a7031ee45a0ca06d120 /src/alloc.c
parent7f358972bc81e4d92a7e1d6d6e6a265c4fe8f5b9 (diff)
downloademacs-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.c139
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: