X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fghci%2FObjLink.lhs;h=135afbb07dcadce0cc39d6fe3d2df47775a6a726;hb=84923cc7de2a93c22a2f72daf9ac863959efae13;hp=7675c7154bae61855414ad143b70ae81b3d361a4;hpb=354672b03f0d765145ada7821b5e001db22274dd;p=ghc-hetmet.git diff --git a/compiler/ghci/ObjLink.lhs b/compiler/ghci/ObjLink.lhs index 7675c71..135afbb 100644 --- a/compiler/ghci/ObjLink.lhs +++ b/compiler/ghci/ObjLink.lhs @@ -18,9 +18,11 @@ module ObjLink ( unloadObj, -- :: String -> IO () insertSymbol, -- :: String -> String -> Ptr a -> IO () lookupSymbol, -- :: String -> IO (Maybe (Ptr a)) - resolveObjs -- :: IO SuccessFlag + resolveObjs, -- :: IO SuccessFlag + lookupDataCon -- :: Ptr a -> IO (Maybe String) ) where +import ByteCodeItbls ( StgInfoTable ) import Panic ( panic ) import BasicTypes ( SuccessFlag, successIf ) import Config ( cLeadingUnderscore ) @@ -31,6 +33,10 @@ import Foreign.C import Foreign ( nullPtr ) import GHC.Exts ( Ptr(..), unsafeCoerce# ) +import Constants ( wORD_SIZE ) +import Foreign ( plusPtr ) + + -- --------------------------------------------------------------------------- -- RTS Linker Interface -- --------------------------------------------------------------------------- @@ -51,6 +57,14 @@ lookupSymbol str_in = do then return Nothing else return (Just addr) +-- | Expects a Ptr to an info table, not to a closure +lookupDataCon :: Ptr StgInfoTable -> IO (Maybe String) +lookupDataCon ptr = do + name <- c_lookupDataCon (ptr `plusPtr` (wORD_SIZE*2)) + if name == nullPtr + then return Nothing + else peekCString name >>= return . Just + prefixUnderscore :: String -> String prefixUnderscore | cLeadingUnderscore == "YES" = ('_':) @@ -94,5 +108,6 @@ foreign import ccall unsafe "lookupSymbol" c_lookupSymbol :: CString -> IO (Ptr foreign import ccall unsafe "loadObj" c_loadObj :: CString -> IO Int foreign import ccall unsafe "unloadObj" c_unloadObj :: CString -> IO Int foreign import ccall unsafe "resolveObjs" c_resolveObjs :: IO Int +foreign import ccall unsafe "lookupDataCon" c_lookupDataCon :: Ptr a -> IO CString \end{code}