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;