1 \section[stable-ptr-ops]{Stable Pointer Operations}
3 The code that implements @performIO@ is mostly in
4 @ghc/runtime/c-as-asm/PerformIO.lhc@. However, this code can be
5 called from the C world so it goes in a @.lc@ file.
7 This code is based heavily on the code in @ghc/runtime/main/main.lc@.
9 It is used to call a (stable pointer to a) function of type
10 @IoWorld -> PrimIntAndIoWorld@ (ie @PrimIO_Int#@).
12 (I doubt very much that this works at the moment - and we're going to
13 change it to take/return a byte array anyway. Code in PerformIO.lhc
21 extern StgPtr unstable_Closure;
24 enterStablePtr(stableIndex, startCode)
25 StgStablePtr stableIndex;
29 = _deRefStablePointer(stableIndex, StorageMgrInfo.StablePointerTable);
31 /* ToDo: Set arity to right value - if necessary */
33 miniInterpret(startCode);
38 EXTFUN(startPerformIO);
40 extern void checkInCCallGC(STG_NO_ARGS);
43 performIO(stableIndex)
44 StgStablePtr stableIndex;
47 enterStablePtr( stableIndex, (StgFunPtr) startPerformIO );
50 extern StgInt enterInt_Result;
51 EXTFUN(startEnterInt);
55 StgStablePtr stableIndex;
58 enterStablePtr( stableIndex, (StgFunPtr) startEnterInt );
59 return enterInt_Result;
62 extern StgFloat enterFloat_Result;
63 EXTFUN(startEnterFloat);
66 enterFloat(stableIndex)
67 StgStablePtr stableIndex;
70 enterStablePtr( stableIndex, (StgFunPtr) startEnterFloat );
71 return enterFloat_Result;
77 deRefStablePointer(stableIndex)
78 StgStablePtr stableIndex;
80 return _deRefStablePointer(stableIndex, StorageMgrInfo.StablePointerTable);
84 Despite the file name, we have a little ForeignObj operation here - not
85 worth putting in a file by itself.
97 And some code that HAS NO RIGHT being here.
100 StgStablePtr softHeapOverflowHandler = -1;
103 catchSoftHeapOverflow( newHandler, deltaLimit )
104 StgStablePtr newHandler;
107 StgStablePtr oldHandler = softHeapOverflowHandler;
109 /* If we're in a _ccall_GC_ then HpLim will be stored in SAVE_HpLim
110 which provides an easy way of changing it. */
113 StorageMgrInfo.hardHpOverflowSize += deltaLimit;
114 SAVE_HpLim -= deltaLimit;
116 if (StorageMgrInfo.hardHpOverflowSize < 0) {
117 fprintf(stderr, "Error: Setting Hard Heap Overflow Size to negative value!\n");
121 softHeapOverflowHandler = newHandler;
126 getSoftHeapOverflowHandler(STG_NO_ARGS)
128 return (StgInt) softHeapOverflowHandler;