X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=TestGen.hs;h=31e71c0676ae0255d345a46d8ac1d6a502dd1dd5;hb=4174461dc7cd2b14183917db3cd11219a37e804c;hp=175e10b1b79a1f8a153baf35058f78d8027edf45;hpb=736d0e920159839bf89dff10cc27583b91fc7216;p=hs-java.git diff --git a/TestGen.hs b/TestGen.hs index 175e10b..31e71c0 100644 --- a/TestGen.hs +++ b/TestGen.hs @@ -6,18 +6,32 @@ import JVM.ClassFile import JVM.Converter import JVM.Assembler import JVM.Builder +import Java.ClassPath import qualified Java.Lang import qualified Java.IO -test :: Generate () +test :: GenerateIO () test = do + withClassPath $ do + -- Add current directory (with Hello.class) to ClassPath + addDirectory "." + + -- Load method signature: Hello.hello() + helloJava <- getClassMethod "./Hello" "hello" + + -- Initializer method. Just calls java.lang.Object. newMethod [ACC_PUBLIC] "" [] ReturnsVoid $ do + setStackSize 1 + aload_ I0 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 + getStaticField Java.Lang.system Java.IO.out loadString "Здравствуй, мир!" invokeVirtual Java.IO.printStream Java.IO.println @@ -31,19 +45,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 () -testClass :: Class Resolved -testClass = generate "Test" test - +main :: IO () main = do + testClass <- generateIO [] "Test" test B.writeFile "Test.class" (encodeClass testClass)