Mercurial > hg > xemacs-beta
comparison src/lisp.h @ 3092:141c2920ea48
[xemacs-hg @ 2005-11-25 01:41:31 by crestani]
Incremental Garbage Collector
author | crestani |
---|---|
date | Fri, 25 Nov 2005 01:42:08 +0000 |
parents | d9ca850d40de |
children | ad2f4ae9895b |
comparison
equal
deleted
inserted
replaced
3091:c22d8984148c | 3092:141c2920ea48 |
---|---|
1251 } \ | 1251 } \ |
1252 } while (0) | 1252 } while (0) |
1253 | 1253 |
1254 /* ------------------------ dynamic arrays ------------------- */ | 1254 /* ------------------------ dynamic arrays ------------------- */ |
1255 | 1255 |
1256 #ifndef NEW_GC | |
1256 #ifdef ERROR_CHECK_STRUCTURES | 1257 #ifdef ERROR_CHECK_STRUCTURES |
1257 #define Dynarr_declare(type) \ | 1258 #define Dynarr_declare(type) \ |
1258 type *base; \ | 1259 type *base; \ |
1259 int locked; \ | 1260 int locked; \ |
1260 int elsize; \ | 1261 int elsize; \ |
1378 Bytecount Dynarr_memory_usage (void *d, struct overhead_stats *stats); | 1379 Bytecount Dynarr_memory_usage (void *d, struct overhead_stats *stats); |
1379 #endif | 1380 #endif |
1380 | 1381 |
1381 void *stack_like_malloc (Bytecount size); | 1382 void *stack_like_malloc (Bytecount size); |
1382 void stack_like_free (void *val); | 1383 void stack_like_free (void *val); |
1384 #endif /* not NEW_GC */ | |
1383 | 1385 |
1384 /************************************************************************/ | 1386 /************************************************************************/ |
1385 /** Definitions of more complex types **/ | 1387 /** Definitions of more complex types **/ |
1386 /************************************************************************/ | 1388 /************************************************************************/ |
1387 | 1389 |
1464 typedef struct Lisp_Color_Instance Lisp_Color_Instance; /* objects-impl.h */ | 1466 typedef struct Lisp_Color_Instance Lisp_Color_Instance; /* objects-impl.h */ |
1465 typedef struct Lisp_Font_Instance Lisp_Font_Instance; /* objects-impl.h */ | 1467 typedef struct Lisp_Font_Instance Lisp_Font_Instance; /* objects-impl.h */ |
1466 typedef struct Lisp_Image_Instance Lisp_Image_Instance; /* glyphs.h */ | 1468 typedef struct Lisp_Image_Instance Lisp_Image_Instance; /* glyphs.h */ |
1467 typedef struct Lisp_Gui_Item Lisp_Gui_Item; | 1469 typedef struct Lisp_Gui_Item Lisp_Gui_Item; |
1468 | 1470 |
1471 #ifndef NEW_GC | |
1469 /* ------------------------------- */ | 1472 /* ------------------------------- */ |
1470 /* Dynarr typedefs */ | 1473 /* Dynarr typedefs */ |
1471 /* ------------------------------- */ | 1474 /* ------------------------------- */ |
1472 | 1475 |
1473 /* Dynarr typedefs -- basic types first */ | 1476 /* Dynarr typedefs -- basic types first */ |
1548 | 1551 |
1549 typedef struct | 1552 typedef struct |
1550 { | 1553 { |
1551 Dynarr_declare (struct console_type_entry); | 1554 Dynarr_declare (struct console_type_entry); |
1552 } console_type_entry_dynarr; | 1555 } console_type_entry_dynarr; |
1556 #endif /* not NEW_GC */ | |
1553 | 1557 |
1554 /* ------------------------------- */ | 1558 /* ------------------------------- */ |
1555 /* enum typedefs */ | 1559 /* enum typedefs */ |
1556 /* ------------------------------- */ | 1560 /* ------------------------------- */ |
1557 | 1561 |
1664 # include "lisp-disunion.h" | 1668 # include "lisp-disunion.h" |
1665 #endif /* !USE_UNION_TYPE */ | 1669 #endif /* !USE_UNION_TYPE */ |
1666 | 1670 |
1667 #define XPNTR(x) ((void *) XPNTRVAL(x)) | 1671 #define XPNTR(x) ((void *) XPNTRVAL(x)) |
1668 | 1672 |
1673 #ifndef NEW_GC | |
1669 /* WARNING WARNING WARNING. You must ensure on your own that proper | 1674 /* WARNING WARNING WARNING. You must ensure on your own that proper |
1670 GC protection is provided for the elements in this array. */ | 1675 GC protection is provided for the elements in this array. */ |
1671 typedef struct | 1676 typedef struct |
1672 { | 1677 { |
1673 Dynarr_declare (Lisp_Object); | 1678 Dynarr_declare (Lisp_Object); |
1675 | 1680 |
1676 typedef struct | 1681 typedef struct |
1677 { | 1682 { |
1678 Dynarr_declare (Lisp_Object *); | 1683 Dynarr_declare (Lisp_Object *); |
1679 } Lisp_Object_ptr_dynarr; | 1684 } Lisp_Object_ptr_dynarr; |
1685 #endif /* not NEW_GC */ | |
1680 | 1686 |
1681 /* Close your eyes now lest you vomit or spontaneously combust ... */ | 1687 /* Close your eyes now lest you vomit or spontaneously combust ... */ |
1682 | 1688 |
1683 #define HACKEQ_UNSAFE(obj1, obj2) \ | 1689 #define HACKEQ_UNSAFE(obj1, obj2) \ |
1684 (EQ (obj1, obj2) || (!POINTER_TYPE_P (XTYPE (obj1)) \ | 1690 (EQ (obj1, obj2) || (!POINTER_TYPE_P (XTYPE (obj1)) \ |
1704 /************************************************************************/ | 1710 /************************************************************************/ |
1705 | 1711 |
1706 #include "lrecord.h" | 1712 #include "lrecord.h" |
1707 | 1713 |
1708 BEGIN_C_DECLS | 1714 BEGIN_C_DECLS |
1715 | |
1716 #ifdef NEW_GC | |
1717 /* ------------------------ dynamic arrays ------------------- */ | |
1718 | |
1719 #ifdef ERROR_CHECK_STRUCTURES | |
1720 #define Dynarr_declare(type) \ | |
1721 struct lrecord_header header; \ | |
1722 type *base; \ | |
1723 const struct lrecord_implementation *lisp_imp; \ | |
1724 int locked; \ | |
1725 int elsize; \ | |
1726 int cur; \ | |
1727 int largest; \ | |
1728 int max | |
1729 #else | |
1730 #define Dynarr_declare(type) \ | |
1731 struct lrecord_header header; \ | |
1732 type *base; \ | |
1733 const struct lrecord_implementation *lisp_imp; \ | |
1734 int elsize; \ | |
1735 int cur; \ | |
1736 int largest; \ | |
1737 int max | |
1738 #endif /* ERROR_CHECK_STRUCTURES */ | |
1739 | |
1740 typedef struct dynarr | |
1741 { | |
1742 Dynarr_declare (void); | |
1743 } Dynarr; | |
1744 | |
1745 MODULE_API void *Dynarr_newf (int elsize); | |
1746 MODULE_API void Dynarr_resize (void *dy, Elemcount size); | |
1747 MODULE_API void Dynarr_insert_many (void *d, const void *el, int len, int start); | |
1748 MODULE_API void Dynarr_delete_many (void *d, int start, int len); | |
1749 MODULE_API void Dynarr_free (void *d); | |
1750 | |
1751 MODULE_API void *Dynarr_lisp_newf (int elsize, | |
1752 const struct lrecord_implementation | |
1753 *dynarr_imp, | |
1754 const struct lrecord_implementation *imp); | |
1755 | |
1756 #define Dynarr_lisp_new(type, dynarr_imp, imp) \ | |
1757 ((type##_dynarr *) Dynarr_lisp_newf (sizeof (type), dynarr_imp, imp)) | |
1758 #define Dynarr_lisp_new2(dynarr_type, type, dynarr_imp, imp) \ | |
1759 ((dynarr_type *) Dynarr_lisp_newf (sizeof (type)), dynarr_imp, imp) | |
1760 #define Dynarr_new(type) ((type##_dynarr *) Dynarr_newf (sizeof (type))) | |
1761 #define Dynarr_new2(dynarr_type, type) \ | |
1762 ((dynarr_type *) Dynarr_newf (sizeof (type))) | |
1763 #define Dynarr_at(d, pos) ((d)->base[pos]) | |
1764 #define Dynarr_atp(d, pos) (&Dynarr_at (d, pos)) | |
1765 #define Dynarr_begin(d) Dynarr_atp (d, 0) | |
1766 #define Dynarr_end(d) Dynarr_atp (d, Dynarr_length (d) - 1) | |
1767 #define Dynarr_sizeof(d) ((d)->cur * (d)->elsize) | |
1768 | |
1769 #ifdef ERROR_CHECK_STRUCTURES | |
1770 DECLARE_INLINE_HEADER ( | |
1771 Dynarr * | |
1772 Dynarr_verify_1 (void *d, const Ascbyte *file, int line) | |
1773 ) | |
1774 { | |
1775 Dynarr *dy = (Dynarr *) d; | |
1776 assert_at_line (dy->cur >= 0 && dy->cur <= dy->largest && | |
1777 dy->largest <= dy->max, file, line); | |
1778 return dy; | |
1779 } | |
1780 | |
1781 DECLARE_INLINE_HEADER ( | |
1782 Dynarr * | |
1783 Dynarr_verify_mod_1 (void *d, const Ascbyte *file, int line) | |
1784 ) | |
1785 { | |
1786 Dynarr *dy = (Dynarr *) d; | |
1787 assert_at_line (!dy->locked, file, line); | |
1788 assert_at_line (dy->cur >= 0 && dy->cur <= dy->largest && | |
1789 dy->largest <= dy->max, file, line); | |
1790 return dy; | |
1791 } | |
1792 | |
1793 #define Dynarr_verify(d) Dynarr_verify_1 (d, __FILE__, __LINE__) | |
1794 #define Dynarr_verify_mod(d) Dynarr_verify_mod_1 (d, __FILE__, __LINE__) | |
1795 #define Dynarr_lock(d) (Dynarr_verify_mod (d)->locked = 1) | |
1796 #define Dynarr_unlock(d) ((d)->locked = 0) | |
1797 #else | |
1798 #define Dynarr_verify(d) (d) | |
1799 #define Dynarr_verify_mod(d) (d) | |
1800 #define Dynarr_lock(d) | |
1801 #define Dynarr_unlock(d) | |
1802 #endif /* ERROR_CHECK_STRUCTURES */ | |
1803 | |
1804 #define Dynarr_length(d) (Dynarr_verify (d)->cur) | |
1805 #define Dynarr_largest(d) (Dynarr_verify (d)->largest) | |
1806 #define Dynarr_reset(d) (Dynarr_verify_mod (d)->cur = 0) | |
1807 #define Dynarr_add_many(d, el, len) Dynarr_insert_many (d, el, len, (d)->cur) | |
1808 #define Dynarr_insert_many_at_start(d, el, len) \ | |
1809 Dynarr_insert_many (d, el, len, 0) | |
1810 #define Dynarr_add_literal_string(d, s) Dynarr_add_many (d, s, sizeof (s) - 1) | |
1811 #define Dynarr_add_lisp_string(d, s, codesys) \ | |
1812 do { \ | |
1813 Lisp_Object dyna_ls_s = (s); \ | |
1814 Lisp_Object dyna_ls_cs = (codesys); \ | |
1815 Extbyte *dyna_ls_eb; \ | |
1816 Bytecount dyna_ls_bc; \ | |
1817 \ | |
1818 LISP_STRING_TO_SIZED_EXTERNAL (dyna_ls_s, dyna_ls_eb, \ | |
1819 dyna_ls_bc, dyna_ls_cs); \ | |
1820 Dynarr_add_many (d, dyna_ls_eb, dyna_ls_bc); \ | |
1821 } while (0) | |
1822 | |
1823 #if 1 | |
1824 #define Dynarr_add(d, el) \ | |
1825 do { \ | |
1826 if (Dynarr_verify_mod (d)->cur >= (d)->max) \ | |
1827 Dynarr_resize ((d), (d)->cur+1); \ | |
1828 ((d)->base)[(d)->cur] = (el); \ | |
1829 \ | |
1830 if ((d)->lisp_imp) \ | |
1831 set_lheader_implementation \ | |
1832 ((struct lrecord_header *)&(((d)->base)[(d)->cur]), \ | |
1833 (d)->lisp_imp); \ | |
1834 \ | |
1835 (d)->cur++; \ | |
1836 if ((d)->cur > (d)->largest) \ | |
1837 (d)->largest = (d)->cur; \ | |
1838 } while (0) | |
1839 #else | |
1840 #define Dynarr_add(d, el) ( \ | |
1841 Dynarr_verify_mod (d)->cur >= (d)->max ? Dynarr_resize ((d), (d)->cur+1) : \ | |
1842 (void) 0, \ | |
1843 ((d)->base)[(d)->cur++] = (el), \ | |
1844 (d)->cur > (d)->largest ? (d)->largest = (d)->cur : (int) 0) | |
1845 #endif | |
1846 | |
1847 | |
1848 /* The following defines will get you into real trouble if you aren't | |
1849 careful. But they can save a lot of execution time when used wisely. */ | |
1850 #define Dynarr_increment(d) (Dynarr_verify_mod (d)->cur++) | |
1851 #define Dynarr_set_size(d, n) (Dynarr_verify_mod (d)->cur = n) | |
1852 | |
1853 #define Dynarr_pop(d) \ | |
1854 (assert ((d)->cur > 0), Dynarr_verify_mod (d)->cur--, \ | |
1855 Dynarr_at (d, (d)->cur)) | |
1856 #define Dynarr_delete(d, i) Dynarr_delete_many (d, i, 1) | |
1857 #define Dynarr_delete_by_pointer(d, p) \ | |
1858 Dynarr_delete_many (d, (p) - ((d)->base), 1) | |
1859 | |
1860 #define Dynarr_delete_object(d, el) \ | |
1861 do \ | |
1862 { \ | |
1863 REGISTER int i; \ | |
1864 for (i = Dynarr_length (d) - 1; i >= 0; i--) \ | |
1865 { \ | |
1866 if (el == Dynarr_at (d, i)) \ | |
1867 Dynarr_delete_many (d, i, 1); \ | |
1868 } \ | |
1869 } while (0) | |
1870 | |
1871 #ifdef MEMORY_USAGE_STATS | |
1872 struct overhead_stats; | |
1873 Bytecount Dynarr_memory_usage (void *d, struct overhead_stats *stats); | |
1874 #endif | |
1875 | |
1876 void *stack_like_malloc (Bytecount size); | |
1877 void stack_like_free (void *val); | |
1878 | |
1879 /* ------------------------------- */ | |
1880 /* Dynarr typedefs */ | |
1881 /* ------------------------------- */ | |
1882 | |
1883 /* Dynarr typedefs -- basic types first */ | |
1884 | |
1885 typedef struct | |
1886 { | |
1887 Dynarr_declare (Ibyte); | |
1888 } Ibyte_dynarr; | |
1889 | |
1890 typedef struct | |
1891 { | |
1892 Dynarr_declare (Extbyte); | |
1893 } Extbyte_dynarr; | |
1894 | |
1895 typedef struct | |
1896 { | |
1897 Dynarr_declare (Ichar); | |
1898 } Ichar_dynarr; | |
1899 | |
1900 typedef struct | |
1901 { | |
1902 Dynarr_declare (char); | |
1903 } char_dynarr; | |
1904 | |
1905 typedef struct | |
1906 { | |
1907 Dynarr_declare (char *); | |
1908 } char_ptr_dynarr; | |
1909 | |
1910 typedef unsigned char unsigned_char; | |
1911 typedef struct | |
1912 { | |
1913 Dynarr_declare (unsigned char); | |
1914 } unsigned_char_dynarr; | |
1915 | |
1916 typedef unsigned long unsigned_long; | |
1917 typedef struct | |
1918 { | |
1919 Dynarr_declare (unsigned long); | |
1920 } unsigned_long_dynarr; | |
1921 | |
1922 typedef struct | |
1923 { | |
1924 Dynarr_declare (int); | |
1925 } int_dynarr; | |
1926 | |
1927 typedef struct | |
1928 { | |
1929 Dynarr_declare (Charbpos); | |
1930 } Charbpos_dynarr; | |
1931 | |
1932 typedef struct | |
1933 { | |
1934 Dynarr_declare (Bytebpos); | |
1935 } Bytebpos_dynarr; | |
1936 | |
1937 typedef struct | |
1938 { | |
1939 Dynarr_declare (Charcount); | |
1940 } Charcount_dynarr; | |
1941 | |
1942 typedef struct | |
1943 { | |
1944 Dynarr_declare (Bytecount); | |
1945 } Bytecount_dynarr; | |
1946 | |
1947 /* Dynarr typedefs -- more complex types */ | |
1948 | |
1949 typedef struct | |
1950 { | |
1951 Dynarr_declare (struct face_cachel); | |
1952 } face_cachel_dynarr; | |
1953 | |
1954 DECLARE_LRECORD (face_cachel_dynarr, face_cachel_dynarr); | |
1955 #define XFACE_CACHEL_DYNARR(x) \ | |
1956 XRECORD (x, face_cachel_dynarr, face_cachel_dynarr) | |
1957 #define wrap_face_cachel_dynarr(p) wrap_record (p, face_cachel_dynarr) | |
1958 #define FACE_CACHEL_DYNARRP(x) RECORDP (x, face_cachel_dynarr) | |
1959 #define CHECK_FACE_CACHEL_DYNARR(x) CHECK_RECORD (x, face_cachel_dynarr) | |
1960 #define CONCHECK_FACE_CACHEL_DYNARR(x) CONCHECK_RECORD (x, face_cachel_dynarr) | |
1961 | |
1962 typedef struct | |
1963 { | |
1964 Dynarr_declare (struct glyph_cachel); | |
1965 } glyph_cachel_dynarr; | |
1966 | |
1967 DECLARE_LRECORD (glyph_cachel_dynarr, glyph_cachel_dynarr); | |
1968 #define XGLYPH_CACHEL_DYNARR(x) \ | |
1969 XRECORD (x, glyph_cachel_dynarr, glyph_cachel_dynarr) | |
1970 #define wrap_glyph_cachel_dynarr(p) wrap_record (p, glyph_cachel_dynarr) | |
1971 #define GLYPH_CACHEL_DYNARRP(x) RECORDP (x, glyph_cachel_dynarr) | |
1972 #define CHECK_GLYPH_CACHEL_DYNARR(x) CHECK_RECORD (x, glyph_cachel_dynarr) | |
1973 #define CONCHECK_GLYPH_CACHEL_DYNARR(x) \ | |
1974 CONCHECK_RECORD (x, glyph_cachel_dynarr) | |
1975 | |
1976 typedef struct | |
1977 { | |
1978 Dynarr_declare (struct console_type_entry); | |
1979 } console_type_entry_dynarr; | |
1980 | |
1981 /* WARNING WARNING WARNING. You must ensure on your own that proper | |
1982 GC protection is provided for the elements in this array. */ | |
1983 typedef struct | |
1984 { | |
1985 Dynarr_declare (Lisp_Object); | |
1986 } Lisp_Object_dynarr; | |
1987 | |
1988 typedef struct | |
1989 { | |
1990 Dynarr_declare (Lisp_Object *); | |
1991 } Lisp_Object_ptr_dynarr; | |
1992 #endif /* NEW_GC */ | |
1709 | 1993 |
1710 /*------------------------------ unbound -------------------------------*/ | 1994 /*------------------------------ unbound -------------------------------*/ |
1711 | 1995 |
1712 /* Qunbound is a special Lisp_Object (actually of type | 1996 /* Qunbound is a special Lisp_Object (actually of type |
1713 symbol-value-forward), that can never be visible to | 1997 symbol-value-forward), that can never be visible to |
2279 if (! NILP (CTL_hare)) \ | 2563 if (! NILP (CTL_hare)) \ |
2280 signal_malformed_list_error (CTL_list); \ | 2564 signal_malformed_list_error (CTL_list); \ |
2281 } while (0) | 2565 } while (0) |
2282 | 2566 |
2283 /*------------------------------ string --------------------------------*/ | 2567 /*------------------------------ string --------------------------------*/ |
2568 | |
2569 #ifdef NEW_GC | |
2570 struct Lisp_String_Direct_Data | |
2571 { | |
2572 struct lrecord_header header; | |
2573 Bytecount size; | |
2574 Ibyte data[1]; | |
2575 }; | |
2576 typedef struct Lisp_String_Direct_Data Lisp_String_Direct_Data; | |
2577 | |
2578 DECLARE_MODULE_API_LRECORD (string_direct_data, Lisp_String_Direct_Data); | |
2579 #define XSTRING_DIRECT_DATA(x) \ | |
2580 XRECORD (x, string_direct_data, Lisp_String_Direct_Data) | |
2581 #define wrap_string_direct_data(p) wrap_record (p, string_direct_data) | |
2582 #define STRING_DIRECT_DATAP(x) RECORDP (x, string_direct_data) | |
2583 #define CHECK_STRING_DIRECT_DATA(x) CHECK_RECORD (x, string_direct_data) | |
2584 #define CONCHECK_STRING_DIRECT_DATA(x) CONCHECK_RECORD (x, string_direct_data) | |
2585 | |
2586 #define XSTRING_DIRECT_DATA_SIZE(x) XSTRING_DIRECT_DATA (x)->size | |
2587 #define XSTRING_DIRECT_DATA_DATA(x) XSTRING_DIRECT_DATA (x)->data | |
2588 | |
2589 | |
2590 struct Lisp_String_Indirect_Data | |
2591 { | |
2592 struct lrecord_header header; | |
2593 Bytecount size; | |
2594 Ibyte *data; | |
2595 }; | |
2596 typedef struct Lisp_String_Indirect_Data Lisp_String_Indirect_Data; | |
2597 | |
2598 DECLARE_MODULE_API_LRECORD (string_indirect_data, Lisp_String_Indirect_Data); | |
2599 #define XSTRING_INDIRECT_DATA(x) \ | |
2600 XRECORD (x, string_indirect_data, Lisp_String_Indirect_Data) | |
2601 #define wrap_string_indirect_data(p) wrap_record (p, string_indirect_data) | |
2602 #define STRING_INDIRECT_DATAP(x) RECORDP (x, string_indirect_data) | |
2603 #define CHECK_STRING_INDIRECT_DATA(x) CHECK_RECORD (x, string_indirect_data) | |
2604 #define CONCHECK_STRING_INDIRECT_DATA(x) \ | |
2605 CONCHECK_RECORD (x, string_indirect_data) | |
2606 | |
2607 #define XSTRING_INDIRECT_DATA_SIZE(x) XSTRING_INDIRECT_DATA (x)->size | |
2608 #define XSTRING_INDIRECT_DATA_DATA(x) XSTRING_INDIRECT_DATA (x)->data | |
2609 | |
2610 | |
2611 #define XSTRING_DATA_SIZE(s) ((s)->indirect)? \ | |
2612 XSTRING_INDIRECT_DATA_SIZE ((s)->data_object): \ | |
2613 XSTRING_DIRECT_DATA_SIZE ((s)->data_object) | |
2614 #define XSTRING_DATA_DATA(s) ((s)->indirect)? \ | |
2615 XSTRING_INDIRECT_DATA_DATA ((s)->data_object): \ | |
2616 XSTRING_DIRECT_DATA_DATA ((s)->data_object) | |
2617 | |
2618 #define XSET_STRING_DATA_SIZE(s, len) \ | |
2619 if ((s)->indirect) \ | |
2620 XSTRING_INDIRECT_DATA_SIZE ((s)->data_object) = len; \ | |
2621 else \ | |
2622 XSTRING_DIRECT_DATA_SIZE ((s)->data_object) = len | |
2623 #define XSET_STRING_DATA_DATA(s, ptr) \ | |
2624 if ((s)->indirect) \ | |
2625 XSTRING_INDIRECT_DATA_DATA ((s)->data_object) = ptr; \ | |
2626 else \ | |
2627 XSTRING_DIRECT_DATA_DATA ((s)->data_object) = ptr | |
2628 #endif /* NEW_GC */ | |
2284 | 2629 |
2285 struct Lisp_String | 2630 struct Lisp_String |
2286 { | 2631 { |
2287 union | 2632 union |
2288 { | 2633 { |
2306 (byte_ascii_p) */ | 2651 (byte_ascii_p) */ |
2307 unsigned int ascii_begin :21; | 2652 unsigned int ascii_begin :21; |
2308 #endif /* not MC_ALLOC */ | 2653 #endif /* not MC_ALLOC */ |
2309 } v; | 2654 } v; |
2310 } u; | 2655 } u; |
2656 #ifdef NEW_GC | |
2657 int indirect; | |
2658 Lisp_Object data_object; | |
2659 #else /* not NEW_GC */ | |
2311 Bytecount size_; | 2660 Bytecount size_; |
2312 Ibyte *data_; | 2661 Ibyte *data_; |
2662 #endif /* not NEW_GC */ | |
2313 Lisp_Object plist; | 2663 Lisp_Object plist; |
2314 }; | 2664 }; |
2315 typedef struct Lisp_String Lisp_String; | 2665 typedef struct Lisp_String Lisp_String; |
2316 | 2666 |
2317 #ifdef MC_ALLOC | 2667 #ifdef MC_ALLOC |
2330 /* Most basic macros for strings -- basically just accessing or setting | 2680 /* Most basic macros for strings -- basically just accessing or setting |
2331 fields -- are here. Everything else is in text.h, since they depend on | 2681 fields -- are here. Everything else is in text.h, since they depend on |
2332 stuff there. */ | 2682 stuff there. */ |
2333 | 2683 |
2334 /* Operations on Lisp_String *'s; only ones left */ | 2684 /* Operations on Lisp_String *'s; only ones left */ |
2685 #ifdef NEW_GC | |
2686 #define set_lispstringp_indirect(s) ((s)->indirect = 1) | |
2687 #define set_lispstringp_length(s, len) XSET_STRING_DATA_SIZE (s, len) | |
2688 #define set_lispstringp_data(s, ptr) XSET_STRING_DATA_DATA (s, ptr) | |
2689 #else /* not NEW_GC */ | |
2335 #define set_lispstringp_length(s, len) ((void) ((s)->size_ = (len))) | 2690 #define set_lispstringp_length(s, len) ((void) ((s)->size_ = (len))) |
2336 #define set_lispstringp_data(s, ptr) ((void) ((s)->data_ = (ptr))) | 2691 #define set_lispstringp_data(s, ptr) ((void) ((s)->data_ = (ptr))) |
2692 #endif /* not NEW_GC */ | |
2337 | 2693 |
2338 /* Operations on strings as Lisp_Objects. Don't manipulate Lisp_String *'s | 2694 /* Operations on strings as Lisp_Objects. Don't manipulate Lisp_String *'s |
2339 in any new code. */ | 2695 in any new code. */ |
2696 #ifdef NEW_GC | |
2697 #define STRING_DATA_OBJECT(s) ((s)->data_object) | |
2698 #define XSTRING_DATA_OBJECT(s) (STRING_DATA_OBJECT (XSTRING (s))) | |
2699 #define XSTRING_LENGTH(s) (XSTRING_DATA_SIZE (XSTRING (s))) | |
2700 #else /* not NEW_GC */ | |
2340 #define XSTRING_LENGTH(s) (XSTRING (s)->size_) | 2701 #define XSTRING_LENGTH(s) (XSTRING (s)->size_) |
2702 #endif /* not NEW_GC */ | |
2341 #define XSTRING_PLIST(s) (XSTRING (s)->plist) | 2703 #define XSTRING_PLIST(s) (XSTRING (s)->plist) |
2704 #ifdef NEW_GC | |
2705 #define XSTRING_DATA(s) (XSTRING_DATA_DATA (XSTRING (s))) | |
2706 #else /* not NEW_GC */ | |
2342 #define XSTRING_DATA(s) (XSTRING (s)->data_ + 0) | 2707 #define XSTRING_DATA(s) (XSTRING (s)->data_ + 0) |
2708 #endif /* not NEW_GC */ | |
2343 #define XSTRING_ASCII_BEGIN(s) (XSTRING (s)->u.v.ascii_begin + 0) | 2709 #define XSTRING_ASCII_BEGIN(s) (XSTRING (s)->u.v.ascii_begin + 0) |
2344 #define XSET_STRING_LENGTH(s, ptr) set_lispstringp_length (XSTRING (s), ptr) | 2710 #define XSET_STRING_LENGTH(s, ptr) set_lispstringp_length (XSTRING (s), ptr) |
2345 #define XSET_STRING_DATA(s, ptr) set_lispstringp_data (XSTRING (s), ptr) | 2711 #define XSET_STRING_DATA(s, ptr) set_lispstringp_data (XSTRING (s), ptr) |
2346 /* WARNING: If you modify an existing string, you must call | 2712 /* WARNING: If you modify an existing string, you must call |
2347 bump_string_modiff() afterwards. */ | 2713 bump_string_modiff() afterwards. */ |
3622 UNGCPRO; \ | 3988 UNGCPRO; \ |
3623 RETURN_SANS_WARNINGS ret_ungc_val; \ | 3989 RETURN_SANS_WARNINGS ret_ungc_val; \ |
3624 } while (0) | 3990 } while (0) |
3625 | 3991 |
3626 extern Lisp_Object_ptr_dynarr *staticpros; | 3992 extern Lisp_Object_ptr_dynarr *staticpros; |
3627 | 3993 extern Lisp_Object_ptr_dynarr *staticpros_nodump; |
3628 #ifdef DEBUG_XEMACS | 3994 #ifdef DEBUG_XEMACS |
3629 | 3995 |
3630 /* Help debug crashes gc-marking a staticpro'ed object. */ | 3996 /* Help debug crashes gc-marking a staticpro'ed object. */ |
3631 | 3997 |
3632 MODULE_API void staticpro_1 (Lisp_Object *, Ascbyte *); | 3998 MODULE_API void staticpro_1 (Lisp_Object *, Ascbyte *); |
3732 MODULE_API Lisp_Object vector2 (Lisp_Object, Lisp_Object); | 4098 MODULE_API Lisp_Object vector2 (Lisp_Object, Lisp_Object); |
3733 MODULE_API Lisp_Object vector3 (Lisp_Object, Lisp_Object, Lisp_Object); | 4099 MODULE_API Lisp_Object vector3 (Lisp_Object, Lisp_Object, Lisp_Object); |
3734 Lisp_Object make_bit_vector (Elemcount, Lisp_Object); | 4100 Lisp_Object make_bit_vector (Elemcount, Lisp_Object); |
3735 Lisp_Object make_bit_vector_from_byte_vector (unsigned char *, Elemcount); | 4101 Lisp_Object make_bit_vector_from_byte_vector (unsigned char *, Elemcount); |
3736 Lisp_Object noseeum_make_marker (void); | 4102 Lisp_Object noseeum_make_marker (void); |
4103 #ifndef NEW_GC | |
3737 void garbage_collect_1 (void); | 4104 void garbage_collect_1 (void); |
4105 #endif /* not NEW_GC */ | |
3738 MODULE_API Lisp_Object acons (Lisp_Object, Lisp_Object, Lisp_Object); | 4106 MODULE_API Lisp_Object acons (Lisp_Object, Lisp_Object, Lisp_Object); |
3739 MODULE_API Lisp_Object cons3 (Lisp_Object, Lisp_Object, Lisp_Object); | 4107 MODULE_API Lisp_Object cons3 (Lisp_Object, Lisp_Object, Lisp_Object); |
3740 MODULE_API Lisp_Object list1 (Lisp_Object); | 4108 MODULE_API Lisp_Object list1 (Lisp_Object); |
3741 MODULE_API Lisp_Object list2 (Lisp_Object, Lisp_Object); | 4109 MODULE_API Lisp_Object list2 (Lisp_Object, Lisp_Object); |
3742 MODULE_API Lisp_Object list3 (Lisp_Object, Lisp_Object, Lisp_Object); | 4110 MODULE_API Lisp_Object list3 (Lisp_Object, Lisp_Object, Lisp_Object); |
3747 MODULE_API Lisp_Object list6 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, | 4115 MODULE_API Lisp_Object list6 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, |
3748 Lisp_Object, Lisp_Object); | 4116 Lisp_Object, Lisp_Object); |
3749 DECLARE_DOESNT_RETURN (memory_full (void)); | 4117 DECLARE_DOESNT_RETURN (memory_full (void)); |
3750 void disksave_object_finalization (void); | 4118 void disksave_object_finalization (void); |
3751 extern int purify_flag; | 4119 extern int purify_flag; |
4120 #ifndef NEW_GC | |
3752 extern EMACS_INT gc_generation_number[1]; | 4121 extern EMACS_INT gc_generation_number[1]; |
4122 #endif /* not NEW_GC */ | |
3753 int c_readonly (Lisp_Object); | 4123 int c_readonly (Lisp_Object); |
3754 int lisp_readonly (Lisp_Object); | 4124 int lisp_readonly (Lisp_Object); |
3755 MODULE_API void copy_lisp_object (Lisp_Object dst, Lisp_Object src); | 4125 MODULE_API void copy_lisp_object (Lisp_Object dst, Lisp_Object src); |
3756 MODULE_API Lisp_Object build_intstring (const Ibyte *); | 4126 MODULE_API Lisp_Object build_intstring (const Ibyte *); |
3757 MODULE_API Lisp_Object build_string (const CIbyte *); | 4127 MODULE_API Lisp_Object build_string (const CIbyte *); |
3768 void free_list (Lisp_Object); | 4138 void free_list (Lisp_Object); |
3769 void free_alist (Lisp_Object); | 4139 void free_alist (Lisp_Object); |
3770 void free_marker (Lisp_Object); | 4140 void free_marker (Lisp_Object); |
3771 int object_dead_p (Lisp_Object); | 4141 int object_dead_p (Lisp_Object); |
3772 void mark_object (Lisp_Object obj); | 4142 void mark_object (Lisp_Object obj); |
4143 #ifndef NEW_GC | |
3773 #ifdef USE_KKCC | 4144 #ifdef USE_KKCC |
3774 #ifdef DEBUG_XEMACS | 4145 #ifdef DEBUG_XEMACS |
3775 void kkcc_gc_stack_push_lisp_object_1 (Lisp_Object obj, int level, int pos); | 4146 void kkcc_gc_stack_push_lisp_object_1 (Lisp_Object obj, int level, int pos); |
3776 #define kkcc_gc_stack_push_lisp_object(obj, level, pos) \ | 4147 #define kkcc_gc_stack_push_lisp_object(obj, level, pos) \ |
3777 kkcc_gc_stack_push_lisp_object_1 (obj, level, pos) | 4148 kkcc_gc_stack_push_lisp_object_1 (obj, level, pos) |
3781 #define kkcc_gc_stack_push_lisp_object(obj, level, pos) \ | 4152 #define kkcc_gc_stack_push_lisp_object(obj, level, pos) \ |
3782 kkcc_gc_stack_push_lisp_object_1 (obj) | 4153 kkcc_gc_stack_push_lisp_object_1 (obj) |
3783 #define kkcc_backtrace() | 4154 #define kkcc_backtrace() |
3784 #endif | 4155 #endif |
3785 #endif /* USE_KKCC */ | 4156 #endif /* USE_KKCC */ |
4157 #endif /* not NEW_GC */ | |
3786 int marked_p (Lisp_Object obj); | 4158 int marked_p (Lisp_Object obj); |
3787 extern int funcall_allocation_flag; | 4159 extern int funcall_allocation_flag; |
3788 extern int need_to_garbage_collect; | 4160 extern int need_to_garbage_collect; |
3789 extern MODULE_API int need_to_check_c_alloca; | 4161 extern MODULE_API int need_to_check_c_alloca; |
3790 extern int need_to_signal_post_gc; | 4162 extern int need_to_signal_post_gc; |