projects
/
hs-java.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Support both IO and clean version of Generate monad.
[hs-java.git]
/
TestGen.hs
diff --git
a/TestGen.hs
b/TestGen.hs
index 540a7da0d139ae257eea1ba39936679cec3755ce..31e71c0676ae0255d345a46d8ac1d6a502dd1dd5 100644
(file)
--- a/
TestGen.hs
+++ b/
TestGen.hs
@@
-2,35
+2,36
@@
import qualified Data.ByteString.Lazy as B
import qualified Data.ByteString.Lazy as B
-import JVM.Types
import JVM.ClassFile
import JVM.Converter
import JVM.Assembler
import JVM.ClassFile
import JVM.Converter
import JVM.Assembler
-import JVM.
Generato
r
-import J
VM.Generator.Instructions
+import JVM.
Builde
r
+import J
ava.ClassPath
import qualified Java.Lang
import qualified Java.IO
import qualified Java.Lang
import qualified Java.IO
-hello :: NameType Method
-hello = NameType "hello" $ MethodSignature [IntType] ReturnsVoid
+test :: GenerateIO ()
+test = do
+ withClassPath $ do
+ -- Add current directory (with Hello.class) to ClassPath
+ addDirectory "."
-valueOf :: NameType Method
-valueOf = NameType "valueOf" $ MethodSignature [IntType] (Returns Java.Lang.integerClass)
+ -- Load method signature: Hello.hello()
+ helloJava <- getClassMethod "./Hello" "hello"
-test :: Generate ()
-test = do
+ -- Initializer method. Just calls java.lang.Object.<init>
newMethod [ACC_PUBLIC] "<init>" [] ReturnsVoid $ do
newMethod [ACC_PUBLIC] "<init>" [] ReturnsVoid $ do
+ setStackSize 1
+
aload_ I0
invokeSpecial Java.Lang.object Java.Lang.objectInit
i0 RETURN
aload_ I0
invokeSpecial Java.Lang.object Java.Lang.objectInit
i0 RETURN
- newMethod [ACC_PUBLIC, ACC_STATIC] "main" [Array Nothing Java.Lang.stringClass] ReturnsVoid $ do
- iconst_5
- invokeStatic "Test" hello
- i0 RETURN
+ -- Declare hello() method and bind it's signature to hello.
+ hello <- newMethod [ACC_PUBLIC, ACC_STATIC] "hello" [IntType] ReturnsVoid $ do
+ setStackSize 8
- newMethod [ACC_PUBLIC, ACC_STATIC] "hello" [IntType] ReturnsVoid $ do
getStaticField Java.Lang.system Java.IO.out
loadString "Здравствуй, мир!"
invokeVirtual Java.IO.printStream Java.IO.println
getStaticField Java.Lang.system Java.IO.out
loadString "Здравствуй, мир!"
invokeVirtual Java.IO.printStream Java.IO.println
@@
-41,14
+42,27
@@
test = do
dup
iconst_0
iload_ I0
dup
iconst_0
iload_ I0
- invokeStatic Java.Lang.integer
valueOf
+ invokeStatic Java.Lang.integer
Java.Lang.valueOfInteger
aastore
invokeVirtual Java.IO.printStream Java.IO.printf
aastore
invokeVirtual Java.IO.printStream Java.IO.printf
+ -- Call Hello.hello()
+ invokeStatic "Hello" helloJava
pop
i0 RETURN
pop
i0 RETURN
-testClass = generate "Test" test
+ -- Main class method.
+ newMethod [ACC_PUBLIC, ACC_STATIC] "main" [arrayOf Java.Lang.stringClass] ReturnsVoid $ do
+ setStackSize 1
+
+ iconst_5
+ -- Call previously declared method
+ invokeStatic "Test" hello
+ i0 RETURN
+
+ return ()
+main :: IO ()
main = do
main = do
+ testClass <- generateIO [] "Test" test
B.writeFile "Test.class" (encodeClass testClass)
B.writeFile "Test.class" (encodeClass testClass)