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;