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.ByteString.Lazy.Char8 ()
import qualified Data.Set as S
import qualified Data.Map as M
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,
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),
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),
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),
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)