diff options
| author | Karl Heuer | 1994-11-11 07:34:14 +0000 |
|---|---|---|
| committer | Karl Heuer | 1994-11-11 07:34:14 +0000 |
| commit | 465edf35eb2be879cf5820f6bd97a07421bb069f (patch) | |
| tree | a95f5d171c7c54aa30afeac63bcf719f5334f43e | |
| parent | fdc6e51676c4e9b498b7ddc238e9860d4da13fd6 (diff) | |
| download | emacs-465edf35eb2be879cf5820f6bd97a07421bb069f.tar.gz emacs-465edf35eb2be879cf5820f6bd97a07421bb069f.zip | |
(mark_object): New code to handle buffer-local substructure.
(gc_sweep): Generalize marker code to handle other substructures.
| -rw-r--r-- | src/alloc.c | 84 |
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 | ||