X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=JVM%2FAssembler.hs;h=7ac59c64a0915734a64e55f261d51ac32e9f95bf;hb=d47b4af2d4cf72352782e8c88a6e03670ca15737;hp=b86bdbba7c2372d362e3f1116cc96b06f6aaab88;hpb=afbece7c7a823691d1e17743aec4d94a930864c8;p=hs-java.git diff --git a/JVM/Assembler.hs b/JVM/Assembler.hs index b86bdbb..7ac59c6 100644 --- a/JVM/Assembler.hs +++ b/JVM/Assembler.hs @@ -10,6 +10,7 @@ module JVM.Assembler Code (..), IMM (..), CMP (..), + atype2byte, encodeInstructions, encodeMethod, decodeMethod @@ -18,10 +19,10 @@ module JVM.Assembler import Control.Monad import Control.Applicative +import Data.Ix (inRange) import Data.Word import qualified Data.Binary as Binary import qualified Data.ByteString.Lazy as B -import Data.Array import Data.BinaryState import JVM.ClassFile @@ -53,7 +54,7 @@ data Code = Code { codeExceptionsN :: Word16, codeExceptions :: [CodeException], codeAttrsN :: Word16, - codeAttributes :: [AttributeInfo] } + codeAttributes :: Attributes File } deriving (Eq, Show) -- | Exception descriptor @@ -73,7 +74,7 @@ instance BinaryState Integer CodeException where get = CodeException <$> get <*> get <*> get <*> get -instance BinaryState Integer AttributeInfo where +instance BinaryState Integer Attribute where put a = do let sz = 6 + attributeLength a -- full size of AttributeInfo structure liftOffset (fromIntegral sz) Binary.put a @@ -89,7 +90,7 @@ instance BinaryState Integer Code where put codeExceptionsN forM_ codeExceptions put put codeAttrsN - forM_ codeAttributes put + forM_ (attributesList codeAttributes) put get = do stackSz <- get @@ -102,7 +103,7 @@ instance BinaryState Integer Code where excs <- replicateM (fromIntegral excn) get nAttrs <- get attrs <- replicateM (fromIntegral nAttrs) get - return $ Code stackSz locals len code excn excs nAttrs attrs + return $ Code stackSz locals len code excn excs nAttrs (AP attrs) -- | Read sequence of instructions (to end of stream) readInstructions :: GetState Integer [Instruction] @@ -115,7 +116,7 @@ readInstructions = do next <- readInstructions return (x: next) --- | JVM instruction set +-- | JVM instruction set. For comments, see JVM specification. data Instruction = NOP -- ^ 0 | ACONST_NULL -- ^ 1 @@ -707,6 +708,7 @@ instance BinaryState Integer Instruction where | inRange (159, 164) c -> IF_ICMP (toEnum $ fromIntegral $ c-159) <$> get | otherwise -> fail $ "Unknown instruction byte code: " ++ show c +-- | Encode list of instructions encodeInstructions :: [Instruction] -> B.ByteString encodeInstructions code = let p list = forM_ list put