1 {-# LANGUAGE OverloadedStrings #-}
2 {-# LANGUAGE ForeignFunctionInterface #-}
3 module Mate.ClassPool where
6 import Data.String.Utils
7 import qualified Data.Map as M
8 import qualified Data.Set as S
9 import qualified Data.ByteString.Lazy as B
15 import Foreign.C.Types
16 import Foreign.C.String
17 import Foreign.StablePtr
18 import Foreign.Marshal.Alloc
24 import Harpy.X86Disassembler
26 import Mate.BasicBlocks
31 getClassFile :: B.ByteString -> IO (Class Resolved)
32 getClassFile path = do
33 ptr_classmap <- get_classmap
34 class_map <- ptr2classmap ptr_classmap
35 case M.lookup path class_map of
37 let rpath = toString $ path `B.append` ".class"
38 cfile <- parseClassFile rpath
39 let class_map' = M.insert path (ClassInfo path cfile) class_map
40 classmap2ptr class_map' >>= set_classmap
42 Just (ClassInfo name cfs) -> return cfs