gen
res = execState generator emptyGState
code = genCode res
- in Class {
- magic = 0xCAFEBABE,
- minorVersion = 0,
- majorVersion = 50,
+ d = defaultClass :: Class Direct
+ in d {
constsPoolSize = fromIntegral $ M.size (currentPool res),
constsPool = currentPool res,
accessFlags = S.fromList [ACC_PUBLIC, ACC_STATIC],
thisClass = name,
superClass = "java/lang/Object",
- interfacesCount = 0,
- interfaces = [],
- classFieldsCount = 0,
- classFields = [],
classMethodsCount = fromIntegral $ length (doneMethods res),
- classMethods = doneMethods res,
- classAttributesCount = 0,
- classAttributes = AR M.empty }
+ classMethods = doneMethods res }
Constant (..),
AccessFlag (..), AccessFlags,
Attributes (..),
+ defaultClass,
-- * Misc
HasSignature (..), HasAttributes (..),
NameType (..),
import Data.Binary.Put
import Data.Char
import Data.List
+import Data.Default
import qualified Data.Set as S
import qualified Data.Map as M
import qualified Data.ByteString.Lazy as B
data instance Attributes File = AP {attributesList :: [Attribute]}
deriving (Eq, Show)
+instance Default (Attributes File) where
+ def = AP []
+
-- | At Direct stage, attributes are represented as a Map.
data instance Attributes Direct = AR (M.Map B.ByteString B.ByteString)
deriving (Eq, Show)
+instance Default (Attributes Direct) where
+ def = AR M.empty
+
-- | Size of attributes set at Direct stage
arsize :: Attributes Direct -> Int
arsize (AR m) = M.size m
deriving instance Eq (Constant Direct)
deriving instance Show (Constant File)
+defaultClass :: (Default (AccessFlags stage), Default (Link stage B.ByteString), Default (Attributes stage))
+ => Class stage
+defaultClass = Class {
+ magic = 0xCAFEBABE,
+ minorVersion = 0,
+ majorVersion = 50,
+ constsPoolSize = 0,
+ constsPool = def,
+ accessFlags = def,
+ thisClass = def,
+ superClass = def,
+ interfacesCount = 0,
+ interfaces = [],
+ classFieldsCount = 0,
+ classFields = [],
+ classMethodsCount = 0,
+ classMethods = [],
+ classAttributesCount = 0,
+ classAttributes = def }
+
instance Binary (Class File) where
put (Class {..}) = do
put magic
import Data.Char
import Data.String
import qualified Data.Map as M
+import Data.Default
import JVM.ClassFile
+instance Default B.ByteString where
+ def = B.empty
+
+instance Default Word16 where
+ def = 0
+
instance IsString B.ByteString where
fromString s = B.pack $ map (fromIntegral . ord) $ encodeString s
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
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,