From 3160b1426c25340503b5ab216965e30509cd8416 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Fri, 18 May 2012 11:30:33 +0200 Subject: [PATCH] refactor: use `unsafePerformIO hack' for global var --- Mate.hs | 1 - Mate/MethodPool.hs | 4 --- Mate/Types.hs | 64 +++++++++++++++++++--------------------------- ffi/trap.c | 12 --------- 4 files changed, 26 insertions(+), 55 deletions(-) diff --git a/Mate.hs b/Mate.hs index 0275e81..02c9969 100644 --- a/Mate.hs +++ b/Mate.hs @@ -23,7 +23,6 @@ main :: IO () main = do args <- getArgs register_signal - initMethodPool case args of [clspath] -> do let bclspath = B.pack $ map (fromIntegral . ord) clspath diff --git a/Mate/MethodPool.hs b/Mate/MethodPool.hs index 21c1795..16890c8 100644 --- a/Mate/MethodPool.hs +++ b/Mate/MethodPool.hs @@ -137,10 +137,6 @@ loadNativeFunction sym = do -- mmap2ptr mmap >>= set_mmap -- demo_mmap -- access Data.Map from C -initMethodPool :: IO () -initMethodPool = ctx2ptr emptyMateCtx >>= set_mate_context - - addMethodRef :: Word32 -> MethodInfo -> [B.ByteString] -> IO () addMethodRef entry (MethodInfo mmname _ msig) clsnames = do mmap <- getMethodMap diff --git a/Mate/Types.hs b/Mate/Types.hs index 2cdad11..79b0396 100644 --- a/Mate/Types.hs +++ b/Mate/Types.hs @@ -9,8 +9,8 @@ import qualified Data.Map as M import qualified Data.ByteString.Lazy as B import Codec.Binary.UTF8.String hiding (encode,decode) -import Foreign.Ptr -import Foreign.StablePtr +import Data.IORef +import System.IO.Unsafe import JVM.ClassFile import JVM.Assembler @@ -108,14 +108,6 @@ toString :: B.ByteString -> String toString bstr = decodeString $ map (chr . fromIntegral) $ B.unpack bstr --- those functions are for the "global map hax" --- TODO(bernhard): other solution please -foreign import ccall "set_mate_context" - set_mate_context :: Ptr () -> IO () - -foreign import ccall "get_mate_context" - get_mate_context :: IO (Ptr ()) - data MateCtx = MateCtx { ctxMethodMap :: MethodMap, ctxTrapMap :: TrapMap, @@ -128,87 +120,83 @@ data MateCtx = MateCtx { emptyMateCtx :: MateCtx emptyMateCtx = MateCtx M.empty M.empty M.empty M.empty M.empty M.empty M.empty -ctx2ptr :: MateCtx -> IO (Ptr ()) -ctx2ptr ctx = do - ptr <- newStablePtr ctx - return $ castStablePtrToPtr ptr - -ptr2ctx :: Ptr () -> IO MateCtx -ptr2ctx ptr = deRefStablePtr (castPtrToStablePtr ptr :: StablePtr MateCtx) +mateCtx :: IORef MateCtx +{-# NOINLINE mateCtx #-} +mateCtx = unsafePerformIO $ newIORef emptyMateCtx setMethodMap :: MethodMap -> IO () setMethodMap m = do - ctx <- get_mate_context >>= ptr2ctx - ctx2ptr ctx { ctxMethodMap = m } >>= set_mate_context + ctx <- readIORef mateCtx + writeIORef mateCtx $ ctx { ctxMethodMap = m } getMethodMap :: IO MethodMap getMethodMap = do - ctx <- get_mate_context >>= ptr2ctx + ctx <- readIORef mateCtx return $ ctxMethodMap ctx setTrapMap :: TrapMap -> IO () setTrapMap m = do - ctx <- get_mate_context >>= ptr2ctx - ctx2ptr ctx { ctxTrapMap = m } >>= set_mate_context + ctx <- readIORef mateCtx + writeIORef mateCtx $ ctx { ctxTrapMap = m } getTrapMap :: IO TrapMap getTrapMap = do - ctx <- get_mate_context >>= ptr2ctx + ctx <- readIORef mateCtx return $ ctxTrapMap ctx setClassMap :: ClassMap -> IO () setClassMap m = do - ctx <- get_mate_context >>= ptr2ctx - ctx2ptr ctx { ctxClassMap = m } >>= set_mate_context + ctx <- readIORef mateCtx + writeIORef mateCtx $ ctx { ctxClassMap = m } getClassMap :: IO ClassMap getClassMap = do - ctx <- get_mate_context >>= ptr2ctx + ctx <- readIORef mateCtx return $ ctxClassMap ctx setVirtualMap :: VirtualMap -> IO () setVirtualMap m = do - ctx <- get_mate_context >>= ptr2ctx - ctx2ptr ctx { ctxVirtualMap = m } >>= set_mate_context + ctx <- readIORef mateCtx + writeIORef mateCtx $ ctx { ctxVirtualMap = m } getVirtualMap :: IO VirtualMap getVirtualMap = do - ctx <- get_mate_context >>= ptr2ctx + ctx <- readIORef mateCtx return $ ctxVirtualMap ctx setStringMap :: StringMap -> IO () setStringMap m = do - ctx <- get_mate_context >>= ptr2ctx - ctx2ptr ctx { ctxStringMap = m } >>= set_mate_context + ctx <- readIORef mateCtx + writeIORef mateCtx $ ctx { ctxStringMap = m } getStringMap :: IO StringMap getStringMap = do - ctx <- get_mate_context >>= ptr2ctx + ctx <- readIORef mateCtx return $ ctxStringMap ctx setInterfaceMap :: InterfaceMap -> IO () setInterfaceMap m = do - ctx <- get_mate_context >>= ptr2ctx - ctx2ptr ctx { ctxInterfaceMap = m } >>= set_mate_context + ctx <- readIORef mateCtx + writeIORef mateCtx $ ctx { ctxInterfaceMap = m } getInterfaceMap :: IO InterfaceMap getInterfaceMap = do - ctx <- get_mate_context >>= ptr2ctx + ctx <- readIORef mateCtx return $ ctxInterfaceMap ctx setInterfaceMethodMap :: InterfaceMethodMap -> IO () setInterfaceMethodMap m = do - ctx <- get_mate_context >>= ptr2ctx - ctx2ptr ctx { ctxInterfaceMethodMap = m } >>= set_mate_context + ctx <- readIORef mateCtx + writeIORef mateCtx $ ctx { ctxInterfaceMethodMap = m } getInterfaceMethodMap :: IO InterfaceMethodMap getInterfaceMethodMap = do - ctx <- get_mate_context >>= ptr2ctx + ctx <- readIORef mateCtx return $ ctxInterfaceMethodMap ctx diff --git a/ffi/trap.c b/ffi/trap.c index 0302c5e..157358b 100644 --- a/ffi/trap.c +++ b/ffi/trap.c @@ -32,18 +32,6 @@ unsigned int mallocObject(int); #define dprintf(args...) #endif -void *mate_ctx = NULL; - -void *get_mate_context() -{ - return mate_ctx; -} - -void *set_mate_context(void *ctx) -{ - mate_ctx = ctx; -} - void mainresult(unsigned int a) { dprintf("mainresult: 0x%08x\n", a); -- 2.25.1