X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=TestGen.hs;h=9d1bcd8caa43ae249056e1978970aee27106c8eb;hb=33dc6f7bdcdc770332723ea519df4c923eb3d933;hp=a42fa052c64ee8e058ad68b17c4707dc13eb3315;hpb=0efcccbb68402feefe2aed7d0d0f091c18f97f14;p=hs-java.git diff --git a/TestGen.hs b/TestGen.hs index a42fa05..9d1bcd8 100644 --- a/TestGen.hs +++ b/TestGen.hs @@ -1,28 +1,39 @@ -{-# 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 import qualified Java.Lang import qualified Java.IO -hello :: NameType Method -hello = NameType "hello" $ MethodSignature [IntType] ReturnsVoid - -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 + 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 @@ -36,18 +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 - newMethod [ACC_PUBLIC, ACC_STATIC] "main" [Array Nothing Java.Lang.stringClass] ReturnsVoid $ do + -- 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 = generate "Test" test - +main :: IO () main = do + testClass <- generateIO [] "Test" test B.writeFile "Test.class" (encodeClass testClass)