From 07ac1f9fe37e35c5564524ab79ba643f776df422 Mon Sep 17 00:00:00 2001 From: panne Date: Sun, 11 Jun 2000 19:14:27 +0000 Subject: [PATCH] [project @ 2000-06-11 19:14:27 by panne] * Synched comments with reality * Ensure that a f.e.d. function is never inlined, because the address of the C stub (a litlit) is might not be in scope in other modules. (untested fix). *** merge *** --- ghc/compiler/deSugar/DsForeign.lhs | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/ghc/compiler/deSugar/DsForeign.lhs b/ghc/compiler/deSugar/DsForeign.lhs index a5780f9..f6b7cb6 100644 --- a/ghc/compiler/deSugar/DsForeign.lhs +++ b/ghc/compiler/deSugar/DsForeign.lhs @@ -22,7 +22,9 @@ import CallConv import TcHsSyn ( TypecheckedForeignDecl ) import CoreUtils ( exprType, mkInlineMe ) import DataCon ( DataCon, dataConWrapId ) -import Id ( Id, idType, idName, mkWildId, mkVanillaId, mkSysLocal ) +import Id ( Id, idType, idName, mkWildId, mkVanillaId, mkSysLocal, + setInlinePragma ) +import IdInfo ( neverInlinePrag ) import MkId ( mkWorkerId ) import Literal ( Literal(..) ) import Module ( Module, moduleUserString ) @@ -298,24 +300,17 @@ of some fixed type behind an externally callable interface (i.e., as a C function pointer). Useful for callbacks and stuff. \begin{verbatim} -foreign export stdcall f :: (Addr -> Int -> IO Int) -> IO Addr +foreign export dynamic f :: (Addr -> Int -> IO Int) -> IO Addr --- Haskell-visible constructor, which is generated from the --- above: +-- Haskell-visible constructor, which is generated from the above: +-- SUP: No check for NULL from createAdjustor anymore??? f :: (Addr -> Int -> IO Int) -> IO Addr -f cback = IO ( \ s1# -> - case makeStablePtr# cback s1# of { StateAndStablePtr# s2# sp# -> - case _ccall_ "mkAdjustor" sp# ``f_helper'' s2# of - StateAndAddr# s3# a# -> - case addr2Int# a# of - 0# -> IOfail s# err - _ -> - let - a :: Addr - a = A# a# - in - IOok s3# a) +f cback = + bindIO (makeStablePtr cback) + (\StablePtr sp# -> IO (\s1# -> + case _ccall_ createAdjustor cconv sp# ``f_helper'' s1# of + (# s2#, a# #) -> (# s2#, A# a# #))) foreign export "f_helper" f_helper :: StablePtr (Addr -> Int -> IO Int) -> Addr -> Int -> IO Int -- `special' foreign export that invokes the closure pointed to by the @@ -379,7 +374,9 @@ dsFExportDynamic i ty mod_name ext_name cconv = mkLams [cback] $ stbl_app ccall_io_adj addrTy in - returnDs (NonRec i io_app, fe, h_code, c_code) + -- Never inline the f.e.d. function, because the litlit might not be in scope + -- in other modules. + returnDs (NonRec (i `setInlinePragma` neverInlinePrag) io_app, fe, h_code, c_code) where (tvs,sans_foralls) = splitForAllTys ty -- 1.7.10.4