Allow setting stack size and locals number for each method.
[hs-java.git] / TestGen.hs
index c0635252852c296604dfecb364ccefd5a3a7d7a2..886751ddc2eb81e9b9a3fb263409aa1508829113 100644 (file)
@@ -2,61 +2,52 @@
 
 import qualified Data.ByteString.Lazy as B
 
-import JVM.Types
 import JVM.ClassFile
 import JVM.Converter
 import JVM.Assembler
-import JVM.Generator
-import JVM.Generator.Instructions
+import JVM.Builder
 
-initNT :: NameType Method
-initNT = NameType "<init>" $ MethodSignature [] ReturnsVoid
-
-helloNT :: NameType Method
-helloNT = NameType "hello" $ MethodSignature [IntType] ReturnsVoid
-
-printlnNT :: NameType Method
-printlnNT = NameType "println" $ MethodSignature [ObjectType "java/lang/String"] ReturnsVoid
-
-outNT :: NameType Field
-outNT = NameType "out" $ ObjectType "java/io/PrintStream"
-
-valueOfNT :: NameType Method
-valueOfNT = NameType "valueOf" $ MethodSignature [IntType] (Returns $ ObjectType "java/lang/Integer")
-
-printfNT :: NameType Method
-printfNT = NameType "printf" $ MethodSignature [ObjectType "java/lang/String",
-                                                Array Nothing $ ObjectType "java/lang/Object"] (Returns $ ObjectType "java/io/PrintStream")
+import qualified Java.Lang
+import qualified Java.IO
 
 test :: Generate ()
 test = do
   newMethod [ACC_PUBLIC] "<init>" [] ReturnsVoid $ do
+      setStackSize 1
+
       aload_ I0
-      invokeSpecial "java/lang/Object" initNT
+      invokeSpecial Java.Lang.object Java.Lang.objectInit
       i0 RETURN
 
-  newMethod [ACC_PUBLIC, ACC_STATIC] "main" [Array Nothing $ ObjectType "java/lang/String"] ReturnsVoid $ do
-      iconst_5
-      invokeStatic "Test" helloNT
-      i0 RETURN
+  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" outNT
+      getStaticField Java.Lang.system Java.IO.out
       loadString "Здравствуй, мир!"
-      invokeVirtual "java/io/PrintStream" printlnNT
-      getStaticField "java/lang/System" outNT
+      invokeVirtual Java.IO.printStream Java.IO.println
+      getStaticField Java.Lang.system Java.IO.out
       loadString "Argument: %d\n"
       iconst_1
-      allocArray "java/lang/Object"
+      allocArray Java.Lang.object
       dup
       iconst_0
       iload_ I0
-      invokeStatic "java/lang/Integer" valueOfNT
+      invokeStatic Java.Lang.integer Java.Lang.valueOfInteger
       aastore
-      invokeVirtual "java/io/PrintStream" printfNT
+      invokeVirtual Java.IO.printStream Java.IO.printf
       pop
       i0 RETURN
 
+  newMethod [ACC_PUBLIC, ACC_STATIC] "main" [arrayOf Java.Lang.stringClass] ReturnsVoid $ do
+      setStackSize 1
+
+      iconst_5
+      invokeStatic "Test" hello
+      i0 RETURN
+
+  return ()
+
+testClass ::  Class Resolved
 testClass = generate "Test" test
 
 main = do