1 /* Fundamental definitions for XEmacs Lisp interpreter -- union objects.
2 Copyright (C) 1985, 1986, 1987, 1992, 1993, 1994
3 Free Software Foundation, Inc.
5 This file is part of XEmacs.
7 XEmacs is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 2, or (at your option) any
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with XEmacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 /* Divergent from FSF. */
24 /* Definition of Lisp_Object type as a union.
25 The declaration order of the objects within the struct members
26 of the union is dependent on ENDIAN-ness and USE_MINIMAL_TAGBITS.
27 See lisp-disunion.h for more details. */
32 /* if non-valbits are at lower addresses */
33 #if defined(WORDS_BIGENDIAN) == defined(USE_MINIMAL_TAGBITS)
36 EMACS_UINT val : VALBITS;
38 unsigned int markbit: GCMARKBITS;
40 enum_field (Lisp_Type) type : GCTYPEBITS;
45 signed EMACS_INT val : INT_VALBITS;
46 unsigned int bits : INT_GCBITS;
51 EMACS_UINT val : INT_VALBITS;
52 unsigned int bits : INT_GCBITS;
54 #else /* non-valbits are at higher addresses */
57 enum_field (Lisp_Type) type : GCTYPEBITS;
59 unsigned int markbit: GCMARKBITS;
61 EMACS_UINT val : VALBITS;
66 unsigned int bits : INT_GCBITS;
67 signed EMACS_INT val : INT_VALBITS;
72 unsigned int bits : INT_GCBITS;
73 EMACS_UINT val : INT_VALBITS;
76 #endif /* non-valbits are at higher addresses */
81 /* This was formerly declared 'void *v' etc. but that causes
82 GCC to accept any (yes, any) pointer as the argument of
83 a function declared to accept a Lisp_Object. */
84 struct nosuchstruct *v;
85 CONST struct nosuchstruct *cv;
89 #define XCHARVAL(x) ((x).gu.val)
91 #ifdef USE_MINIMAL_TAGBITS
92 # define XSETINT(var, value) do { \
93 Lisp_Object *_xzx = &(var); \
94 _xzx->s.val = (value); \
97 # define XSETCHAR(var, value) do { \
98 Lisp_Object *_xzx = &(var); \
99 _xzx->gu.val = (EMACS_UINT) (value); \
100 _xzx->gu.type = Lisp_Type_Char; \
102 # define XSETOBJ(var, vartype, value) \
103 ((void) ((var).ui = (EMACS_UINT) (value)))
104 # define XPNTRVAL(x) ((x).ui)
105 #else /* ! USE_MINIMAL_TAGBITS */
106 # define XSETOBJ(var, vartype, value) do { \
107 Lisp_Object *_xzx = &(var); \
108 _xzx->gu.val = (EMACS_UINT) (value); \
109 _xzx->gu.type = (vartype); \
110 _xzx->gu.markbit = 0; \
112 # define XSETINT(var, value) XSETOBJ (var, Lisp_Type_Int, value)
113 # define XSETCHAR(var, value) XSETOBJ (var, Lisp_Type_Char, value)
114 # define XPNTRVAL(x) ((x).gu.val)
115 #endif /* ! USE_MINIMAL_TAGBITS */
117 INLINE Lisp_Object make_int (EMACS_INT val);
119 make_int (EMACS_INT val)
126 INLINE Lisp_Object make_char (Emchar val);
128 make_char (Emchar val)
135 extern Lisp_Object Qnull_pointer, Qzero;
137 #define XREALINT(x) ((x).s.val)
138 #define XUINT(x) ((x).u.val)
139 #define XTYPE(x) ((x).gu.type)
140 #define XGCTYPE(x) XTYPE (x)
141 #define EQ(x,y) ((x).v == (y).v)
143 #ifdef USE_MINIMAL_TAGBITS
144 #define INTP(x) ((x).s.bits)
145 #define GC_EQ(x,y) EQ (x, y)
147 #define INTP(x) (XTYPE(x) == Lisp_Type_Int)
148 #define GC_EQ(x,y) ((x).gu.val == (y).gu.val && XTYPE (x) == XTYPE (y))
152 /* XMARKBIT accesses the markbit. Markbits are used only in
153 particular slots of particular structure types. Other markbits are
154 always zero. Outside of garbage collection, all mark bits are
156 # define XMARKBIT(x) ((x).gu.markbit)
157 # define XMARK(x) ((void) (XMARKBIT (x) = 1))
158 # define XUNMARK(x) ((void) (XMARKBIT (x) = 0))
160 # define XUNMARK(x) DO_NOTHING
163 /* Convert between a (void *) and a Lisp_Object, as when the
164 Lisp_Object is passed to a toolkit callback function */
165 #define VOID_TO_LISP(larg,varg) \
166 ((void) ((larg).v = (struct nosuchstruct *) (varg)))
167 #define CVOID_TO_LISP(larg,varg) \
168 ((void) ((larg).cv = (CONST struct nosuchstruct *) (varg)))
169 #define LISP_TO_VOID(larg) ((void *) ((larg).v))
170 #define LISP_TO_CVOID(larg) ((CONST void *) ((larg).cv))
172 /* Convert a Lisp_Object into something that can't be used as an
173 lvalue. Useful for type-checking. */
175 #define NON_LVALUE(larg) ({ (larg); })
177 /* Well, you can't really do it without using a function call, and
178 there's no real point in that; no-union-type is the rule, and that
179 will catch errors. */
180 #define NON_LVALUE(larg) (larg)