Mercurial > hg > xemacs-beta
diff src/lisp-disunion.h @ 428:3ecd8885ac67 r21-2-22
Import from CVS: tag r21-2-22
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:28:15 +0200 |
parents | |
children | abe6d1db359e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lisp-disunion.h Mon Aug 13 11:28:15 2007 +0200 @@ -0,0 +1,110 @@ +/* Fundamental definitions for XEmacs Lisp interpreter -- non-union objects. + Copyright (C) 1985, 1986, 1987, 1992, 1993 Free Software Foundation, Inc. + +This file is part of XEmacs. + +XEmacs is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +XEmacs is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with XEmacs; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* Synched up with: FSF 19.30. Split out from lisp.h. */ +/* This file has diverged greatly from FSF Emacs. Syncing is no + longer desirable or possible */ + +/* + Format of a non-union-type Lisp Object + + 3 2 1 0 + bit 10987654321098765432109876543210 + -------------------------------- + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTT + + Integers are treated specially, and look like this: + + 3 2 1 0 + bit 10987654321098765432109876543210 + -------------------------------- + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVT + + For integral Lisp types, i.e. integers and characters, the value + bits are the Lisp object. + + The object is obtained by masking off the type and mark bits. + 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. + + For non-integral types, the value bits of a Lisp_Object contain + 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 + 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. Because of this, Lisp_Object pointers don't have + to be masked and are full-sized. + + There are no mark bits. + Integers and characters don't need to be marked. All other types + are lrecord-based, which means they get marked by incrementing + their ->implementation pointer. + + Here is a brief description of the following macros: + + XTYPE The type bits of a Lisp_Object + XPNTRVAL The value bits of a Lisp_Object storing a pointer + XCHARVAL The value bits of a Lisp_Object storing a Emchar + XREALINT The value bits of a Lisp_Object storing an integer, signed + XUINT The value bits of a Lisp_Object storing an integer, unsigned + INTP Non-zero if this Lisp_Object an integer? + Qzero Lisp Integer 0 + EQ Non-zero if two Lisp_Objects are identical */ + + +typedef EMACS_INT Lisp_Object; + +#define Lisp_Type_Int_Bit (Lisp_Type_Int_Even & Lisp_Type_Int_Odd) +#define make_obj(vartype, x) ((Lisp_Object) (x)) +#define make_int(x) ((Lisp_Object) (((x) << INT_GCBITS) | Lisp_Type_Int_Bit)) +#define make_char(x) ((Lisp_Object) (((x) << GCBITS) | Lisp_Type_Char)) +#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) +#define XREALINT(x) ((x) >> INT_GCBITS) +#define XUINT(x) ((EMACS_UINT)(x) >> INT_GCBITS) +#define INTP(x) ((EMACS_UINT)(x) & Lisp_Type_Int_Bit) +#define INT_PLUS(x,y) ((x)+(y)-Lisp_Type_Int_Bit) +#define INT_MINUS(x,y) ((x)-(y)+Lisp_Type_Int_Bit) +#define INT_PLUS1(x) INT_PLUS (x, make_int (1)) +#define INT_MINUS1(x) INT_MINUS (x, make_int (1)) + +#define Qzero make_int (0) +#define Qnull_pointer ((Lisp_Object) 0) +#define EQ(x,y) ((x) == (y)) +#define XSETINT(var, value) ((void) ((var) = make_int (value))) +#define XSETCHAR(var, value) ((void) ((var) = make_char (value))) +#define XSETOBJ(var, vartype, value) ((void) ((var) = make_obj (vartype, value))) + +/* Convert between a (void *) and a Lisp_Object, as when the + Lisp_Object is passed to a toolkit callback function */ +#define VOID_TO_LISP(larg,varg) ((void) ((larg) = ((Lisp_Object) (varg)))) +#define CVOID_TO_LISP VOID_TO_LISP +#define LISP_TO_VOID(larg) ((void *) (larg)) +#define LISP_TO_CVOID(varg) ((CONST void *) (larg)) + +/* Convert a Lisp_Object into something that can't be used as an + lvalue. Useful for type-checking. */ +#define NON_LVALUE(larg) ((larg) + 0)