X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=JVM%2FConverter.hs;h=2c58cec3e5502db15a05f8b783fc30cc1f7da410;hb=e3c3550bcddba61a4a6e7c5f3715f0385fb4d739;hp=6f16e316aaa99984aacb51dae201b4169a3de61b;hpb=a937c158a55c8d80c9c35777fcb104767450e8dd;p=hs-java.git diff --git a/JVM/Converter.hs b/JVM/Converter.hs index 6f16e31..2c58cec 100644 --- a/JVM/Converter.hs +++ b/JVM/Converter.hs @@ -1,25 +1,32 @@ {-# LANGUAGE TypeFamilies, StandaloneDeriving, FlexibleInstances, FlexibleContexts, UndecidableInstances, RecordWildCards, OverloadedStrings #-} -module JVM.Converter where +-- | Functions to convert from low-level .class format representation and +-- high-level Java classes, methods etc representation +module JVM.Converter + (decompile, decompileFile, + convertClass, + methodByName, + attrByName, + methodCode + ) + where import Data.List import Data.Word import Data.Bits import Data.Binary -import Data.Char -import Data.String import qualified Data.ByteString.Lazy as B import Data.Array import qualified Data.Set as S import qualified Data.Map as M -import Debug.Trace - import JVM.ClassFile import JVM.Types +-- | Parse .class file data decompile :: B.ByteString -> Class decompile bstr = convertClass $ decode bstr +-- | Parse class data from file decompileFile :: FilePath -> IO Class decompileFile path = convertClass `fmap` decodeFile path @@ -62,8 +69,6 @@ constantPoolArray list = pool convert (CONSTANT_Utf8 _ bs) = CUTF8 bs convert (CONSTANT_Unicode _ bs) = CUnicode bs -className' x = trace ("Class name: " ++ show x) B.empty - convertAccess :: Word16 -> Access convertAccess w = S.fromList $ concat $ zipWith (\i f -> if testBit w i then [f] else []) [0..] $ [ ACC_PUBLIC, @@ -98,14 +103,19 @@ convertAttrs pool attrs = M.fromList $ map go attrs go (AttributeInfo {..}) = (getString $ pool ! attributeName, attributeValue) +-- | Try to get class method by name methodByName :: Class -> B.ByteString -> Maybe Method methodByName cls name = find (\m -> methodName m == name) (methods cls) +-- | Try to get object attribute by name attrByName :: (HasAttributes a) => a -> B.ByteString -> Maybe B.ByteString attrByName x name = M.lookup name (attributes x) -methodCode :: Class -> B.ByteString -> Maybe B.ByteString +-- | Try to get Code for class method (no Code for interface methods) +methodCode :: Class + -> B.ByteString -- ^ Method name + -> Maybe B.ByteString methodCode cls name = do method <- methodByName cls name attrByName method "Code"