+-}
+
+
+data MateCtx = MateCtx {
+ ctxMethodMap :: MethodMap,
+ ctxTrapMap :: TrapMap,
+ ctxClassMap :: ClassMap,
+ ctxVirtualMap :: VirtualMap,
+ ctxStringMap :: StringMap,
+ ctxInterfaceMap :: InterfaceMap,
+ ctxInterfaceMethodMap :: InterfaceMethodMap }
+
+emptyMateCtx :: MateCtx
+emptyMateCtx = MateCtx M.empty M.empty M.empty M.empty M.empty M.empty M.empty
+
+mateCtx :: IORef MateCtx
+{-# NOINLINE mateCtx #-}
+mateCtx = unsafePerformIO $ newIORef emptyMateCtx
+
+
+setMethodMap :: MethodMap -> IO ()
+setMethodMap m = do
+ ctx <- readIORef mateCtx
+ writeIORef mateCtx $ ctx { ctxMethodMap = m }
+
+getMethodMap :: IO MethodMap
+getMethodMap = do
+ ctx <- readIORef mateCtx
+ return $ ctxMethodMap ctx
+
+
+setTrapMap :: TrapMap -> IO ()
+setTrapMap m = do
+ ctx <- readIORef mateCtx
+ writeIORef mateCtx $ ctx { ctxTrapMap = m }
+
+getTrapMap :: IO TrapMap
+getTrapMap = do
+ ctx <- readIORef mateCtx
+ return $ ctxTrapMap ctx
+
+
+setClassMap :: ClassMap -> IO ()
+setClassMap m = do
+ ctx <- readIORef mateCtx
+ writeIORef mateCtx $ ctx { ctxClassMap = m }