X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=hs-java.git;a=blobdiff_plain;f=TestGen.hs;h=9d1bcd8caa43ae249056e1978970aee27106c8eb;hp=900a422dd5778892483b970457018cfd32094ad0;hb=HEAD;hpb=2872ad36144dae1b896f93d490c0e62d55f891b1 diff --git a/TestGen.hs b/TestGen.hs index 900a422..9d1bcd8 100644 --- a/TestGen.hs +++ b/TestGen.hs @@ -1,17 +1,28 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE OverloadedStrings, FlexibleContexts #-} +import Control.Monad.Exception import qualified Data.ByteString.Lazy as B import JVM.ClassFile import JVM.Converter import JVM.Assembler import JVM.Builder +import JVM.Exceptions +import Java.ClassPath import qualified Java.Lang import qualified Java.IO -test :: Generate () +test :: (Throws ENotFound e, Throws ENotLoaded e, Throws UnexpectedEndMethod e) => GenerateIO e () test = do + withClassPath $ do + -- Add current directory (with Hello.class) to ClassPath + addDirectory "." + + -- Load method signature: Hello.hello() from Hello.class + helloJava <- getClassMethod "./Hello" "hello" + + -- Initializer method. Just calls java.lang.Object. newMethod [ACC_PUBLIC] "" [] ReturnsVoid $ do setStackSize 1 @@ -19,6 +30,7 @@ test = do invokeSpecial Java.Lang.object Java.Lang.objectInit i0 RETURN + -- Declare hello() method and bind it's signature to hello. hello <- newMethod [ACC_PUBLIC, ACC_STATIC] "hello" [IntType] ReturnsVoid $ do setStackSize 8 @@ -35,19 +47,24 @@ test = do invokeStatic Java.Lang.integer Java.Lang.valueOfInteger aastore invokeVirtual Java.IO.printStream Java.IO.printf + -- Call Hello.hello() + invokeStatic "Hello" helloJava pop i0 RETURN + -- Main class method. newMethod [ACC_PUBLIC, ACC_STATIC] "main" [arrayOf Java.Lang.stringClass] ReturnsVoid $ do setStackSize 1 iconst_5 + -- Call previously declared method invokeStatic "Test" hello i0 RETURN return () +main :: IO () main = do - testClass <- generate [] "Test" test + testClass <- generateIO [] "Test" test B.writeFile "Test.class" (encodeClass testClass)