Some documentation.
[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       -- Add current directory (with Hello.class) to ClassPath
18       addDirectory "."
19
20   -- Load method signature: Hello.hello()
21   helloJava <- getClassMethod "./Hello" "hello"
22
23   -- Initializer method. Just calls java.lang.Object.<init>
24   newMethod [ACC_PUBLIC] "<init>" [] ReturnsVoid $ do
25       setStackSize 1
26
27       aload_ I0
28       invokeSpecial Java.Lang.object Java.Lang.objectInit
29       i0 RETURN
30
31   -- Declare hello() method and bind it's signature to hello.
32   hello <- newMethod [ACC_PUBLIC, ACC_STATIC] "hello" [IntType] ReturnsVoid $ do
33       setStackSize 8
34
35       getStaticField Java.Lang.system Java.IO.out
36       loadString "Здравствуй, мир!"
37       invokeVirtual Java.IO.printStream Java.IO.println
38       getStaticField Java.Lang.system Java.IO.out
39       loadString "Argument: %d\n"
40       iconst_1
41       allocArray Java.Lang.object
42       dup
43       iconst_0
44       iload_ I0
45       invokeStatic Java.Lang.integer Java.Lang.valueOfInteger
46       aastore
47       invokeVirtual Java.IO.printStream Java.IO.printf
48       invokeStatic "Hello" helloJava
49       pop
50       i0 RETURN
51
52   -- Main class method. 
53   newMethod [ACC_PUBLIC, ACC_STATIC] "main" [arrayOf Java.Lang.stringClass] ReturnsVoid $ do
54       setStackSize 1
55
56       iconst_5
57       -- Call previously declared method
58       invokeStatic "Test" hello
59       i0 RETURN
60
61   return ()
62
63 main :: IO ()
64 main = do
65   testClass <- generate [] "Test" test
66   B.writeFile "Test.class" (encodeClass testClass)
67