Support for loading field/method signatures in Generate monad.
[hs-java.git] / TestGen.hs
1 {-# LANGUAGE OverloadedStrings #-}
2
3 import qualified Data.ByteString.Lazy as B
4
5 import JVM.ClassFile
6 import JVM.Converter
7 import JVM.Assembler
8 import JVM.Builder
9 import Java.ClassPath
10
11 import qualified Java.Lang
12 import qualified Java.IO
13
14 test :: Generate ()
15 test = do
16   withClassPath $ do
17       addDirectory "."
18
19   helloJava <- getClassMethod "./Hello" "hello"
20
21   newMethod [ACC_PUBLIC] "<init>" [] ReturnsVoid $ do
22       setStackSize 1
23
24       aload_ I0
25       invokeSpecial Java.Lang.object Java.Lang.objectInit
26       i0 RETURN
27
28   hello <- newMethod [ACC_PUBLIC, ACC_STATIC] "hello" [IntType] ReturnsVoid $ do
29       setStackSize 8
30
31       getStaticField Java.Lang.system Java.IO.out
32       loadString "Здравствуй, мир!"
33       invokeVirtual Java.IO.printStream Java.IO.println
34       getStaticField Java.Lang.system Java.IO.out
35       loadString "Argument: %d\n"
36       iconst_1
37       allocArray Java.Lang.object
38       dup
39       iconst_0
40       iload_ I0
41       invokeStatic Java.Lang.integer Java.Lang.valueOfInteger
42       aastore
43       invokeVirtual Java.IO.printStream Java.IO.printf
44       invokeStatic "Hello" helloJava
45       pop
46       i0 RETURN
47
48   newMethod [ACC_PUBLIC, ACC_STATIC] "main" [arrayOf Java.Lang.stringClass] ReturnsVoid $ do
49       setStackSize 1
50
51       iconst_5
52       invokeStatic "Test" hello
53       i0 RETURN
54
55   return ()
56
57 main = do
58   testClass <- generate [] "Test" test
59   B.writeFile "Test.class" (encodeClass testClass)
60