Language-Haskell
view release on metacpan or search on metacpan
hugs98-Nov2003/src/iomonad.c view on Meta::CPAN
}
primFun(primReplaceFinalizer) { /* Weak v -> Maybe (IO ()) */
/* -> IO (Maybe (IO ())) */
eval(IOArg(1)); /* Grab new finalizer ... */
if (whnfHead!=nameJust) {
push(NIL);
}
eval(IOArg(2)); /* Get weak pointer ... */
if (whatIs(whnfHead)!=WEAKFIN) {
internal("primReplaceFinalizer");
} else if (nonNull(snd(whnfHead))) {/* ... and replace finalizer */
Cell oldfin = snd(snd(snd(whnfHead)));
snd(snd(snd(whnfHead))) = pop();
if (nonNull(oldfin)) {
IOReturn(ap(nameJust,oldfin));
}
}
IOReturn(nameNothing);
}
primFun(primFinalize) { /* Weak v -> IO () */
eval(IOArg(1)); /* Bring weak pointer to an early */
if (whatIs(whnfHead)!=WEAKFIN) { /* end ... */
internal("primFinalize");
} else if (nonNull(snd(whnfHead))) {
Cell wp = whnfHead;
Cell vf = snd(snd(wp));
if (isPair(vf)) {
if (nonNull(snd(vf))) {
fst(vf) = snd(vf);
snd(vf) = finalizers;
finalizers = vf;
}
fst(snd(wp)) = NIL;
snd(snd(wp)) = NIL;
snd(wp) = NIL;
}
liveWeakPtrs = removeCell(wp,liveWeakPtrs);
}
IOReturn(nameUnit);
}
primFun(primRunFinalizer) { /* IO () */
if (isNull(finalizers)) {
IOReturn(nameUnit);
} else {
updapRoot(ap(hd(finalizers),primArg(2)),primArg(1));
finalizers = tl(finalizers);
return;
}
}
primFun(primFinalizerWaiting) { /* IO Boolean */
IOBoolResult(!isNull(finalizers));
}
#endif /* GC_WEAKPTRS */
#if HSCRIPT
#if EMBEDDED
extern void* getCurrentScript(void);
primFun(primGetCurrentScript) { /* IO Int */
IOReturn( mkInt( (int)getCurrentScript() ) );
}
#else
primFun(primGetCurrentScript) { /* IO Int */
IOReturn( mkInt( 0 ) );
}
#endif /* EMBEDDED */
#endif /* HSCRIPT */
/* --------------------------------------------------------------------------
* Primitives for implementing disposable memo functions
* Byron Cook -- byron@cse.ogi.edu
*
* IOEql :: Eval a => a -> a -> IO Bool
* if argument is an Int or Char
* then use ==
* else use pointer identity
*
* IOHash :: Eval a => a -> IO Int
* if a is an Int or Char
* then use value cast as an Int
* else use pointer identity
*
* (Earlier versions made Float a special case too - but that's not very
* portable since it assumes that sizeof(FloatPro) == sizeof(Int).)
* ------------------------------------------------------------------------*/
primFun(primIOEql) { /* :: Eval a => a -> a -> ST Mem Bool */
Cell x = IOArg(1);
Cell y = IOArg(2);
eval(x);
eval(y);
x = followInd(IOArg(1));
y = followInd(IOArg(2));
if (whatIs(x) == whatIs(y)) {
switch (whatIs(x)) {
case INTCELL : IOBoolResult(intOf(x)==intOf(y));
return;
case CHARCELL : IOBoolResult(charOf(x)==charOf(y));
return;
/* deliberate fall through to end */
}
}
IOBoolResult(x==y);
}
primFun(primIOHash) { /* :: Eval a => a -> ST Mem Int */
Cell x = IOArg(1);
eval(x);
x = followInd(IOArg(1));
switch(whatIs(x)) {
case INTCELL : IOBoolResult(x);
return;
case CHARCELL : IOBoolResult(mkInt(charOf(x)));
return;
}
IOBoolResult(mkInt((Int)x));
}
/*-------------------------------------------------------------------------*/
( run in 0.777 second using v1.01-cache-2.11-cpan-71847e10f99 )