1 /* ----------------------------------------------------------------------------
2 * $Id: RtsAPI.c,v 1.4 1999/02/05 16:02:49 simonm Exp $
4 * (c) The GHC Team, 1998-1999
6 * API for invoking Haskell functions via the RTS
8 * --------------------------------------------------------------------------*/
16 /* ----------------------------------------------------------------------------
17 Building Haskell objects from C datatypes.
18 ------------------------------------------------------------------------- */
22 StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
23 p->header.info = &Czh_con_info;
24 p->payload[0] = (StgClosure *)((StgInt)c);
31 StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
32 p->header.info = &Izh_con_info;
33 p->payload[0] = (StgClosure *)(StgInt)i;
40 StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
41 /* This is a 'cheat', using the static info table for Ints,
42 instead of the one for Int8, but the types have identical
45 p->header.info = &Izh_con_info;
46 /* Make sure we mask out the bits above the lowest 8 */
47 p->payload[0] = (StgClosure *)(StgInt)((unsigned)i & 0xff);
54 StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
55 /* This is a 'cheat', using the static info table for Ints,
56 instead of the one for Int8, but the types have identical
59 p->header.info = &Izh_con_info;
60 /* Make sure we mask out the relevant bits */
61 p->payload[0] = (StgClosure *)(StgInt)((unsigned)i & 0xffff);
68 StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
69 /* see mk_Int8 comment */
70 p->header.info = &Izh_con_info;
71 p->payload[0] = (StgClosure *)(StgInt)i;
76 rts_mkInt64 (long long int i)
79 StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,2));
80 /* see mk_Int8 comment */
81 p->header.info = &I64zh_con_info;
82 tmp = (long long*)&(p->payload[0]);
88 rts_mkWord (unsigned int i)
90 StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
91 p->header.info = &Wzh_con_info;
92 p->payload[0] = (StgClosure *)(StgWord)i;
97 rts_mkWord8 (unsigned int w)
99 /* see rts_mkInt* comments */
100 StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
101 p->header.info = &Wzh_con_info;
102 p->payload[0] = (StgClosure *)(StgWord)(w & 0xff);
107 rts_mkWord16 (unsigned int w)
109 /* see rts_mkInt* comments */
110 StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
111 p->header.info = &Wzh_con_info;
112 p->payload[0] = (StgClosure *)(StgWord)(w & 0xffff);
117 rts_mkWord32 (unsigned int w)
119 /* see rts_mkInt* comments */
120 StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
121 p->header.info = &Wzh_con_info;
122 p->payload[0] = (StgClosure *)(StgWord)w;
127 rts_mkWord64 (unsigned long long w)
129 unsigned long long *tmp;
130 extern StgInfoTable W64zh_con_info;
132 StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,2));
133 /* see mk_Int8 comment */
134 p->header.info = &W64zh_con_info;
135 tmp = (unsigned long long*)&(p->payload[0]);
141 rts_mkFloat (float f)
143 StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
144 p->header.info = &Fzh_con_info;
145 ASSIGN_FLT((P_)p->payload, (StgFloat)f);
150 rts_mkDouble (double d)
152 StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,sizeofW(StgDouble)));
153 p->header.info = &Dzh_con_info;
154 ASSIGN_DBL((P_)p->payload, (StgDouble)d);
159 rts_mkStablePtr (StgStablePtr s)
161 StgClosure *p = (StgClosure *)allocate(sizeofW(StgHeader)+1);
162 p->header.info = &StablePtr_con_info;
163 p->payload[0] = (StgClosure *)s;
170 StgClosure *p = (StgClosure *)allocate(sizeofW(StgHeader)+1);
171 p->header.info = &Azh_con_info;
172 p->payload[0] = (StgClosure *)a;
176 #ifdef COMPILER /* GHC has em, Hugs doesn't */
181 return (StgClosure *)&True_closure;
183 return (StgClosure *)&False_closure;
188 rts_mkString (char *s)
190 return rts_apply((StgClosure *)&unpackCString_closure, rts_mkAddr(s));
194 rts_apply (HaskellObj f, HaskellObj arg)
196 StgAP_UPD *ap = (StgAP_UPD *)allocate(AP_sizeW(1));
197 ap->header.info = &AP_UPD_info;
200 ap->payload[0] = (P_)arg;
201 return (StgClosure *)ap;
203 #endif /* COMPILER */
205 /* ----------------------------------------------------------------------------
206 Deconstructing Haskell objects
207 ------------------------------------------------------------------------- */
210 rts_getChar (HaskellObj p)
212 if (p->header.info == &Czh_con_info || p->header.info == &Czh_static_info) {
213 return (char)(StgWord)(p->payload[0]);
215 barf("getChar: not a Char");
220 rts_getInt (HaskellObj p)
222 if (p->header.info == &Izh_con_info || p->header.info == &Izh_static_info) {
223 return (int)(p->payload[0]);
225 barf("getInt: not an Int");
230 rts_getWord (HaskellObj p)
232 if (p->header.info == &Wzh_con_info || p->header.info == &Wzh_static_info) {
233 return (unsigned int)(p->payload[0]);
235 barf("getWord: not a Word");
240 rts_getFloat (HaskellObj p)
242 if (p->header.info == &Fzh_con_info || p->header.info == &Fzh_static_info) {
243 return (float)(PK_FLT((P_)p->payload));
245 barf("getFloat: not a Float");
250 rts_getDouble (HaskellObj p)
252 if (p->header.info == &Dzh_con_info || p->header.info == &Dzh_static_info) {
253 return (double)(PK_DBL((P_)p->payload));
255 barf("getDouble: not a Double");
260 rts_getStablePtr (HaskellObj p)
262 if (p->header.info == &StablePtr_con_info ||
263 p->header.info == &StablePtr_static_info) {
264 return (StgStablePtr)(p->payload[0]);
266 barf("getStablePtr: not a StablePtr");
271 rts_getAddr (HaskellObj p)
273 if (p->header.info == &Azh_con_info || p->header.info == &Azh_static_info) {
274 return (void *)(p->payload[0]);
276 barf("getAddr: not an Addr");
280 #ifdef COMPILER /* GHC has em, Hugs doesn't */
282 rts_getBool (HaskellObj p)
284 if (p == &True_closure) {
286 } else if (p == &False_closure) {
289 barf("getBool: not a Bool");
292 #endif /* COMPILER */
294 /* ----------------------------------------------------------------------------
295 Evaluating Haskell expressions
296 ------------------------------------------------------------------------- */
298 rts_eval (HaskellObj p, /*out*/HaskellObj *ret)
300 StgTSO *tso = createGenThread(RtsFlags.GcFlags.initialStkSize, p);
301 return schedule(tso, ret);
305 rts_eval_ (HaskellObj p, unsigned int stack_size, /*out*/HaskellObj *ret)
307 StgTSO *tso = createGenThread(stack_size, p);
308 return schedule(tso, ret);
312 rts_evalIO (HaskellObj p, /*out*/HaskellObj *ret)
314 StgTSO *tso = createIOThread(RtsFlags.GcFlags.initialStkSize, p);
315 return schedule(tso, ret);
319 rts_evalIO_ (HaskellObj p, unsigned int stack_size, /*out*/HaskellObj *ret)
321 StgTSO *tso = createIOThread(stack_size, p);
322 return schedule(tso, ret);
325 /* Convenience function for decoding the returned status. */
327 void rts_checkSchedStatus ( char* site, SchedulerStatus rc )
329 if ( rc == Success ) {
332 barf("%s: Return code (%d) not ok",(site),(rc));