X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=Mate%2FUtilities.hs;h=89020a5d1d65cfda9dedd217c42a568ec13620d0;hb=e956c113f38ae5cf78d79cf00de776f0331a332c;hp=8733ca398506b5c8b14ac704f7139cb9f9e484e3;hpb=3558633cda85024f2e9e3c2c6bb4aca289b1e3eb;p=mate.git diff --git a/Mate/Utilities.hs b/Mate/Utilities.hs index 8733ca3..89020a5 100644 --- a/Mate/Utilities.hs +++ b/Mate/Utilities.hs @@ -1,18 +1,65 @@ +{-# LANGUAGE CPP #-} +{-# LANGUAGE OverloadedStrings #-} module Mate.Utilities where +import Data.Word +import qualified Data.Map as M import qualified Data.ByteString.Lazy as B -import qualified JVM.Assembler as J -import JVM.Assembler hiding (Instruction) -import JVM.Common import JVM.ClassFile +import Mate.Types --- TODO: actually this function already exists in hs-java-0.3! -lookupMethod :: B.ByteString -> Class Resolved -> Maybe (Method Resolved) -lookupMethod name cls = look (classMethods cls) + +buildMethodID :: Class Direct -> Word16 -> MethodInfo +buildMethodID cls idx = MethodInfo (ntName nt) rc (ntSignature nt) + where (rc, nt) = case constsPool cls M.! idx of + (CMethod rc' nt') -> (rc', nt') + (CIfaceMethod rc' nt') -> (rc', nt') + _ -> error "buildMethodID: something wrong. abort." + +buildStaticFieldID :: Class Direct -> Word16 -> StaticFieldInfo +buildStaticFieldID cls idx = StaticFieldInfo rc (ntName fnt) + where (CField rc fnt) = constsPool cls M.! idx + +buildFieldOffset :: Class Direct -> Word16 -> (B.ByteString, B.ByteString) +buildFieldOffset cls idx = (rc, ntName fnt) + where (CField rc fnt) = constsPool cls M.! idx + +buildClassID :: Class Direct -> Word16 -> B.ByteString +buildClassID cls idx = cl + where (CClass cl) = constsPool cls M.! idx + +methodGetArgsCount :: Class Direct -> Word16 -> Word32 +methodGetArgsCount cls idx = fromIntegral $ length args + where + nt = case constsPool cls M.! idx of + (CMethod _ nt') -> nt' + (CIfaceMethod _ nt') -> nt' + _ -> error "methodGetArgsCount: something wrong. abort." + (MethodSignature args _) = ntSignature nt + +-- TODO(bernhard): Extend it to more than just int, and provide typeinformation +methodHaveReturnValue :: Class Direct -> Word16 -> Bool +methodHaveReturnValue cls idx = case ret of + ReturnsVoid -> False; + (Returns BoolType) -> True + (Returns CharByte) -> True + (Returns IntType) -> True; + (Returns (Array _ _)) -> True + (Returns (ObjectType _)) -> True; + _ -> error $ "methodHaveReturnValue: todo: " ++ show ret + where + nt = case constsPool cls M.! idx of + (CMethod _ nt') -> nt' + (CIfaceMethod _ nt') -> nt' + _ -> error "methodHaveReturnValue: something wrong. abort." + (MethodSignature _ ret) = ntSignature nt + +lookupMethodSig :: B.ByteString -> MethodSignature -> Class Direct -> Maybe (Method Direct) +lookupMethodSig name sig cls = look (classMethods cls) where - look [] = Nothing - look (f:fs) - | methodName f == name = Just f - | otherwise = look fs + look [] = Nothing + look (f:fs) + | methodName f == name && methodSignature f == sig = Just f + | otherwise = look fs