From: Ilya V. Portnov Date: Fri, 30 Sep 2011 10:50:37 +0000 (+0600) Subject: Add declarations for some standard Java classes/methods/fields. X-Git-Tag: v0.3.2~35 X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=hs-java.git;a=commitdiff_plain;h=5f0e7d26a4a5c125b8f68539505d831352e9515b Add declarations for some standard Java classes/methods/fields. --- diff --git a/Java/IO.hs b/Java/IO.hs new file mode 100644 index 0000000..e3a2997 --- /dev/null +++ b/Java/IO.hs @@ -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 index 0000000..bd23f16 --- /dev/null +++ b/Java/Lang.hs @@ -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 "" $ MethodSignature [] ReturnsVoid + diff --git a/TestGen.hs b/TestGen.hs index c063525..540a7da 100644 --- a/TestGen.hs +++ b/TestGen.hs @@ -9,51 +9,41 @@ import JVM.Assembler import JVM.Generator import JVM.Generator.Instructions -initNT :: NameType Method -initNT = NameType "" $ 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] "" [] 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