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