{-# LANGUAGE OverloadedStrings #-} import Control.Monad import Data.Array import Data.Binary import System.Environment import qualified Data.ByteString.Lazy as B import Text.Printf import JVM.Types import JVM.ClassFile import JVM.Converter import JVM.Assembler main = do args <- getArgs case args of [clspath,outpath] -> do cls <- parseClassFile clspath clsfile <- decodeFile clspath :: IO ClassFile putStr "Class: " B.putStrLn (this cls) putStrLn "Constants pool:" forM_ (assocs $ constantPool cls) $ \(i, c) -> putStrLn $ printf " #%d:\t%s" i (show c) putStrLn "Methods:" forM_ (methods cls) $ \m -> do putStr ">> Method " B.putStr (methodName m) print (methodSignature m) case attrByName m "Code" of Nothing -> putStrLn "(no code)\n" Just bytecode -> let code = decodeMethod bytecode in forM_ (codeInstructions code) $ \i -> do putStr " " print i putStrLn $ "Source pool:\n" ++ showListIx (constsPool clsfile) let result = classFile cls putStrLn $ "Result pool:\n" ++ showListIx (constsPool result) B.writeFile outpath (encodeClass cls) _ -> error "Synopsis: rebuild-class File.class Output.class"