X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=JVM%2FConverter.hs;h=52b3483943995dd2e6ddb44e5a14bc2dfd36c18d;hb=4174461dc7cd2b14183917db3cd11219a37e804c;hp=a498c96e5319ee1e79637d59946c0e27ccb99e2e;hpb=752b12198fcd7cdc754f4488d3750da7ac154604;p=hs-java.git diff --git a/JVM/Converter.hs b/JVM/Converter.hs index a498c96..52b3483 100644 --- a/JVM/Converter.hs +++ b/JVM/Converter.hs @@ -16,6 +16,7 @@ import Data.List import Data.Word import Data.Bits import Data.Binary +import Data.Default () -- import instances only import qualified Data.ByteString.Lazy as B import qualified Data.Set as S import qualified Data.Map as M @@ -39,10 +40,8 @@ classFile2Direct :: Class File -> Class Direct classFile2Direct (Class {..}) = let pool = poolFile2Direct constsPool superName = className $ pool ! superClass - in Class { - magic = 0xCAFEBABE, - minorVersion = 0, - majorVersion = 50, + d = defaultClass :: Class Direct + in d { constsPoolSize = fromIntegral (M.size pool), constsPool = pool, accessFlags = accessFile2Direct accessFlags, @@ -58,13 +57,12 @@ classFile2Direct (Class {..}) = classAttributes = attributesFile2Direct pool classAttributes } classDirect2File :: Class Direct -> Class File -classDirect2File (Class {..}) = Class { - magic = 0xCAFEBABE, - minorVersion = 0, - majorVersion = 50, +classDirect2File (Class {..}) = + let d = defaultClass :: Class File + in d { constsPoolSize = fromIntegral (M.size poolInfo + 1), constsPool = poolInfo, - accessFlags = access2word16 accessFlags, + accessFlags = accessDirect2File accessFlags, thisClass = force "this" $ poolClassIndex poolInfo thisClass, superClass = force "super" $ poolClassIndex poolInfo superClass, interfacesCount = fromIntegral (length interfaces), @@ -141,7 +139,7 @@ poolNTIndex list x@(NameType n t) = do fieldDirect2File :: Pool File -> Field Direct -> Field File fieldDirect2File pool (Field {..}) = Field { - fieldAccessFlags = access2word16 fieldAccessFlags, + fieldAccessFlags = accessDirect2File fieldAccessFlags, fieldName = force "field name" $ poolIndex pool fieldName, fieldSignature = force "signature" $ poolIndex pool (encode fieldSignature), fieldAttributesCount = fromIntegral (arsize fieldAttributes), @@ -152,7 +150,7 @@ fieldDirect2File pool (Field {..}) = Field { methodDirect2File :: Pool File -> Method Direct -> Method File methodDirect2File pool (Method {..}) = Method { - methodAccessFlags = access2word16 methodAccessFlags, + methodAccessFlags = accessDirect2File methodAccessFlags, methodName = force "method name" $ poolIndex pool methodName, methodSignature = force "method sig" $ poolIndex pool (encode methodSignature), methodAttributesCount = fromIntegral (arsize methodAttributes), @@ -207,8 +205,8 @@ accessFile2Direct w = S.fromList $ concat $ zipWith (\i f -> if testBit w i then ACC_INTERFACE, ACC_ABSTRACT ] -access2word16 :: AccessFlags Direct -> AccessFlags File -access2word16 fs = bitsOr $ map toBit $ S.toList fs +accessDirect2File :: AccessFlags Direct -> AccessFlags File +accessDirect2File fs = bitsOr $ map toBit $ S.toList fs where bitsOr = foldl (.|.) 0 toBit f = 1 `shiftL` (fromIntegral $ fromEnum f)