X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=JVM%2FAssembler.hs;h=c80363bf743c6b97613698969a618ffb961bc895;hb=42584fde70cbc5485232748e8e94d0cfa8df8d51;hp=b29eae847cdeb293dacb72c96b2da62db883e248;hpb=55d6741452443c59d700c01de495f50b56eb6f30;p=hs-java.git diff --git a/JVM/Assembler.hs b/JVM/Assembler.hs index b29eae8..c80363b 100644 --- a/JVM/Assembler.hs +++ b/JVM/Assembler.hs @@ -10,6 +10,7 @@ module JVM.Assembler Code (..), IMM (..), CMP (..), + atype2byte, encodeInstructions, encodeMethod, decodeMethod @@ -53,7 +54,7 @@ data Code = Code { codeExceptionsN :: Word16, codeExceptions :: [CodeException], codeAttrsN :: Word16, - codeAttributes :: Attributes Pointers } + codeAttributes :: Attributes File } deriving (Eq, Show) -- | Exception descriptor @@ -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 @@ -238,10 +239,10 @@ data Instruction = | LCMP -- ^ 148 | FCMP CMP -- ^ 149, 150 | DCMP CMP -- ^ 151, 152 - | IF CMP -- ^ 153, 154, 155, 156, 157, 158 + | IF CMP Word16 -- ^ 153, 154, 155, 156, 157, 158 | IF_ICMP CMP Word16 -- ^ 159, 160, 161, 162, 163, 164 | IF_ACMP CMP Word16 -- ^ 165, 166 - | GOTO -- ^ 167 + | GOTO Word16 -- ^ 167 | JSR Word16 -- ^ 168 | RET -- ^ 169 | TABLESWITCH Word32 Word32 Word32 [Word32] -- ^ 170 @@ -250,6 +251,7 @@ data Instruction = | LRETURN -- ^ 173 | FRETURN -- ^ 174 | DRETURN -- ^ 175 + | ARETURN -- ^ 176 | RETURN -- ^ 177 | GETSTATIC Word16 -- ^ 178 | PUTSTATIC Word16 -- ^ 179 @@ -474,12 +476,12 @@ instance BinaryState Integer Instruction where put (DCMP C_LT) = putByte 151 put (DCMP C_GT) = putByte 152 put (DCMP c) = fail $ "No such instruction: DCMP " ++ show c - put (IF c) = putByte (fromIntegral $ 153 + fromEnum c) + put (IF c x) = putByte (fromIntegral $ 153 + fromEnum c) >> put x put (IF_ACMP C_EQ x) = put1 165 x put (IF_ACMP C_NE x) = put1 166 x put (IF_ACMP c _) = fail $ "No such instruction: IF_ACMP " ++ show c put (IF_ICMP c x) = putByte (fromIntegral $ 159 + fromEnum c) >> put x - put GOTO = putByte 167 + put (GOTO x) = put1 167 x put (JSR x) = put1 168 x put RET = putByte 169 put (TABLESWITCH def low high offs) = do @@ -502,6 +504,7 @@ instance BinaryState Integer Instruction where put LRETURN = putByte 173 put FRETURN = putByte 174 put DRETURN = putByte 175 + put ARETURN = putByte 176 put RETURN = putByte 177 put (GETSTATIC x) = put1 178 x put (PUTSTATIC x) = put1 179 x @@ -645,7 +648,7 @@ instance BinaryState Integer Instruction where 152 -> return $ DCMP C_GT 165 -> IF_ACMP C_EQ <$> get 166 -> IF_ACMP C_NE <$> get - 167 -> return GOTO + 167 -> GOTO <$> get 168 -> JSR <$> get 169 -> return RET 170 -> do @@ -669,6 +672,7 @@ instance BinaryState Integer Instruction where 173 -> return LRETURN 174 -> return FRETURN 175 -> return DRETURN + 176 -> return ARETURN 177 -> return RETURN 178 -> GETSTATIC <$> get 179 -> PUTSTATIC <$> get @@ -703,10 +707,11 @@ instance BinaryState Integer Instruction where | inRange (34, 37) c -> imm 34 FLOAD_ c | inRange (38, 41) c -> imm 38 DLOAD_ c | inRange (42, 45) c -> imm 42 ALOAD_ c - | inRange (153, 158) c -> return $ IF (toEnum $ fromIntegral $ c-153) + | inRange (153, 158) c -> IF (toEnum $ fromIntegral $ c-153) <$> get | 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