aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
authorRichard M. Stallman1993-08-08 23:19:24 +0000
committerRichard M. Stallman1993-08-08 23:19:24 +0000
commit41f54422a47ddd88ca3e94d9d8f1544b34ae2f8c (patch)
tree5a0f6001729b5532b8224c23b12b14ae10b4d209 /src/alloc.c
parent2224a5fc74ae074978f60dadf46aa9a38846c619 (diff)
downloademacs-41f54422a47ddd88ca3e94d9d8f1544b34ae2f8c.tar.gz
emacs-41f54422a47ddd88ca3e94d9d8f1544b34ae2f8c.zip
(mark_object): Declare ptr volatile, or don't use it
after a recursive call. Delete the aborts if ptr is clobbered.
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c45
1 files changed, 16 insertions, 29 deletions
diff --git a/src/alloc.c b/src/alloc.c
index a411071067f..c141f4a1e22 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -1469,11 +1469,6 @@ mark_object (objptr)
1469{ 1469{
1470 register Lisp_Object obj; 1470 register Lisp_Object obj;
1471 1471
1472#ifdef DEBUG_MOLE
1473 if (*(int *) ((char *)__builtin_frame_address (0) - 16) == 0)
1474 abort ();
1475#endif
1476
1477 obj = *objptr; 1472 obj = *objptr;
1478 XUNMARK (obj); 1473 XUNMARK (obj);
1479 1474
@@ -1531,17 +1526,19 @@ mark_object (objptr)
1531 { 1526 {
1532 register struct Lisp_Vector *ptr = XVECTOR (obj); 1527 register struct Lisp_Vector *ptr = XVECTOR (obj);
1533 register int size = ptr->size; 1528 register int size = ptr->size;
1529 /* The reason we use ptr1 is to avoid an apparent hardware bug
1530 that happens occasionally on the FSF's HP 300s.
1531 The bug is that a2 gets clobbered by recursive calls to mark_object.
1532 The clobberage seems to happen during function entry,
1533 perhaps in the moveml instruction.
1534 Yes, this is a crock, but we have to do it. */
1534 struct Lisp_Vector *volatile ptr1 = ptr; 1535 struct Lisp_Vector *volatile ptr1 = ptr;
1535 register int i; 1536 register int i;
1536 1537
1537 if (size & ARRAY_MARK_FLAG) break; /* Already marked */ 1538 if (size & ARRAY_MARK_FLAG) break; /* Already marked */
1538 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ 1539 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
1539 for (i = 0; i < size; i++) /* and then mark its elements */ 1540 for (i = 0; i < size; i++) /* and then mark its elements */
1540 { 1541 mark_object (&ptr1->contents[i]);
1541 if (ptr != ptr1)
1542 abort ();
1543 mark_object (&ptr->contents[i]);
1544 }
1545 } 1542 }
1546 break; 1543 break;
1547 1544
@@ -1552,6 +1549,7 @@ mark_object (objptr)
1552 { 1549 {
1553 register struct Lisp_Vector *ptr = XVECTOR (obj); 1550 register struct Lisp_Vector *ptr = XVECTOR (obj);
1554 register int size = ptr->size; 1551 register int size = ptr->size;
1552 /* See comment above under Lisp_Vector. */
1555 struct Lisp_Vector *volatile ptr1 = ptr; 1553 struct Lisp_Vector *volatile ptr1 = ptr;
1556 register int i; 1554 register int i;
1557 1555
@@ -1559,12 +1557,10 @@ mark_object (objptr)
1559 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */ 1557 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
1560 for (i = 0; i < size; i++) /* and then mark its elements */ 1558 for (i = 0; i < size; i++) /* and then mark its elements */
1561 { 1559 {
1562 if (ptr != ptr1)
1563 abort ();
1564 if (i != COMPILED_CONSTANTS) 1560 if (i != COMPILED_CONSTANTS)
1565 mark_object (&ptr->contents[i]); 1561 mark_object (&ptr1->contents[i]);
1566 } 1562 }
1567 objptr = &ptr->contents[COMPILED_CONSTANTS]; 1563 objptr = &ptr1->contents[COMPILED_CONSTANTS];
1568 obj = *objptr; 1564 obj = *objptr;
1569 goto loop; 1565 goto loop;
1570 } 1566 }
@@ -1572,7 +1568,8 @@ mark_object (objptr)
1572#ifdef MULTI_FRAME 1568#ifdef MULTI_FRAME
1573 case Lisp_Frame: 1569 case Lisp_Frame:
1574 { 1570 {
1575 register struct frame *ptr = XFRAME (obj); 1571 /* See comment above under Lisp_Vector for why this is volatile. */
1572 register struct frame *volatile ptr = XFRAME (obj);
1576 register int size = ptr->size; 1573 register int size = ptr->size;
1577 1574
1578 if (size & ARRAY_MARK_FLAG) break; /* Already marked */ 1575 if (size & ARRAY_MARK_FLAG) break; /* Already marked */
@@ -1595,24 +1592,17 @@ mark_object (objptr)
1595 1592
1596 case Lisp_Symbol: 1593 case Lisp_Symbol:
1597 { 1594 {
1598 register struct Lisp_Symbol *ptr = XSYMBOL (obj); 1595 /* See comment above under Lisp_Vector for why this is volatile. */
1596 register struct Lisp_Symbol *volatile ptr = XSYMBOL (obj);
1599 struct Lisp_Symbol *ptrx; 1597 struct Lisp_Symbol *ptrx;
1600 1598
1601 if (XMARKBIT (ptr->plist)) break; 1599 if (XMARKBIT (ptr->plist)) break;
1602 XMARK (ptr->plist); 1600 XMARK (ptr->plist);
1603 mark_object ((Lisp_Object *) &ptr->value); 1601 mark_object ((Lisp_Object *) &ptr->value);
1604 if ((unsigned int) ptr <= 4)
1605 abort ();
1606 mark_object (&ptr->function); 1602 mark_object (&ptr->function);
1607 if ((unsigned int) ptr <= 4)
1608 abort ();
1609 mark_object (&ptr->plist); 1603 mark_object (&ptr->plist);
1610 if ((unsigned int) ptr <= 4)
1611 abort ();
1612 XSETTYPE (*(Lisp_Object *) &ptr->name, Lisp_String); 1604 XSETTYPE (*(Lisp_Object *) &ptr->name, Lisp_String);
1613 mark_object (&ptr->name); 1605 mark_object (&ptr->name);
1614 if ((unsigned int) ptr <= 4)
1615 abort ();
1616 ptr = ptr->next; 1606 ptr = ptr->next;
1617 if (ptr) 1607 if (ptr)
1618 { 1608 {
@@ -1646,12 +1636,9 @@ mark_object (objptr)
1646 XUNMARK (obj); 1636 XUNMARK (obj);
1647 goto loop; 1637 goto loop;
1648 } 1638 }
1649 if (ptr == 0)
1650 abort ();
1651 mark_object (&ptr->car); 1639 mark_object (&ptr->car);
1652 if (ptr == 0) 1640 /* See comment above under Lisp_Vector for why not use ptr here. */
1653 abort (); 1641 objptr = &XCONS (obj)->cdr;
1654 objptr = &ptr->cdr;
1655 obj = ptr->cdr; 1642 obj = ptr->cdr;
1656 goto loop; 1643 goto loop;
1657 } 1644 }