aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKarl Heuer1994-11-11 07:34:14 +0000
committerKarl Heuer1994-11-11 07:34:14 +0000
commit465edf35eb2be879cf5820f6bd97a07421bb069f (patch)
treea95f5d171c7c54aa30afeac63bcf719f5334f43e /src
parentfdc6e51676c4e9b498b7ddc238e9860d4da13fd6 (diff)
downloademacs-465edf35eb2be879cf5820f6bd97a07421bb069f.tar.gz
emacs-465edf35eb2be879cf5820f6bd97a07421bb069f.zip
(mark_object): New code to handle buffer-local substructure.
(gc_sweep): Generalize marker code to handle other substructures.
Diffstat (limited to 'src')
-rw-r--r--src/alloc.c84
1 files changed, 59 insertions, 25 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 7a462d81c00..4ff5bcfb4e7 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -1642,6 +1642,25 @@ mark_object (objptr)
1642 instead, markers are removed from the chain when freed by gc. */ 1642 instead, markers are removed from the chain when freed by gc. */
1643 break; 1643 break;
1644 1644
1645 case Lisp_Misc_Buffer_Local_Value:
1646 case Lisp_Misc_Some_Buffer_Local_Value:
1647 {
1648 register struct Lisp_Buffer_Local_Value *ptr
1649 = XBUFFER_LOCAL_VALUE (obj);
1650 if (XMARKBIT (ptr->car)) break;
1651 XMARK (ptr->car);
1652 /* If the cdr is nil, avoid recursion for the car. */
1653 if (EQ (ptr->cdr, Qnil))
1654 {
1655 objptr = &ptr->car;
1656 goto loop;
1657 }
1658 mark_object (&ptr->car);
1659 /* See comment above under Lisp_Vector for why not use ptr here. */
1660 objptr = &XBUFFER_LOCAL_VALUE (obj)->cdr;
1661 goto loop;
1662 }
1663
1645 case Lisp_Misc_Intfwd: 1664 case Lisp_Misc_Intfwd:
1646 case Lisp_Misc_Boolfwd: 1665 case Lisp_Misc_Boolfwd:
1647 case Lisp_Misc_Objfwd: 1666 case Lisp_Misc_Objfwd:
@@ -1658,8 +1677,6 @@ mark_object (objptr)
1658 break; 1677 break;
1659 1678
1660 case Lisp_Cons: 1679 case Lisp_Cons:
1661 case Lisp_Buffer_Local_Value:
1662 case Lisp_Some_Buffer_Local_Value:
1663 case Lisp_Overlay: 1680 case Lisp_Overlay:
1664 { 1681 {
1665 register struct Lisp_Cons *ptr = XCONS (obj); 1682 register struct Lisp_Cons *ptr = XCONS (obj);
@@ -1871,10 +1888,10 @@ gc_sweep ()
1871 1888
1872#ifndef standalone 1889#ifndef standalone
1873 /* Put all unmarked markers on free list. 1890 /* Put all unmarked markers on free list.
1874 Dechain each one first from the buffer it points into. */ 1891 Dechain each one first from the buffer it points into,
1892 but only if it's a real marker. */
1875 { 1893 {
1876 register struct marker_block *mblk; 1894 register struct marker_block *mblk;
1877 struct Lisp_Marker *tem1;
1878 register int lim = marker_block_index; 1895 register int lim = marker_block_index;
1879 register int num_free = 0, num_used = 0; 1896 register int num_free = 0, num_used = 0;
1880 1897
@@ -1884,27 +1901,44 @@ gc_sweep ()
1884 { 1901 {
1885 register int i; 1902 register int i;
1886 for (i = 0; i < lim; i++) 1903 for (i = 0; i < lim; i++)
1887 if (mblk->markers[i].type == Lisp_Misc_Marker) 1904 {
1888 { 1905 Lisp_Object *markword;
1889 if (!XMARKBIT (mblk->markers[i].u_marker.chain)) 1906 switch (mblk->markers[i].type)
1890 { 1907 {
1891 Lisp_Object tem; 1908 case Lisp_Misc_Marker:
1892 tem1 = &mblk->markers[i].u_marker; /* tem1 avoids Sun compiler bug */ 1909 markword = &mblk->markers[i].u_marker.chain;
1893 XSETMARKER (tem, tem1); 1910 break;
1894 unchain_marker (tem); 1911 case Lisp_Misc_Buffer_Local_Value:
1895 /* We could leave the type alone, since nobody checks it, 1912 case Lisp_Misc_Some_Buffer_Local_Value:
1896 but this might catch bugs faster. */ 1913 markword = &mblk->markers[i].u_buffer_local_value.car;
1897 mblk->markers[i].type = Lisp_Misc_Free; 1914 break;
1898 mblk->markers[i].u_free.chain = marker_free_list; 1915 default:
1899 marker_free_list = &mblk->markers[i]; 1916 markword = 0;
1900 num_free++; 1917 }
1901 } 1918 if (markword && !XMARKBIT (*markword))
1902 else 1919 {
1903 { 1920 Lisp_Object tem;
1904 num_used++; 1921 if (mblk->markers[i].type == Lisp_Misc_Marker)
1905 XUNMARK (mblk->markers[i].u_marker.chain); 1922 {
1906 } 1923 /* tem1 avoids Sun compiler bug */
1907 } 1924 struct Lisp_Marker *tem1 = &mblk->markers[i].u_marker;
1925 XSETMARKER (tem, tem1);
1926 unchain_marker (tem);
1927 }
1928 /* We could leave the type alone, since nobody checks it,
1929 but this might catch bugs faster. */
1930 mblk->markers[i].type = Lisp_Misc_Free;
1931 mblk->markers[i].u_free.chain = marker_free_list;
1932 marker_free_list = &mblk->markers[i];
1933 num_free++;
1934 }
1935 else
1936 {
1937 num_used++;
1938 if (markword)
1939 XUNMARK (*markword);
1940 }
1941 }
1908 lim = MARKER_BLOCK_SIZE; 1942 lim = MARKER_BLOCK_SIZE;
1909 } 1943 }
1910 1944