10 #define malloc(x) GC_MALLOC((x))
11 #define calloc(x,y) GC_MALLOC((x)*(y))
15 typedef int (*fun_t
)(int); /* generic function pointer */
16 typedef unsigned int cid_t
; /* class identifier */
17 typedef unsigned long int val_t
; /* value (everything is a val_t) */
18 typedef union obj_tu
{union classtable_elt_tu
* vft
; val_t attr
;} *obj_t
; /* standard object */
19 typedef union classtable_elt_tu
{ int i
; fun_t f
; cid_t cid
;} classtable_elt_t
; /* classtable element */
21 typedef classtable_elt_t
* classtable_t
; /* classtable */
23 /*****************************************************************************
24 * Types macros (primitive and less primitives) ******************************
25 *****************************************************************************
29 * OBJ (obj_t) : standard object representation (including boxes + NIL)
30 * Int (int) : integers
31 * Char (car) : characters
32 * Bool (int) : booleans (true or false)
34 * X (x_t) : generic representatio of the previous four types
38 * int ISX(val_t v) : true if v is a X
39 * x_t VAL2X(val_t v) : convert a val_t to a primitive type (you should check ISX before)
40 * val_t X2VAL(x_t x) : convert a type to a val_t
41 * int XTAG : numeric identifier of a type
42 * int TAG(val_t v) : return the XTAG (ie TAG(Char2VAL('e')) == CharTag)
44 * classtable_t VAL2VFT(val_t v): the virtual function table of a value
46 * val_t NIT_NULL : the instance of the None class
47 *****************************************************************************/
49 #define TAG(x) ((int)(x) & 3)
53 #define TAG_Int(x) ((val_t)(((x)<<2)|IntTAG))
54 #define UNTAG_Int(x) ((int)(x)>>2)
58 #define TAG_Char(x) ((val_t)((((int)(x))<<2)|CharTAG))
59 #define UNTAG_Char(x) ((char)((int)(x)>>2))
63 #define TAG_Bool(x) ((val_t)(((x)<<2)|BoolTAG))
64 #define UNTAG_Bool(x) ((int)(x)>>2)
69 #define ISOBJ(x) (TAG((x)) == OBJTAG)
70 #define VAL2OBJ(x) ((obj_t)(x))
71 #define OBJ2VAL(o) ((val_t)(o))
72 #define VAL2VFT(x) (ISOBJ(x) ? VAL2OBJ(x)->vft : TAG2VFT[TAG(x)])
73 /*#define VAL2CID(x) (ISOBJ(x) ? (VAL2OBJ(x)->vft->cid) : (-TAG(x)))*/
74 #define VAL2CID(x) (VAL2OBJ(x)->vft->cid)
76 #define NIT_NULL ((val_t)0)
77 #define ISNULL(x) ((x)==NIT_NULL)
79 /* Equal comparaison */
80 /* O = Non nil object ; N = Object or nil ; P = Primitive */
81 #define OBJ_IS_BOX(x) ((VAL2OBJ(x)->vft->i) < 0)
82 #define IS_BOX(x) (ISOBJ(x) && OBJ_IS_BOX(x))
83 #define IS_EQUAL_BOX(x, y) (ISOBJ(y) && (VAL2OBJ(x)[1].vft==VAL2OBJ(y)[1].vft) && (VAL2OBJ(x)->vft==VAL2OBJ(y)->vft))
84 #define IS_EQUAL_OO(x, y) ((x)==(y) || (IS_BOX(x) && IS_EQUAL_BOX((x), (y))))
85 #define IS_EQUAL_ON(x, y) ((x)==(y) || (IS_BOX(x) && !ISNULL(y) && IS_EQUAL_BOX((x), (y))))
86 #define IS_EQUAL_NN(x, y) ((x)==(y) || (!ISNULL(x) && IS_BOX(x) && !ISNULL(y) && IS_EQUAL_BOX((x), (y))))
88 /* Subclass comparaison */
89 /* check is e is a subtype of c2 */
90 /* Warning, only subclasse comparaison is performed, not subtype */
91 /* e is a val (not nil) */
92 /* c a class name (eg: Int) */
93 #define VALISA(e, c) (VAL2VFT(e)[COLOR_ ## c].cid == (cid_t) ID_ ## c)
94 #define OBJISA(e, c) (VAL2OBJ(e)->vft[COLOR_ ## c].cid == (cid_t) ID_ ## c)
96 #define VAL_ISA(e, c, i) (VAL2VFT((e))[(c)].cid == (cid_t)(i))
100 extern val_t G_stdin
;
101 extern val_t G_stdout
;
102 extern val_t G_stderr
;
105 extern int glob_argc
;
106 extern char ** glob_argv
;
109 struct trace_t
*prev
; /* previous stack frame */
110 const char *file
; /* source filename */
111 int line
; /* line number */
112 const char *meth
; /* method name */
114 extern struct trace_t
*tracehead
;
115 typedef enum {true = (1==1),false = (0==1)} bool;
119 #define CALL(r,c) ((VAL2VFT(r)[c].f))
120 #define ATTR(r,c) (*(val_t*)(VAL2OBJ(r)+c))
121 #define ATTRS(r,c,o) ((VAL2OBJ(r)+VAL2VFT(r)[c].i)[o].attr)
123 void prepare_signals(void);
124 extern classtable_t TAG2VFT
[4];