JVM assembler/disassembler tested to work on Hello.java.
[hs-java.git] / rebuild-class.hs
1 {-# LANGUAGE OverloadedStrings #-}
2
3 import Control.Monad
4 import Data.Array
5 import Data.Binary
6 import System.Environment
7 import qualified Data.ByteString.Lazy as B
8 import Text.Printf
9
10 import JVM.Types
11 import JVM.ClassFile
12 import JVM.Converter
13 import JVM.Assembler
14
15 main = do
16   args <- getArgs
17   case args of
18     [clspath,outpath] -> do
19       cls <- parseClassFile clspath
20       clsfile <- decodeFile clspath :: IO ClassFile
21       putStr "Class: "
22       B.putStrLn (this cls)
23       putStrLn "Constants pool:"
24       forM_ (assocs $ constantPool cls) $ \(i, c) ->
25         putStrLn $ printf "  #%d:\t%s" i (show c)
26       putStrLn "Methods:"
27       forM_ (methods cls) $ \m -> do
28         putStr ">> Method "
29         B.putStr (methodName m)
30         print (methodSignature m)
31         case attrByName m "Code" of
32           Nothing -> putStrLn "(no code)\n"
33           Just bytecode -> let code = decodeMethod bytecode
34                            in  forM_ (codeInstructions code) $ \i -> do
35                                  putStr "  "
36                                  print i
37       putStrLn $ "Source pool:\n" ++ showListIx (constsPool clsfile)
38       let result = classFile cls
39       putStrLn $ "Result pool:\n" ++ showListIx (constsPool result)
40       B.writeFile outpath (encodeClass cls)
41
42     _ -> error "Synopsis: rebuild-class File.class Output.class"