05220fce5447d5ded8ae15e72e91d51c57293b03
[mate.git] / Mate / Utilities.hs
1 {-# LANGUAGE CPP #-}
2 {-# LANGUAGE OverloadedStrings #-}
3 module Mate.Utilities where
4
5 import Data.Word
6 import qualified Data.Map as M
7 import qualified Data.ByteString.Lazy as B
8
9 import JVM.ClassFile
10
11 import Mate.Types
12
13
14 -- TODO: actually this function already exists in hs-java-0.3!
15 lookupMethod :: B.ByteString -> Class Resolved -> Maybe (Method Resolved)
16 lookupMethod name cls = look (classMethods cls)
17   where
18     look [] = Nothing
19     look (f:fs)
20       | methodName f == name = Just f
21       | otherwise  = look fs
22
23 buildMethodID :: Class Resolved -> Word16 -> MethodInfo
24 buildMethodID cls idx = MethodInfo (ntName nt) rc (ntSignature nt)
25   where
26   (CMethod rc nt) = (constsPool cls) M.! idx
27
28 buildStaticFieldID :: Class Resolved -> Word16 -> StaticFieldInfo
29 buildStaticFieldID cls idx = StaticFieldInfo rc (ntName fnt)
30   where (CField rc fnt) = (constsPool cls) M.! idx
31
32 buildFieldOffset :: Class Resolved -> Word16 -> (B.ByteString, B.ByteString)
33 buildFieldOffset cls idx = (rc, ntName fnt)
34   where (CField rc fnt) = (constsPool cls) M.! idx
35
36 buildClassID :: Class Resolved -> Word16 -> B.ByteString
37 buildClassID cls idx = cl
38   where (CClass cl) = (constsPool cls) M.! idx
39
40 methodGetArgsCount :: Class Resolved -> Word16 -> Word32
41 methodGetArgsCount cls idx = fromIntegral $ length args
42   where
43   (CMethod _ nt) = (constsPool cls) M.! idx
44   (MethodSignature args _) = ntSignature nt
45
46 -- TODO(bernhard): Extend it to more than just int, and provide typeinformation
47 methodHaveReturnValue :: Class Resolved -> Word16 -> Bool
48 methodHaveReturnValue cls idx = case ret of
49     ReturnsVoid -> False;
50     (Returns IntType) -> True;
51     (Returns (ObjectType _)) -> True;
52     _ -> error "methodHaveReturnValue: todo"
53   where
54   (CMethod _ nt) = (constsPool cls) M.! idx
55   (MethodSignature _ ret) = ntSignature nt