X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=JVM%2FAssembler.hs;h=b86bdbba7c2372d362e3f1116cc96b06f6aaab88;hb=afbece7c7a823691d1e17743aec4d94a930864c8;hp=d67f31c4fbead315c94de4dcb5d4b8d67ec6c1ae;hpb=e3c3550bcddba61a4a6e7c5f3715f0385fb4d739;p=hs-java.git diff --git a/JVM/Assembler.hs b/JVM/Assembler.hs index d67f31c..b86bdbb 100644 --- a/JVM/Assembler.hs +++ b/JVM/Assembler.hs @@ -6,9 +6,13 @@ module JVM.Assembler (Instruction (..), ArrayType (..), + CodeException (..), Code (..), IMM (..), - CMP (..) + CMP (..), + encodeInstructions, + encodeMethod, + decodeMethod ) where @@ -272,7 +276,7 @@ data Instruction = | JSR_W Word32 -- ^ 201 deriving (Eq, Show) --- ^ JVM array type (primitive types) +-- | JVM array type (primitive types) data ArrayType = T_BOOLEAN -- ^ 4 | T_CHAR -- ^ 5 @@ -284,14 +288,14 @@ data ArrayType = | T_LONG -- ^ 11 deriving (Eq, Show, Enum) --- ^ Parse opcode with immediate constant +-- | Parse opcode with immediate constant imm :: Word8 -- ^ Base opcode -> (IMM -> Instruction) -- ^ Instruction constructor -> Word8 -- ^ Opcode to parse -> GetState s Instruction imm base constr x = return $ constr $ toEnum $ fromIntegral (x-base) --- ^ Put opcode with immediate constant +-- | Put opcode with immediate constant putImm :: Word8 -- ^ Base opcode -> IMM -- ^ Constant to add to opcode -> PutState Integer () @@ -325,7 +329,7 @@ instance BinaryState Integer ArrayType where put t = putByte (atype2byte t) --- ^ Put opcode with one argument +-- | Put opcode with one argument put1 :: (BinaryState Integer a) => Word8 -- ^ Opcode -> a -- ^ First argument @@ -702,4 +706,17 @@ instance BinaryState Integer Instruction where | inRange (153, 158) c -> return $ IF (toEnum $ fromIntegral $ c-153) | inRange (159, 164) c -> IF_ICMP (toEnum $ fromIntegral $ c-159) <$> get | otherwise -> fail $ "Unknown instruction byte code: " ++ show c + +encodeInstructions :: [Instruction] -> B.ByteString +encodeInstructions code = + let p list = forM_ list put + in encodeWith p (0 :: Integer) code +-- | Decode Java method +decodeMethod :: B.ByteString -> Code +decodeMethod str = decodeS (0 :: Integer) str + +-- | Encode Java method +encodeMethod :: Code -> B.ByteString +encodeMethod code = encodeS (0 :: Integer) code +