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. */