diff options
| author | Richard M. Stallman | 1993-08-08 23:19:24 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1993-08-08 23:19:24 +0000 |
| commit | 41f54422a47ddd88ca3e94d9d8f1544b34ae2f8c (patch) | |
| tree | 5a0f6001729b5532b8224c23b12b14ae10b4d209 /src/alloc.c | |
| parent | 2224a5fc74ae074978f60dadf46aa9a38846c619 (diff) | |
| download | emacs-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.c | 45 |
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 | } |