Properly parse Code attribute.
[hs-java.git] / disassemble.hs
1 {-# LANGUAGE OverloadedStrings #-}
2 import Control.Monad
3 import System.Environment
4 import qualified Data.ByteString.Lazy as B
5
6 import Data.BinaryState
7 import JVM.Types
8 import JVM.Converter
9 import JVM.Assembler
10
11 main = do
12   args <- getArgs
13   case args of
14     [clspath] -> do
15       cls <- decompileFile clspath
16       putStr "Class: "
17       B.putStrLn (this cls)
18       putStrLn "Methods:"
19       forM_ (methods cls) $ \m -> do
20         putStr ">> Method "
21         B.putStrLn (methodName m)
22         case attrByName m "Code" of
23           Nothing -> putStrLn "(no code)\n"
24           Just bytecode -> let code = decodeS (0 :: Integer) bytecode
25                            in  forM_ (codeInstructions code) $ \i -> do
26                                  putStr "  "
27                                  print i
28
29     _ -> error "Synopsis: disassemble File.class"