Mercurial > emacs
comparison src/alloc.c @ 9893:8421d09f2afe
(mark_object): New code to handle buffer-local substructure.
(gc_sweep): Generalize marker code to handle other substructures.
| author | Karl Heuer <kwzh@gnu.org> |
|---|---|
| date | Fri, 11 Nov 1994 07:34:14 +0000 |
| parents | a40af805e036 |
| children | 2a9f99682f82 |
comparison
equal
deleted
inserted
replaced
| 9892:beb59716f299 | 9893:8421d09f2afe |
|---|---|
| 1640 /* DO NOT mark thru the marker's chain. | 1640 /* DO NOT mark thru the marker's chain. |
| 1641 The buffer's markers chain does not preserve markers from gc; | 1641 The buffer's markers chain does not preserve markers from gc; |
| 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: |
| 1648 case Lisp_Misc_Buffer_Objfwd: | 1667 case Lisp_Misc_Buffer_Objfwd: |
| 1649 /* Don't bother with Lisp_Buffer_Objfwd, | 1668 /* Don't bother with Lisp_Buffer_Objfwd, |
| 1656 abort (); | 1675 abort (); |
| 1657 } | 1676 } |
| 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); |
| 1666 if (XMARKBIT (ptr->car)) break; | 1683 if (XMARKBIT (ptr->car)) break; |
| 1667 XMARK (ptr->car); | 1684 XMARK (ptr->car); |
| 1869 total_free_symbols = num_free; | 1886 total_free_symbols = num_free; |
| 1870 } | 1887 } |
| 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 |
| 1881 marker_free_list = 0; | 1898 marker_free_list = 0; |
| 1882 | 1899 |
| 1883 for (mblk = marker_block; mblk; mblk = mblk->next) | 1900 for (mblk = marker_block; mblk; mblk = mblk->next) |
| 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 |
| 1911 total_markers = num_used; | 1945 total_markers = num_used; |
| 1912 total_free_markers = num_free; | 1946 total_free_markers = num_free; |
