ccfe1b3afc7b4bad72e817e09479582cfacc0bc3
[mate.git] / Mate / ClassPool.hs
1 {-# LANGUAGE OverloadedStrings #-}
2 {-# LANGUAGE ForeignFunctionInterface #-}
3 module Mate.ClassPool where
4
5 import Data.Binary
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
10 import System.Plugins
11
12 import Text.Printf
13
14 import Foreign.Ptr
15 import Foreign.C.Types
16 import Foreign.C.String
17 import Foreign.StablePtr
18 import Foreign.Marshal.Alloc
19
20 import JVM.ClassFile
21 import JVM.Converter
22
23 import Harpy
24 import Harpy.X86Disassembler
25
26 import Mate.BasicBlocks
27 import Mate.Types
28 import Mate.Utilities
29
30
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
36     Nothing -> do
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
41       return cfile
42     Just (ClassInfo name cfs) -> return cfs