Add declarations for some standard Java classes/methods/fields.
authorIlya V. Portnov <i.portnov@compassplus.ru>
Fri, 30 Sep 2011 10:50:37 +0000 (16:50 +0600)
committerIlya V. Portnov <i.portnov@compassplus.ru>
Fri, 30 Sep 2011 10:50:37 +0000 (16:50 +0600)
Java/IO.hs [new file with mode: 0644]
Java/Lang.hs [new file with mode: 0644]
TestGen.hs

diff --git a/Java/IO.hs b/Java/IO.hs
new file mode 100644 (file)
index 0000000..e3a2997
--- /dev/null
@@ -0,0 +1,26 @@
+{-# LANGUAGE OverloadedStrings #-}
+module Java.IO where
+
+import Data.String
+
+import JVM.ClassFile
+import JVM.Types
+
+import qualified Java.Lang
+
+printStream :: IsString s => s
+printStream = "java/io/PrintStream"
+
+printStreamClass = ObjectType printStream
+
+println :: NameType Method
+println = NameType "println" $ MethodSignature [Java.Lang.stringClass] ReturnsVoid
+
+out :: NameType Field
+out = NameType "out" printStreamClass
+
+printf :: NameType Method
+printf =
+  NameType "printf" $ MethodSignature [Java.Lang.stringClass,
+                                       Array Nothing Java.Lang.objectClass] (Returns printStreamClass)
+
diff --git a/Java/Lang.hs b/Java/Lang.hs
new file mode 100644 (file)
index 0000000..bd23f16
--- /dev/null
@@ -0,0 +1,28 @@
+{-# LANGUAGE OverloadedStrings #-}
+module Java.Lang where
+
+import Data.String
+
+import JVM.ClassFile
+import JVM.Types
+
+objectClass = ObjectType object
+stringClass = ObjectType string
+integerClass = ObjectType integer
+systemClass = ObjectType system
+
+object :: IsString s => s
+object = "java/lang/Object"
+
+string :: IsString s => s
+string = "java/lang/String"
+
+integer :: IsString s => s
+integer = "java/lang/Integer"
+
+system :: IsString s => s
+system = "java/lang/System"
+
+objectInit :: NameType Method
+objectInit = NameType "<init>" $ MethodSignature [] ReturnsVoid
+
index c0635252852c296604dfecb364ccefd5a3a7d7a2..540a7da0d139ae257eea1ba39936679cec3755ce 100644 (file)
@@ -9,51 +9,41 @@ import JVM.Assembler
 import JVM.Generator
 import JVM.Generator.Instructions
 
-initNT :: NameType Method
-initNT = NameType "<init>" $ MethodSignature [] ReturnsVoid
+import qualified Java.Lang
+import qualified Java.IO
 
-helloNT :: NameType Method
-helloNT = NameType "hello" $ MethodSignature [IntType] ReturnsVoid
+hello :: NameType Method
+hello = 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")
+valueOf :: NameType Method
+valueOf = NameType "valueOf" $ MethodSignature [IntType] (Returns Java.Lang.integerClass)
 
 test :: Generate ()
 test = do
   newMethod [ACC_PUBLIC] "<init>" [] ReturnsVoid $ do
       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
+  newMethod [ACC_PUBLIC, ACC_STATIC] "main" [Array Nothing Java.Lang.stringClass] ReturnsVoid $ do
       iconst_5
-      invokeStatic "Test" helloNT
+      invokeStatic "Test" hello
       i0 RETURN
 
   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 valueOf
       aastore
-      invokeVirtual "java/io/PrintStream" printfNT
+      invokeVirtual Java.IO.printStream Java.IO.printf
       pop
       i0 RETURN