X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=TestGen.hs;h=9d1bcd8caa43ae249056e1978970aee27106c8eb;hb=743c0f2dca8434e69cce8389630091d37c28bc25;hp=c0635252852c296604dfecb364ccefd5a3a7d7a2;hpb=16704d16f8e156bed9ff846c7fddee113f0f4057;p=hs-java.git diff --git a/TestGen.hs b/TestGen.hs index c063525..9d1bcd8 100644 --- a/TestGen.hs +++ b/TestGen.hs @@ -1,64 +1,70 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE OverloadedStrings, FlexibleContexts #-} +import Control.Monad.Exception 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 JVM.Exceptions +import Java.ClassPath -initNT :: NameType Method -initNT = NameType "" $ MethodSignature [] ReturnsVoid +import qualified Java.Lang +import qualified Java.IO -helloNT :: NameType Method -helloNT = NameType "hello" $ MethodSignature [IntType] ReturnsVoid - -printlnNT :: NameType Method -printlnNT = NameType "println" $ MethodSignature [ObjectType "java/lang/String"] ReturnsVoid - -outNT :: NameType Field -outNT = NameType "out" $ ObjectType "java/io/PrintStream" - -valueOfNT :: NameType Method -valueOfNT = NameType "valueOf" $ MethodSignature [IntType] (Returns $ ObjectType "java/lang/Integer") +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 "." -printfNT :: NameType Method -printfNT = NameType "printf" $ MethodSignature [ObjectType "java/lang/String", - Array Nothing $ ObjectType "java/lang/Object"] (Returns $ ObjectType "java/io/PrintStream") + -- Load method signature: Hello.hello() from Hello.class + 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" initNT + invokeSpecial Java.Lang.object Java.Lang.objectInit i0 RETURN - newMethod [ACC_PUBLIC, ACC_STATIC] "main" [Array Nothing $ ObjectType "java/lang/String"] ReturnsVoid $ do - iconst_5 - invokeStatic "Test" helloNT - 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" outNT + getStaticField Java.Lang.system Java.IO.out loadString "Здравствуй, мир!" - invokeVirtual "java/io/PrintStream" printlnNT - getStaticField "java/lang/System" outNT + invokeVirtual Java.IO.printStream Java.IO.println + getStaticField Java.Lang.system Java.IO.out loadString "Argument: %d\n" iconst_1 - allocArray "java/lang/Object" + allocArray Java.Lang.object dup iconst_0 iload_ I0 - invokeStatic "java/lang/Integer" valueOfNT + invokeStatic Java.Lang.integer Java.Lang.valueOfInteger aastore - invokeVirtual "java/io/PrintStream" printfNT + 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)