X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=TestGen.hs;h=31e71c0676ae0255d345a46d8ac1d6a502dd1dd5;hb=4174461dc7cd2b14183917db3cd11219a37e804c;hp=540a7da0d139ae257eea1ba39936679cec3755ce;hpb=5f0e7d26a4a5c125b8f68539505d831352e9515b;p=hs-java.git diff --git a/TestGen.hs b/TestGen.hs index 540a7da..31e71c0 100644 --- a/TestGen.hs +++ b/TestGen.hs @@ -2,35 +2,36 @@ import qualified Data.ByteString.Lazy as B -import JVM.Types import JVM.ClassFile import JVM.Converter import JVM.Assembler -import JVM.Generator -import JVM.Generator.Instructions +import JVM.Builder +import Java.ClassPath import qualified Java.Lang import qualified Java.IO -hello :: NameType Method -hello = NameType "hello" $ MethodSignature [IntType] ReturnsVoid +test :: GenerateIO () +test = do + withClassPath $ do + -- Add current directory (with Hello.class) to ClassPath + addDirectory "." -valueOf :: NameType Method -valueOf = NameType "valueOf" $ MethodSignature [IntType] (Returns Java.Lang.integerClass) + -- Load method signature: Hello.hello() + helloJava <- getClassMethod "./Hello" "hello" -test :: Generate () -test = do + -- 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 - newMethod [ACC_PUBLIC, ACC_STATIC] "main" [Array Nothing Java.Lang.stringClass] ReturnsVoid $ do - iconst_5 - invokeStatic "Test" hello - i0 RETURN + -- Declare hello() method and bind it's signature to hello. + hello <- newMethod [ACC_PUBLIC, ACC_STATIC] "hello" [IntType] ReturnsVoid $ do + setStackSize 8 - newMethod [ACC_PUBLIC, ACC_STATIC] "hello" [IntType] ReturnsVoid $ do getStaticField Java.Lang.system Java.IO.out loadString "Здравствуй, мир!" invokeVirtual Java.IO.printStream Java.IO.println @@ -41,14 +42,27 @@ test = do dup iconst_0 iload_ I0 - invokeStatic Java.Lang.integer valueOf + invokeStatic Java.Lang.integer Java.Lang.valueOfInteger aastore invokeVirtual Java.IO.printStream Java.IO.printf + -- Call Hello.hello() + invokeStatic "Hello" helloJava pop i0 RETURN -testClass = generate "Test" test + -- 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 <- generateIO [] "Test" test B.writeFile "Test.class" (encodeClass testClass)