bits are the Lisp object. Some people call such Lisp_Objects "immediate".
The object is obtained by masking off the type bits.
- Bit 1 is used as a value bit by splitting the Lisp integer type
+ Bit 1 is used as a value bit by splitting the Lisp integer type
into two subtypes, Lisp_Type_Int_Even and Lisp_Type_Int_Odd.
By this trickery we get 31 bits for integers instead of 30.
a pointer to a structure containing the object. The pointer is
obtained by masking off the type and mark bits.
- All pointer-based types are coalesced under a single type called
+ All pointer-based types are coalesced under a single type called
Lisp_Type_Record. The type bits for this type are required by the
implementation to be 00, just like the least significant bits of
word-aligned struct pointers on 32-bit hardware. This requires that
#define VALMASK (((1UL << VALBITS) - 1UL) << GCTYPEBITS)
#define XTYPE(x) ((enum Lisp_Type) (((EMACS_UINT)(x)) & ~VALMASK))
#define XPNTRVAL(x) (x) /* This depends on Lisp_Type_Record == 0 */
-#define XCHARVAL(x) ((x) >> GCBITS)
+#ifdef UTF2000
+INLINE_HEADER int XCHARVAL (Emchar chr);
+INLINE_HEADER int
+XCHARVAL (Emchar chr)
+{
+ int code = (EMACS_UINT)(chr) >> GCBITS;
+
+ if (code & 0x20000000)
+ return code | 0x40000000;
+ else
+ return code;
+}
+#else
+#define XCHARVAL(x) ((EMACS_UINT)(x) >> GCBITS)
+#endif
#define XREALINT(x) ((x) >> INT_GCBITS)
#define XUINT(x) ((EMACS_UINT)(x) >> INT_GCBITS)
#define INTP(x) ((EMACS_UINT)(x) & Lisp_Type_Int_Bit)