Allow setting stack size and locals number for each method.
[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
10 import qualified Java.Lang
11 import qualified Java.IO
12
13 test :: Generate ()
14 test = do
15   newMethod [ACC_PUBLIC] "<init>" [] ReturnsVoid $ do
16       setStackSize 1
17
18       aload_ I0
19       invokeSpecial Java.Lang.object Java.Lang.objectInit
20       i0 RETURN
21
22   hello <- newMethod [ACC_PUBLIC, ACC_STATIC] "hello" [IntType] ReturnsVoid $ do
23       setStackSize 8
24
25       getStaticField Java.Lang.system Java.IO.out
26       loadString "Здравствуй, мир!"
27       invokeVirtual Java.IO.printStream Java.IO.println
28       getStaticField Java.Lang.system Java.IO.out
29       loadString "Argument: %d\n"
30       iconst_1
31       allocArray Java.Lang.object
32       dup
33       iconst_0
34       iload_ I0
35       invokeStatic Java.Lang.integer Java.Lang.valueOfInteger
36       aastore
37       invokeVirtual Java.IO.printStream Java.IO.printf
38       pop
39       i0 RETURN
40
41   newMethod [ACC_PUBLIC, ACC_STATIC] "main" [arrayOf Java.Lang.stringClass] ReturnsVoid $ do
42       setStackSize 1
43
44       iconst_5
45       invokeStatic "Test" hello
46       i0 RETURN
47
48   return ()
49
50 testClass ::  Class Resolved
51 testClass = generate "Test" test
52
53 main = do
54   B.writeFile "Test.class" (encodeClass testClass)
55