Mercurial > emacs
comparison src/alloc.c @ 10307:e6e75fd0916d
(mark_buffer, gc_sweep): Use BUF_INTERVALS.
(mark_buffer): In indirect buffer, mark the base buffer.
(mark_object): Make buffer case a branch of the Lisp_Vectorlike case.
| author | Richard M. Stallman <rms@gnu.org> |
|---|---|
| date | Mon, 02 Jan 1995 09:15:25 +0000 |
| parents | 96273a6ec492 |
| children | a6e67b5ee8b0 |
comparison
equal
deleted
inserted
replaced
| 10306:89f8d7f3bd73 | 10307:e6e75fd0916d |
|---|---|
| 1521 } | 1521 } |
| 1522 } | 1522 } |
| 1523 break; | 1523 break; |
| 1524 | 1524 |
| 1525 case Lisp_Vectorlike: | 1525 case Lisp_Vectorlike: |
| 1526 if (GC_SUBRP (obj)) | 1526 if (GC_BUFFERP (obj)) |
| 1527 mark_buffer (obj); | |
| 1528 else if (GC_SUBRP (obj)) | |
| 1527 break; | 1529 break; |
| 1528 else if (GC_COMPILEDP (obj)) | 1530 else if (GC_COMPILEDP (obj)) |
| 1529 /* We could treat this just like a vector, but it is better | 1531 /* We could treat this just like a vector, but it is better |
| 1530 to save the COMPILED_CONSTANTS element for last and avoid recursion | 1532 to save the COMPILED_CONSTANTS element for last and avoid recursion |
| 1531 there. */ | 1533 there. */ |
| 1701 case Lisp_Float: | 1703 case Lisp_Float: |
| 1702 XMARK (XFLOAT (obj)->type); | 1704 XMARK (XFLOAT (obj)->type); |
| 1703 break; | 1705 break; |
| 1704 #endif /* LISP_FLOAT_TYPE */ | 1706 #endif /* LISP_FLOAT_TYPE */ |
| 1705 | 1707 |
| 1706 case Lisp_Buffer: | |
| 1707 if (!XMARKBIT (XBUFFER (obj)->name)) | |
| 1708 mark_buffer (obj); | |
| 1709 break; | |
| 1710 | |
| 1711 case Lisp_Int: | 1708 case Lisp_Int: |
| 1712 break; | 1709 break; |
| 1713 | 1710 |
| 1714 default: | 1711 default: |
| 1715 abort (); | 1712 abort (); |
| 1722 mark_buffer (buf) | 1719 mark_buffer (buf) |
| 1723 Lisp_Object buf; | 1720 Lisp_Object buf; |
| 1724 { | 1721 { |
| 1725 register struct buffer *buffer = XBUFFER (buf); | 1722 register struct buffer *buffer = XBUFFER (buf); |
| 1726 register Lisp_Object *ptr; | 1723 register Lisp_Object *ptr; |
| 1724 Lisp_Object base_buffer; | |
| 1727 | 1725 |
| 1728 /* This is the buffer's markbit */ | 1726 /* This is the buffer's markbit */ |
| 1729 mark_object (&buffer->name); | 1727 mark_object (&buffer->name); |
| 1730 XMARK (buffer->name); | 1728 XMARK (buffer->name); |
| 1731 | 1729 |
| 1732 MARK_INTERVAL_TREE (buffer->intervals); | 1730 MARK_INTERVAL_TREE (BUF_INTERVALS (buffer)); |
| 1733 | 1731 |
| 1734 #if 0 | 1732 #if 0 |
| 1735 mark_object (buffer->syntax_table); | 1733 mark_object (buffer->syntax_table); |
| 1736 | 1734 |
| 1737 /* Mark the various string-pointers in the buffer object. | 1735 /* Mark the various string-pointers in the buffer object. |
| 1751 | 1749 |
| 1752 for (ptr = &buffer->name + 1; | 1750 for (ptr = &buffer->name + 1; |
| 1753 (char *)ptr < (char *)buffer + sizeof (struct buffer); | 1751 (char *)ptr < (char *)buffer + sizeof (struct buffer); |
| 1754 ptr++) | 1752 ptr++) |
| 1755 mark_object (ptr); | 1753 mark_object (ptr); |
| 1754 | |
| 1755 /* If this is an indirect buffer, mark its base buffer. */ | |
| 1756 if (buffer->base_buffer) | |
| 1757 { | |
| 1758 XSETBUFFER (base_buffer, buffer->base_buffer); | |
| 1759 mark_buffer (base_buffer); | |
| 1760 } | |
| 1756 } | 1761 } |
| 1757 | 1762 |
| 1758 /* Sweep: find all structures not marked, and free them. */ | 1763 /* Sweep: find all structures not marked, and free them. */ |
| 1759 | 1764 |
| 1760 static void | 1765 static void |
| 1968 buffer = next; | 1973 buffer = next; |
| 1969 } | 1974 } |
| 1970 else | 1975 else |
| 1971 { | 1976 { |
| 1972 XUNMARK (buffer->name); | 1977 XUNMARK (buffer->name); |
| 1973 UNMARK_BALANCE_INTERVALS (buffer->intervals); | 1978 UNMARK_BALANCE_INTERVALS (BUF_INTERVALS (buffer)); |
| 1974 | 1979 |
| 1975 #if 0 | 1980 #if 0 |
| 1976 /* Each `struct Lisp_String *' was turned into a Lisp_Object | 1981 /* Each `struct Lisp_String *' was turned into a Lisp_Object |
| 1977 for purposes of marking and relocation. | 1982 for purposes of marking and relocation. |
| 1978 Turn them back into C pointers now. */ | 1983 Turn them back into C pointers now. */ |
