File: node.h

package info (click to toggle)
nhc98 1.16-15
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 62,544 kB
  • ctags: 103,012
  • sloc: ansic: 831,077; haskell: 60,111; java: 4,116; makefile: 3,045; sh: 2,183; cpp: 212
file content (139 lines) | stat: -rw-r--r-- 4,882 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139

/* node.h */

#ifndef _NODE_H
#define _NODE_H

#include "runtime.h"
#include "newmacros.h"

/*

              -------------
      INDIR   | *node   00|
              -------------

              ---------------------------
      VAP/CAP | info    x1| args ...    |
              ---------------------------

              ---------------------------
      CONSTR  | conInfo 10| args ...    |
              ---------------------------


             | arity |     0 |     It's a VAP node if info[0] == 0
             |  ...  |  ...  |
      info   |  need |  size |
             |  ...  |  ...  |
             |     0 | arity |
             |        constptr         |
             | code
             | ....

               | ...
               | CONSTR/WCONSTR/I32/FLOAT/STRING etc
               | *function name       This line only if profiling
      constptr | size << 16 | arity:16
               | link field
               | CAF_fun              This line only if arity == 0
               | CAF/VAP/CAP etc
               | ...


      coninfo | size:8,  psize:8,  R:3, number:9, 00:2,  tag:2             Must be same as in (new)macros.h
                         size   = Size of node
                         psize  = Number of pointers
                         number = Constructor number


      coninfo | size:LARGE_SIZE,  xx:LARGE_EXTRA  01:2,  tag:2             Must be same as in (new)macros.h
                         size   = Size of node, all words are pointers

      coninfo | size:LARGE_SIZE,  xx:LARGE_EXTRA  11:2,  tag:2             Must be same as in (new)macros.h
                         size   = Size of node, all words are integers


      cinfo  | need, size ,words ,0
                          need  = Number of argument needed (>0)
                          size  = Number of arguments availible
                          words = Number of arguments that aren't pointers
             | *fInfo

*/

#define ABS(a) ((a)<0?-(a):a)

#define EXT_LARGETAG(x)          ( (MASK_CON|MASK_WTAG) & (UInt)(x))
#define GET_LARGETAG(p)          EXT_LARGETAG(*(p))
#define EXT_TAG(x)               ( MASK_WTAG & (UInt)(x))
#define GET_TAG(p)               EXT_TAG(*(p))

#define ZAPPED(p)       (ZAP_BIT & (UInt)*(p))
#define ZAP(p)          (*(UInt*)(p) |= ZAP_BIT )
#define EXT_WADDRESS(x) ((NodePtr)(~MASK_WTAG & ~ZAP_BIT & (UInt)(x)))
#define EXT_HADDRESS(x) ((NodePtr)(~MASK_HTAG & ~ZAP_BIT & (UInt)(x)))

#define EXT_IND_ADDRESS(x) EXT_WADDRESS(x)
#define GET_IND_ADDRESS(p) EXT_IND_ADDRESS(*(p))

#define BUILD_IND(p)  ((Node) (IND_TAG | (UInt)(p)))

#define GET_HOLE_INFO    ((Node) (CON_TAG | (UInt)&cinfo_Dummy_hole))

#define EXT_FINFO(p)    (Finfo)EXT_HADDRESS(p)
#define GET_FINFO(p)    EXT_FINFO(*(p))

#ifdef TPROF
#define FINFO_ENTERPTR(p) (NS+2+(CodePtr)p)	/*PH*/
#define FINFO_CODE(p)     (NS+NS+2+(CodePtr)p)	/*PH*/
#else
/*#define FINFO_NATIVECODE(p)   (NS+2+(CodePtr)p)	   DAVID */
#define FINFO_CODE(p)   (NS/*+NS*/+2+(CodePtr)p)	/* DAVID */
#endif

#define FINFO_ARITY(p)  (((UChar *)(p))[1])
#define FINFO_CAF(p)    (FINFO_CONST(p)[2])
#define FINFO_CONST(p)  (*((NodePtr **)(2+(CodePtr)p)))
#define VAP_CONST(p)    FINFO_CONST(GET_FINFO(p))
#define VAP_CODE(p)     FINFO_CODE(GET_FINFO(p))


#define EXT_CINFO(p)    EXT_FINFO(p)
#define GET_CINFO(p)    EXT_CINFO(*(p))
#define CINFO_NEED(p)   (((UChar *)(p))[0])
#define CINFO_SIZE(p)   (((UChar *)(p))[1])
#define CINFO_FINFO(p)  ((Finfo)((UInt)p+(UInt)2*CINFO_NEED(p)))
#define CINFO_CODE(p)   FINFO_CODE(CINFO_FINFO(p))

#define EXT_CONINFO(p)    (Coninfo)(~MASK_WTAG & (UInt)p)
#define GET_CONINFO(p)    EXT_CONINFO(*(p))
#define CONINFO_SIZE(p)   (((p)>>24)&0xff)
#define CONINFO_PSIZE(p)  (((p)>>16)&0xff)
#define CONINFO_NUMBER(p) (((p)>>4)&0x1ff)	/*SPARUD*/
/* #define CONINFO_NUMBER(p) (((p)>>4)&0xfff)   ORIGINAL*/
#define CONINFO_IS_R(p)   ((p)&MASK_R)		/*SPARUD*/
#define CONINFO_IS_TRACE(p)   ((p)&MASK_TRACE)	/*SPARUD*/
#define CONINFO_PRUNED(p)   ((p)&MASK_PRUNED)	/*SPARUD*/
#define CONINFO_LARGESIZES(p) (((Int)p)>>(4+LARGE_EXTRA))
#define CONINFO_LARGESIZEU(p) (ABS(((Int)p)>>(4+LARGE_EXTRA)))
#define CONINFO_LARGEEXTRA(p) (((p)>>4)&((1<<LARGE_EXTRA)-1))

#define GET_POINTER_ARG1(p,i) (NodePtr)((p)[HEAPOFFSET(EXTRA+(i))])
#define GET_VALUE_ARG1(p,i)   (Node)((p)[HEAPOFFSET(EXTRA+(i))])

#define GET_APPLY_FUN(p)     GET_POINTER_ARG1(p,1)
#define GET_APPLY_ARG(p)     GET_POINTER_ARG1(p,2)

#define GET_INT_ARG1(p,i)     (Int)((p)[HEAPOFFSET(EXTRA+(i))])
#define GET_INT_VALUE(p)     GET_INT_ARG1(p,1)

#define GET_CONSTR(p)        CONINFO_NUMBER(GET_CONINFO(p))
#define GET_CHAR_VALUE(p)    (char)GET_INT_VALUE(p)
#define GET_8BIT_VALUE(p)    (unsigned char)GET_INT_VALUE(p)
#define GET_16BIT_VALUE(p)   (unsigned short)GET_INT_VALUE(p)
#define GET_32BIT_VALUE(p)   (unsigned long)GET_INT_VALUE(p)

#define GET_BOOL_VALUE(p)    CONINFO_NUMBER(GET_CONINFO(p))

#endif