Add declarations for some standard Java classes/methods/fields.
[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 valueOf :: NameType Method
19 valueOf = NameType "valueOf" $ MethodSignature [IntType] (Returns Java.Lang.integerClass)
20
21 test :: Generate ()
22 test = do
23   newMethod [ACC_PUBLIC] "<init>" [] ReturnsVoid $ do
24       aload_ I0
25       invokeSpecial Java.Lang.object Java.Lang.objectInit
26       i0 RETURN
27
28   newMethod [ACC_PUBLIC, ACC_STATIC] "main" [Array Nothing Java.Lang.stringClass] ReturnsVoid $ do
29       iconst_5
30       invokeStatic "Test" hello
31       i0 RETURN
32
33   newMethod [ACC_PUBLIC, ACC_STATIC] "hello" [IntType] ReturnsVoid $ do
34       getStaticField Java.Lang.system Java.IO.out
35       loadString "Здравствуй, мир!"
36       invokeVirtual Java.IO.printStream Java.IO.println
37       getStaticField Java.Lang.system Java.IO.out
38       loadString "Argument: %d\n"
39       iconst_1
40       allocArray Java.Lang.object
41       dup
42       iconst_0
43       iload_ I0
44       invokeStatic Java.Lang.integer valueOf
45       aastore
46       invokeVirtual Java.IO.printStream Java.IO.printf
47       pop
48       i0 RETURN
49
50 testClass = generate "Test" test
51
52 main = do
53   B.writeFile "Test.class" (encodeClass testClass)
54