/* ----------------------------------------------------------------------------
- * $Id: RtsAPI.c,v 1.28 2001/08/14 13:40:09 sewardj Exp $
+ * $Id: RtsAPI.c,v 1.31 2002/01/22 13:54:22 simonmar Exp $
*
* (c) The GHC Team, 1998-2001
*
rts_mkChar (HsChar c)
{
StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
- p->header.info = Czh_con_info;
+ SET_HDR(p, Czh_con_info, CCS_SYSTEM);
p->payload[0] = (StgClosure *)(StgChar)c;
return p;
}
rts_mkInt (HsInt i)
{
StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
- p->header.info = Izh_con_info;
+ SET_HDR(p, Izh_con_info, CCS_SYSTEM);
p->payload[0] = (StgClosure *)(StgInt)i;
return p;
}
rts_mkInt8 (HsInt8 i)
{
StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
- p->header.info = I8zh_con_info;
+ SET_HDR(p, I8zh_con_info, CCS_SYSTEM);
/* Make sure we mask out the bits above the lowest 8 */
p->payload[0] = (StgClosure *)(StgInt)((unsigned)i & 0xff);
return p;
rts_mkInt16 (HsInt16 i)
{
StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
- p->header.info = I16zh_con_info;
+ SET_HDR(p, I16zh_con_info, CCS_SYSTEM);
/* Make sure we mask out the relevant bits */
p->payload[0] = (StgClosure *)(StgInt)((unsigned)i & 0xffff);
return p;
rts_mkInt32 (HsInt32 i)
{
StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
- p->header.info = I32zh_con_info;
- p->payload[0] = (StgClosure *)(StgInt)i;
+ SET_HDR(p, I32zh_con_info, CCS_SYSTEM);
+ p->payload[0] = (StgClosure *)(StgInt)((unsigned)i & 0xffffffff);
return p;
}
{
long long *tmp;
StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,2));
- p->header.info = I64zh_con_info;
+ SET_HDR(p, I64zh_con_info, CCS_SYSTEM);
tmp = (long long*)&(p->payload[0]);
*tmp = (StgInt64)i;
return p;
rts_mkWord (HsWord i)
{
StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
- p->header.info = Wzh_con_info;
+ SET_HDR(p, Wzh_con_info, CCS_SYSTEM);
p->payload[0] = (StgClosure *)(StgWord)i;
return p;
}
{
/* see rts_mkInt* comments */
StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
- p->header.info = W8zh_con_info;
+ SET_HDR(p, W8zh_con_info, CCS_SYSTEM);
p->payload[0] = (StgClosure *)(StgWord)(w & 0xff);
return p;
}
{
/* see rts_mkInt* comments */
StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
- p->header.info = W16zh_con_info;
+ SET_HDR(p, W16zh_con_info, CCS_SYSTEM);
p->payload[0] = (StgClosure *)(StgWord)(w & 0xffff);
return p;
}
{
/* see rts_mkInt* comments */
StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
- p->header.info = W32zh_con_info;
- p->payload[0] = (StgClosure *)(StgWord)w;
+ SET_HDR(p, W32zh_con_info, CCS_SYSTEM);
+ p->payload[0] = (StgClosure *)(StgWord)(w & 0xffffffff);
return p;
}
StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,2));
/* see mk_Int8 comment */
- p->header.info = W64zh_con_info;
+ SET_HDR(p, W64zh_con_info, CCS_SYSTEM);
tmp = (unsigned long long*)&(p->payload[0]);
*tmp = (StgWord64)w;
return p;
rts_mkFloat (HsFloat f)
{
StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
- p->header.info = Fzh_con_info;
+ SET_HDR(p, Fzh_con_info, CCS_SYSTEM);
ASSIGN_FLT((P_)p->payload, (StgFloat)f);
return p;
}
rts_mkDouble (HsDouble d)
{
StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,sizeofW(StgDouble)));
- p->header.info = Dzh_con_info;
+ SET_HDR(p, Dzh_con_info, CCS_SYSTEM);
ASSIGN_DBL((P_)p->payload, (StgDouble)d);
return p;
}
rts_mkStablePtr (HsStablePtr s)
{
StgClosure *p = (StgClosure *)allocate(sizeofW(StgHeader)+1);
- p->header.info = StablePtr_con_info;
+ SET_HDR(p, StablePtr_con_info, CCS_SYSTEM);
p->payload[0] = (StgClosure *)s;
return p;
}
rts_mkPtr (HsPtr a)
{
StgClosure *p = (StgClosure *)allocate(sizeofW(StgHeader)+1);
- p->header.info = Ptr_con_info;
+ SET_HDR(p, Ptr_con_info, CCS_SYSTEM);
p->payload[0] = (StgClosure *)a;
return p;
}
SchedulerStatus
rts_eval (HaskellObj p, /*out*/HaskellObj *ret)
{
- StgTSO *tso = createGenThread(RtsFlags.GcFlags.initialStkSize, p);
- scheduleThread(tso);
- return waitThread(tso, ret);
+ StgTSO *tso;
+
+ tso = createGenThread(RtsFlags.GcFlags.initialStkSize, p);
+ scheduleThread(tso);
+ return waitThread(tso, ret);
}
SchedulerStatus
rts_eval_ (HaskellObj p, unsigned int stack_size, /*out*/HaskellObj *ret)
{
- StgTSO *tso = createGenThread(stack_size, p);
- scheduleThread(tso);
- return waitThread(tso, ret);
+ StgTSO *tso;
+
+ tso = createGenThread(stack_size, p);
+ scheduleThread(tso);
+ return waitThread(tso, ret);
}
/*
SchedulerStatus
rts_evalIO (HaskellObj p, /*out*/HaskellObj *ret)
{
- StgTSO* tso = createStrictIOThread(RtsFlags.GcFlags.initialStkSize, p);
- scheduleThread(tso);
- return waitThread(tso, ret);
+ StgTSO* tso;
+
+ tso = createStrictIOThread(RtsFlags.GcFlags.initialStkSize, p);
+ scheduleThread(tso);
+ return waitThread(tso, ret);
+}
+
+/*
+ * rts_evalStableIO() is suitable for calling from Haskell. It
+ * evaluates a value of the form (StablePtr (IO a)), forcing the
+ * action's result to WHNF before returning. The result is returned
+ * in a StablePtr.
+ */
+SchedulerStatus
+rts_evalStableIO (HsStablePtr s, /*out*/HsStablePtr *ret)
+{
+ StgTSO* tso;
+ StgClosure *p, *r;
+ SchedulerStatus stat;
+
+ p = (StgClosure *)deRefStablePtr(s);
+ tso = createStrictIOThread(RtsFlags.GcFlags.initialStkSize, p);
+ scheduleThread(tso);
+ stat = waitThread(tso, &r);
+
+ if (stat == Success) {
+ ASSERT(r != NULL);
+ *ret = getStablePtr((StgPtr)r);
+ }
+
+ return stat;
}
/*
SchedulerStatus
rts_evalLazyIO (HaskellObj p, unsigned int stack_size, /*out*/HaskellObj *ret)
{
- StgTSO *tso = createIOThread(stack_size, p);
- scheduleThread(tso);
- return waitThread(tso, ret);
+ StgTSO *tso;
+
+ tso = createIOThread(stack_size, p);
+ scheduleThread(tso);
+ return waitThread(tso, ret);
}
/* Convenience function for decoding the returned status. */
barf("%s: uncaught exception",site);
case Interrupted:
barf("%s: interrupted", site);
- case Deadlock:
- barf("%s: no threads to run: infinite loop or deadlock?", site);
default:
barf("%s: Return code (%d) not ok",(site),(rc));
}