cabal: bump data-default dependency to 0.5.0.
[hs-java.git] / TestGen.hs
1 {-# LANGUAGE OverloadedStrings, FlexibleContexts #-}
2
3 import Control.Monad.Exception
4 import qualified Data.ByteString.Lazy as B
5
6 import JVM.ClassFile
7 import JVM.Converter
8 import JVM.Assembler
9 import JVM.Builder
10 import JVM.Exceptions
11 import Java.ClassPath
12
13 import qualified Java.Lang
14 import qualified Java.IO
15
16 test :: (Throws ENotFound e, Throws ENotLoaded e, Throws UnexpectedEndMethod e) => GenerateIO e ()
17 test = do
18   withClassPath $ do
19       -- Add current directory (with Hello.class) to ClassPath
20       addDirectory "."
21
22   -- Load method signature: Hello.hello() from Hello.class
23   helloJava <- getClassMethod "./Hello" "hello"
24
25   -- Initializer method. Just calls java.lang.Object.<init>
26   newMethod [ACC_PUBLIC] "<init>" [] ReturnsVoid $ do
27       setStackSize 1
28
29       aload_ I0
30       invokeSpecial Java.Lang.object Java.Lang.objectInit
31       i0 RETURN
32
33   -- Declare hello() method and bind it's signature to hello.
34   hello <- newMethod [ACC_PUBLIC, ACC_STATIC] "hello" [IntType] ReturnsVoid $ do
35       setStackSize 8
36
37       getStaticField Java.Lang.system Java.IO.out
38       loadString "Здравствуй, мир!"
39       invokeVirtual Java.IO.printStream Java.IO.println
40       getStaticField Java.Lang.system Java.IO.out
41       loadString "Argument: %d\n"
42       iconst_1
43       allocArray Java.Lang.object
44       dup
45       iconst_0
46       iload_ I0
47       invokeStatic Java.Lang.integer Java.Lang.valueOfInteger
48       aastore
49       invokeVirtual Java.IO.printStream Java.IO.printf
50       -- Call Hello.hello()
51       invokeStatic "Hello" helloJava
52       pop
53       i0 RETURN
54
55   -- Main class method. 
56   newMethod [ACC_PUBLIC, ACC_STATIC] "main" [arrayOf Java.Lang.stringClass] ReturnsVoid $ do
57       setStackSize 1
58
59       iconst_5
60       -- Call previously declared method
61       invokeStatic "Test" hello
62       i0 RETURN
63
64   return ()
65
66 main :: IO ()
67 main = do
68   testClass <- generateIO [] "Test" test
69   B.writeFile "Test.class" (encodeClass testClass)
70