37a52e614dd189f7b7cc01be1360eb35cf6e9b2e
[hs-java.git] / dump-class.hs
1 {-# LANGUAGE OverloadedStrings #-}
2 module Main where
3
4 import Control.Monad
5 import Data.Array
6 import System.Environment
7 import qualified Data.ByteString.Lazy as B
8 import Text.Printf
9
10 import JVM.Types
11 import JVM.Converter
12 import JVM.Assembler
13
14 main = do
15   args <- getArgs
16   case args of
17     [clspath] -> do
18       cls <- parseClassFile clspath
19       putStr "Class: "
20       B.putStrLn (this cls)
21       putStrLn "Constants pool:"
22       forM_ (assocs $ constantPool cls) $ \(i, c) ->
23         putStrLn $ printf "  #%d:\t%s" i (show c)
24       putStrLn "Methods:"
25       forM_ (methods cls) $ \m -> do
26         putStr ">> Method "
27         B.putStr (methodName m)
28         print (methodSignature m)
29         case attrByName m "Code" of
30           Nothing -> putStrLn "(no code)\n"
31           Just bytecode -> let code = decodeMethod bytecode
32                            in  forM_ (codeInstructions code) $ \i -> do
33                                  putStr "  "
34                                  print i
35
36     _ -> error "Synopsis: dump-class File.class"
37