2 {-# LANGUAGE OverloadedStrings #-}
3 module Mate.Utilities where
6 import qualified Data.Map as M
7 import qualified Data.ByteString.Lazy as B
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)
20 | methodName f == name = Just f
23 buildMethodID :: Class Resolved -> Word16 -> MethodInfo
24 buildMethodID cls idx = MethodInfo (ntName nt) rc (ntSignature nt)
25 where (rc, nt) = case (constsPool cls) M.! idx of
26 (CMethod rc' nt') -> (rc', nt')
27 (CIfaceMethod rc' nt') -> (rc', nt')
28 _ -> error $ "buildMethodID: something wrong. abort."
30 buildStaticFieldID :: Class Resolved -> Word16 -> StaticFieldInfo
31 buildStaticFieldID cls idx = StaticFieldInfo rc (ntName fnt)
32 where (CField rc fnt) = (constsPool cls) M.! idx
34 buildFieldOffset :: Class Resolved -> Word16 -> (B.ByteString, B.ByteString)
35 buildFieldOffset cls idx = (rc, ntName fnt)
36 where (CField rc fnt) = (constsPool cls) M.! idx
38 buildClassID :: Class Resolved -> Word16 -> B.ByteString
39 buildClassID cls idx = cl
40 where (CClass cl) = (constsPool cls) M.! idx
42 methodGetArgsCount :: Class Resolved -> Word16 -> Word32
43 methodGetArgsCount cls idx = fromIntegral $ length args
45 nt = case (constsPool cls) M.! idx of
46 (CMethod _ nt') -> nt'
47 (CIfaceMethod _ nt') -> nt'
48 _ -> error $ "methodGetArgsCount: something wrong. abort."
49 (MethodSignature args _) = ntSignature nt
51 -- TODO(bernhard): Extend it to more than just int, and provide typeinformation
52 methodHaveReturnValue :: Class Resolved -> Word16 -> Bool
53 methodHaveReturnValue cls idx = case ret of
55 (Returns IntType) -> True;
56 (Returns (ObjectType _)) -> True;
57 _ -> error "methodHaveReturnValue: todo"
59 nt = case (constsPool cls) M.! idx of
60 (CMethod _ nt') -> nt'
61 (CIfaceMethod _ nt') -> nt'
62 _ -> error $ "methodHaveReturnValue: something wrong. abort."
63 (MethodSignature _ ret) = ntSignature nt