Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/runtime/include/ml-objects.h
ViewVC logotype

Annotation of /sml/trunk/src/runtime/include/ml-objects.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 249 - (view) (download) (as text)
Original Path: sml/branches/SMLNJ/src/runtime/include/ml-objects.h

1 : monnier 249 /* ml-objects.h
2 :     *
3 :     * COPYRIGHT (c) 1992 AT&T Bell Laboratories
4 :     *
5 :     * Macros and routines for allocating heap objects.
6 :     */
7 :    
8 :     #ifndef _ML_OBJECTS_
9 :     #define _ML_OBJECTS_
10 :    
11 :     #ifndef _ML_BASE_
12 :     #include "ml-base.h"
13 :     #endif
14 :    
15 :     #ifndef _ML_VALUES_
16 :     #include "ml-values.h"
17 :     #endif
18 :    
19 :     #ifndef _ML_STATE_
20 :     #include "ml-state.h"
21 :     #endif
22 :    
23 :     #ifndef _TAGS_
24 :     #include "tags.h"
25 :     #endif
26 :    
27 :     /* extract info from objects */
28 :     #define OBJ_DESC(OBJ) REC_SEL((OBJ), -1)
29 :     #define OBJ_LEN(OBJ) GET_LEN(OBJ_DESC(OBJ))
30 :     #define OBJ_TAG(OBJ) GET_TAG(OBJ_DESC(OBJ))
31 :    
32 :    
33 :     /** The size of an ML record in bytes (including descriptor) **/
34 :     #define REC_SZB(n) (((n)+1)*sizeof(ml_val_t))
35 :    
36 :    
37 :     /** heap allocation macros **/
38 :    
39 :     #define ML_AllocWrite(msp, i, x) ((((msp)->ml_allocPtr))[(i)] = (x))
40 :    
41 :     #define ML_Alloc(msp, n) ( \
42 :     ((msp)->ml_allocPtr += ((n)+1)), \
43 :     PTR_CtoML((msp)->ml_allocPtr - (n)))
44 :    
45 :     #define REF_ALLOC(msp, r, a) { \
46 :     ml_state_t *__msp = (msp); \
47 :     ml_val_t *__p = __msp->ml_allocPtr; \
48 :     *__p++ = DESC_ref; \
49 :     *__p++ = (a); \
50 :     (r) = PTR_CtoML(__msp->ml_allocPtr + 1); \
51 :     __msp->ml_allocPtr = __p; \
52 :     }
53 :    
54 :     #define REC_ALLOC1(msp, r, a) { \
55 :     ml_state_t *__msp = (msp); \
56 :     ml_val_t *__p = __msp->ml_allocPtr; \
57 :     *__p++ = MAKE_DESC(1, DTAG_record); \
58 :     *__p++ = (a); \
59 :     (r) = PTR_CtoML(__msp->ml_allocPtr + 1); \
60 :     __msp->ml_allocPtr = __p; \
61 :     }
62 :    
63 :     #define REC_ALLOC2(msp, r, a, b) { \
64 :     ml_state_t *__msp = (msp); \
65 :     ml_val_t *__p = __msp->ml_allocPtr; \
66 :     *__p++ = DESC_pair; \
67 :     *__p++ = (a); \
68 :     *__p++ = (b); \
69 :     (r) = PTR_CtoML(__msp->ml_allocPtr + 1); \
70 :     __msp->ml_allocPtr = __p; \
71 :     }
72 :    
73 :     #define REC_ALLOC3(msp, r, a, b, c) { \
74 :     ml_state_t *__msp = (msp); \
75 :     ml_val_t *__p = __msp->ml_allocPtr; \
76 :     *__p++ = MAKE_DESC(3, DTAG_record); \
77 :     *__p++ = (a); \
78 :     *__p++ = (b); \
79 :     *__p++ = (c); \
80 :     (r) = PTR_CtoML(__msp->ml_allocPtr + 1); \
81 :     __msp->ml_allocPtr = __p; \
82 :     }
83 :    
84 :     #define REC_ALLOC4(msp, r, a, b, c, d) { \
85 :     ml_state_t *__msp = (msp); \
86 :     ml_val_t *__p = __msp->ml_allocPtr; \
87 :     *__p++ = MAKE_DESC(4, DTAG_record); \
88 :     *__p++ = (a); \
89 :     *__p++ = (b); \
90 :     *__p++ = (c); \
91 :     *__p++ = (d); \
92 :     (r) = PTR_CtoML(__msp->ml_allocPtr + 1); \
93 :     __msp->ml_allocPtr = __p; \
94 :     }
95 :    
96 :     #define REC_ALLOC5(msp, r, a, b, c, d, e) { \
97 :     ml_state_t *__msp = (msp); \
98 :     ml_val_t *__p = __msp->ml_allocPtr; \
99 :     *__p++ = MAKE_DESC(5, DTAG_record); \
100 :     *__p++ = (a); \
101 :     *__p++ = (b); \
102 :     *__p++ = (c); \
103 :     *__p++ = (d); \
104 :     *__p++ = (e); \
105 :     (r) = PTR_CtoML(__msp->ml_allocPtr + 1); \
106 :     __msp->ml_allocPtr = __p; \
107 :     }
108 :    
109 :     #define REC_ALLOC6(msp, r, a, b, c, d, e, f) { \
110 :     ml_state_t *__msp = (msp); \
111 :     ml_val_t *__p = __msp->ml_allocPtr; \
112 :     *__p++ = MAKE_DESC(6, DTAG_record); \
113 :     *__p++ = (a); \
114 :     *__p++ = (b); \
115 :     *__p++ = (c); \
116 :     *__p++ = (d); \
117 :     *__p++ = (e); \
118 :     *__p++ = (f); \
119 :     (r) = PTR_CtoML(__msp->ml_allocPtr + 1); \
120 :     __msp->ml_allocPtr = __p; \
121 :     }
122 :    
123 :     #define SEQHDR_ALLOC(msp, r, desc, data, len) { \
124 :     ml_state_t *__msp = (msp); \
125 :     ml_val_t *__p = __msp->ml_allocPtr; \
126 :     *__p++ = (desc); \
127 :     *__p++ = (data); \
128 :     *__p++ = INT_CtoML(len); \
129 :     (r) = PTR_CtoML(__msp->ml_allocPtr + 1); \
130 :     __msp->ml_allocPtr = __p; \
131 :     }
132 :    
133 :     #ifdef ALIGN_REALDS
134 :     #define REAL64_ALLOC(msp, r, d) { \
135 :     ml_state_t *__msp = (msp); \
136 :     ml_val_t *__p = __msp->ml_allocPtr; \
137 :     __p = (ml_val_t *)((Addr_t)__p | WORD_SZB); \
138 :     *__p++ = DESC_reald; \
139 :     (r) = PTR_CtoML(__p); \
140 :     *(double *)__p = (d); \
141 :     __p += REALD_SZW; \
142 :     __msp->ml_allocPtr = __p; \
143 :     }
144 :     #else
145 :     #define REAL64_ALLOC(msp, r, d) { \
146 :     ml_state_t *__msp = (msp); \
147 :     ml_val_t *__p = __msp->ml_allocPtr; \
148 :     __p = (ml_val_t *)((Addr_t)__p | WORD_SZB); \
149 :     (r) = PTR_CtoML(__p); \
150 :     *(double *)__p = (d); \
151 :     __p += REALD_SZW; \
152 :     __msp->ml_allocPtr = __p; \
153 :     }
154 :     #endif
155 :    
156 :     #define EXN_ALLOC(msp, ex, id, val, where) \
157 :     REC_ALLOC3(msp, ex, id, val, where)
158 :    
159 :     /** Boxed word values **/
160 :     #define WORD_MLtoC(w) (*PTR_MLtoC(Word_t, w))
161 :     #define WORD_ALLOC(msp, p, w) { \
162 :     ml_state_t *__msp = (msp); \
163 :     ml_val_t *__p = __msp->ml_allocPtr; \
164 :     *__p++ = MAKE_DESC(1, DTAG_raw32); \
165 :     *__p++ = (ml_val_t)(w); \
166 :     (p) = PTR_CtoML(__msp->ml_allocPtr + 1); \
167 :     __msp->ml_allocPtr = __p; \
168 :     }
169 :     #define REC_SELWORD(p, i) (*REC_SELPTR(Word_t, p, i))
170 :     #define INT32_MLtoC(i) (*PTR_MLtoC(Int32_t, i))
171 :     #define INT32_ALLOC(msp, p, i) WORD_ALLOC(msp, p, i)
172 :     #define REC_SELINT32(p, i) (*REC_SELPTR(Int32_t, p, i))
173 :    
174 :     /** ML lists **/
175 :     #define LIST_hd(p) REC_SEL(p, 0)
176 :     #define LIST_tl(p) REC_SEL(p, 1)
177 :     #define LIST_nil INT_CtoML(0)
178 :     #define LIST_isNull(p) ((p) == LIST_nil)
179 :     #define LIST_cons(msp, r, a, b) REC_ALLOC2(msp, r, a, b)
180 :    
181 :     /** ML references **/
182 :     #define DEREF(r) REC_SEL(r, 0)
183 :     #define ASSIGN(r, x) (PTR_MLtoC(ml_val_t, r)[0] = (x))
184 :    
185 :     /** ML options **/
186 :     #define OPTION_NONE INT_CtoML(0)
187 :     #define OPTION_SOME(msp, r, a) REC_ALLOC1(msp, r, a)
188 :     #define OPTION_get(r) REC_SEL(r, 0)
189 :    
190 :     /** external routines **/
191 :     extern ml_val_t ML_CString (ml_state_t *msp, const char *v);
192 :     extern ml_val_t ML_CStringList (ml_state_t *msp, char **strs);
193 :     extern ml_val_t ML_AllocString (ml_state_t *msp, int len);
194 :     extern ml_val_t ML_AllocCode (ml_state_t *msp, int len);
195 :     extern ml_val_t ML_AllocBytearray (ml_state_t *msp, int len);
196 :     extern ml_val_t ML_AllocRealdarray (ml_state_t *msp, int len);
197 :     extern ml_val_t ML_AllocArray (ml_state_t *msp, int len, ml_val_t initVal);
198 :     extern ml_val_t ML_AllocVector (ml_state_t *msp, int len, ml_val_t initVal);
199 :     extern ml_val_t ML_AllocRaw32 (ml_state_t *msp, int len);
200 :     extern void ML_ShrinkRaw32 (ml_state_t *msp, ml_val_t v, int nWords);
201 :     extern ml_val_t ML_AllocRaw64 (ml_state_t *msp, int len);
202 :    
203 :     extern ml_val_t ML_SysConst (ml_state_t *msp, sysconst_tbl_t *tbl, int id);
204 :     extern ml_val_t ML_SysConstList (ml_state_t *msp, sysconst_tbl_t *tbl);
205 :     extern ml_val_t ML_AllocCData (ml_state_t *msp, int nbytes);
206 :     extern ml_val_t ML_CData (ml_state_t *msp, void *data, int nbytes);
207 :    
208 :     extern ml_val_t BuildLiterals (ml_state_t *msp, Byte_t *lits, int len);
209 :    
210 :     extern ml_val_t _ML_string0[];
211 :     extern ml_val_t _ML_vector0[];
212 :     #define ML_string0 PTR_CtoML(_ML_string0+1)
213 :     #define ML_vector0 PTR_CtoML(_ML_vector0+1)
214 :    
215 :     #endif /* !_ML_OBJECTS_ */

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0