Enhace constants pool handling.
[hs-java.git] / JVM / Builder / Instructions.hs
index 3eec20fea25d6dab56e46e657fe8834f3e27a029..f74429cecdc57401c6f09417e7c8493b429f701e 100644 (file)
-
+-- | This module exports shortcuts for some of JVM instructions (which are defined in JVM.Assembler).
+-- These functions get Constants, put them into constants pool and generate instruction using index
+-- of constant in the pool.
 module JVM.Builder.Instructions where
 
+import Data.Word
+import qualified Data.ByteString.Lazy as B
+import Codec.Binary.UTF8.String (encodeString)
+import Data.String
+
 import JVM.ClassFile
 import JVM.Assembler
 import JVM.Builder.Monad
 
+nop :: Generator e g => g e ()
 nop = i0 NOP
+aconst_null :: Generator e g => g e ()
 aconst_null = i0 ACONST_NULL
+iconst_m1 :: Generator e g => g e ()
 iconst_m1 = i0 ICONST_M1
+iconst_0 :: Generator e g => g e ()
 iconst_0 = i0 ICONST_0
+iconst_1 :: Generator e g => g e ()
 iconst_1 = i0 ICONST_1
+iconst_2 :: Generator e g => g e ()
 iconst_2 = i0 ICONST_2
+iconst_3 :: Generator e g => g e ()
 iconst_3 = i0 ICONST_3
+iconst_4 :: Generator e g => g e ()
 iconst_4 = i0 ICONST_4
+iconst_5 :: Generator e g => g e ()
 iconst_5 = i0 ICONST_5
+lconst_0 :: Generator e g => g e ()
 lconst_0 = i0 LCONST_0
+lconst_1 :: Generator e g => g e ()
 lconst_1 = i0 LCONST_1
+fconst_0 :: Generator e g => g e ()
 fconst_0 = i0 FCONST_0
+fconst_1 :: Generator e g => g e ()
 fconst_1 = i0 FCONST_1
+fconst_2 :: Generator e g => g e ()
 fconst_2 = i0 FCONST_2
+dconst_0 :: Generator e g => g e ()
 dconst_0 = i0 DCONST_0
+dconst_1 :: Generator e g => g e ()
 dconst_1 = i0 DCONST_1
 
+bipush :: Generator e g => Word8 -> g e ()
 bipush x = i0 (BIPUSH x)
+sipush :: Generator e g => Word16 -> g e ()
 sipush x = i0 (SIPUSH x)
+
+ldc1 :: Generator e g => Constant Direct -> g e ()
 ldc1 x = i8 LDC1 x
+ldc2 :: Generator e g => Constant Direct -> g e ()
 ldc2 x = i1 LDC2 x
+ldc2w :: Generator e g => Constant Direct -> g e ()
 ldc2w x = i1 LDC2W x
+iload :: Generator e g => Constant Direct -> g e ()
 iload x = i8 ILOAD x
+lload :: Generator e g => Constant Direct -> g e ()
 lload x = i8 LLOAD x
+fload :: Generator e g => Constant Direct -> g e ()
 fload x = i8 FLOAD x
+dload :: Generator e g => Constant Direct -> g e ()
 dload x = i8 DLOAD x
+aload :: Generator e g => Constant Direct -> g e ()
 aload x = i8 ALOAD x
 
+iload_ :: Generator e g => IMM -> g e ()
 iload_ x = i0 (ILOAD_ x)
+lload_ :: Generator e g => IMM -> g e ()
 lload_ x = i0 (LLOAD_ x)
+fload_ :: Generator e g => IMM -> g e ()
 fload_ x = i0 (FLOAD_ x)
+dload_ :: Generator e g => IMM -> g e ()
 dload_ x = i0 (DLOAD_ x)
+aload_ :: Generator e g => IMM -> g e ()
 aload_ x = i0 (ALOAD_ x)
 
+iaload :: Generator e g => g e ()
 iaload = i0 IALOAD
+laload :: Generator e g => g e ()
 laload = i0 LALOAD
+faload :: Generator e g => g e ()
 faload = i0 FALOAD
+daload :: Generator e g => g e ()
 daload = i0 DALOAD
+aaload :: Generator e g => g e ()
 aaload = i0 AALOAD
+caload :: Generator e g => g e ()
 caload = i0 CALOAD
+saload :: Generator e g => g e ()
 saload = i0 SALOAD
 
+istore :: Generator e g => Constant Direct -> g e ()
 istore x = i8 ISTORE x
+lstore :: Generator e g => Constant Direct -> g e ()
 lstore x = i8 LSTORE x
+fstore :: Generator e g => Constant Direct -> g e ()
 fstore x = i8 FSTORE x
+dstore :: Generator e g => Constant Direct -> g e ()
 dstore x = i8 DSTORE x
+astore :: Generator e g => Constant Direct -> g e ()
 astore x = i8 ASTORE x
 
+istore_ :: Generator e g => Word8 -> g e ()
 istore_ x = i0 (ISTORE x)
+lstore_ :: Generator e g => Word8 -> g e ()
 lstore_ x = i0 (LSTORE x)
+fstore_ :: Generator e g => Word8 -> g e ()
 fstore_ x = i0 (FSTORE x)
+dstore_ :: Generator e g => Word8 -> g e ()
 dstore_ x = i0 (DSTORE x)
+astore_ :: Generator e g => Word8 -> g e ()
 astore_ x = i0 (ASTORE x)
 
+iastore :: Generator e g => g e ()
 iastore = i0 IASTORE
+lastore :: Generator e g => g e ()
 lastore = i0 LASTORE
+fastore :: Generator e g => g e ()
 fastore = i0 FASTORE
+dastore :: Generator e g => g e ()
 dastore = i0 DASTORE
+aastore :: Generator e g => g e ()
 aastore = i0 AASTORE
+bastore :: Generator e g => g e ()
 bastore = i0 BASTORE
+castore :: Generator e g => g e ()
 castore = i0 CASTORE
+sastore :: Generator e g => g e ()
 sastore = i0 SASTORE
 
+pop :: Generator e g => g e ()
 pop     = i0 POP    
+pop2 :: Generator e g => g e ()
 pop2    = i0 POP2   
+dup :: Generator e g => g e ()
 dup     = i0 DUP    
+dup_x1 :: Generator e g => g e ()
 dup_x1  = i0 DUP_X1 
+dup_x2 :: Generator e g => g e ()
 dup_x2  = i0 DUP_X2 
+dup2 :: Generator e g => g e ()
 dup2    = i0 DUP2   
+dup2_x1 :: Generator e g => g e ()
 dup2_x1 = i0 DUP2_X1
+dup2_x2 :: Generator e g => g e ()
 dup2_x2 = i0 DUP2_X2
+swap :: Generator e g => g e ()
 swap    = i0 SWAP   
+iadd :: Generator e g => g e ()
 iadd    = i0 IADD   
+ladd :: Generator e g => g e ()
 ladd    = i0 LADD   
+fadd :: Generator e g => g e ()
 fadd    = i0 FADD   
+dadd :: Generator e g => g e ()
 dadd    = i0 DADD   
+isub :: Generator e g => g e ()
 isub    = i0 ISUB   
+lsub :: Generator e g => g e ()
 lsub    = i0 LSUB   
+fsub :: Generator e g => g e ()
 fsub    = i0 FSUB   
+dsub :: Generator e g => g e ()
 dsub    = i0 DSUB   
+imul :: Generator e g => g e ()
 imul    = i0 IMUL   
+lmul :: Generator e g => g e ()
 lmul    = i0 LMUL   
+fmul :: Generator e g => g e ()
 fmul    = i0 FMUL   
+dmul :: Generator e g => g e ()
 dmul    = i0 DMUL   
+idiv :: Generator e g => g e ()
 idiv    = i0 IDIV   
+ldiv :: Generator e g => g e ()
 ldiv    = i0 LDIV   
+fdiv :: Generator e g => g e ()
 fdiv    = i0 FDIV   
+ddiv :: Generator e g => g e ()
 ddiv    = i0 DDIV   
+irem :: Generator e g => g e ()
 irem    = i0 IREM   
+lrem :: Generator e g => g e ()
 lrem    = i0 LREM   
+frem :: Generator e g => g e ()
 frem    = i0 FREM   
+drem :: Generator e g => g e ()
 drem    = i0 DREM   
+ineg :: Generator e g => g e ()
 ineg    = i0 INEG   
+lneg :: Generator e g => g e ()
 lneg    = i0 LNEG   
+fneg :: Generator e g => g e ()
 fneg    = i0 FNEG   
+dneg :: Generator e g => g e ()
 dneg    = i0 DNEG   
+ishl :: Generator e g => g e ()
 ishl    = i0 ISHL   
+lshl :: Generator e g => g e ()
 lshl    = i0 LSHL   
+ishr :: Generator e g => g e ()
 ishr    = i0 ISHR   
+lshr :: Generator e g => g e ()
 lshr    = i0 LSHR   
+iushr :: Generator e g => g e ()
 iushr   = i0 IUSHR  
+lushr :: Generator e g => g e ()
 lushr   = i0 LUSHR  
+iand :: Generator e g => g e ()
 iand    = i0 IAND   
+land :: Generator e g => g e ()
 land    = i0 LAND   
+ior :: Generator e g => g e ()
 ior     = i0 IOR    
+lor :: Generator e g => g e ()
 lor     = i0 LOR    
+ixor :: Generator e g => g e ()
 ixor    = i0 IXOR   
+lxor :: Generator e g => g e ()
 lxor    = i0 LXOR   
 
+iinc :: Generator e g => Word8 -> Word8 -> g e ()
 iinc x y = i0 (IINC x y)
 
+i2l :: Generator e g => g e ()
 i2l  = i0 I2L 
+i2f :: Generator e g => g e ()
 i2f  = i0 I2F 
+i2d :: Generator e g => g e ()
 i2d  = i0 I2D 
+l2i :: Generator e g => g e ()
 l2i  = i0 L2I 
+l2f :: Generator e g => g e ()
 l2f  = i0 L2F 
+l2d :: Generator e g => g e ()
 l2d  = i0 L2D 
+f2i :: Generator e g => g e ()
 f2i  = i0 F2I 
+f2l :: Generator e g => g e ()
 f2l  = i0 F2L 
+f2d :: Generator e g => g e ()
 f2d  = i0 F2D 
+d2i :: Generator e g => g e ()
 d2i  = i0 D2I 
+d2l :: Generator e g => g e ()
 d2l  = i0 D2L 
+d2f :: Generator e g => g e ()
 d2f  = i0 D2F 
+i2b :: Generator e g => g e ()
 i2b  = i0 I2B 
+i2c :: Generator e g => g e ()
 i2c  = i0 I2C 
+i2s :: Generator e g => g e ()
 i2s  = i0 I2S 
+lcmp :: Generator e g => g e ()
 lcmp = i0 LCMP
 
+-- | Wide instruction
+wide :: Generator e g => (Word8 -> Instruction) -> Constant Direct -> g e ()
+wide fn c = do
+  ix <- addToPool c
+  let ix0 = fromIntegral (ix `div` 0x100) :: Word8
+      ix1 = fromIntegral (ix `mod` 0x100) :: Word8
+  i0 (WIDE ix0 $ fn ix1)
+
+new :: Generator e g => B.ByteString -> g e ()
 new cls =
   i1 NEW (CClass cls)
 
+newArray :: Generator e g => ArrayType -> g e ()
 newArray t =
   i0 (NEWARRAY $ atype2byte t)
 
+allocNewArray :: Generator e g => B.ByteString -> g e ()
 allocNewArray cls =
   i1 ANEWARRAY (CClass cls)
 
+invokeVirtual :: Generator e g => B.ByteString -> NameType Method -> g e ()
 invokeVirtual cls sig =
   i1 INVOKEVIRTUAL (CMethod cls sig)
 
+invokeStatic :: Generator e g => B.ByteString -> NameType Method -> g e ()
 invokeStatic cls sig =
   i1 INVOKESTATIC (CMethod cls sig)
 
+invokeSpecial :: Generator e g => B.ByteString -> NameType Method -> g e ()
 invokeSpecial cls sig =
   i1 INVOKESPECIAL (CMethod cls sig)
 
+getStaticField :: Generator e g => B.ByteString -> NameType Field -> g e ()
 getStaticField cls sig =
   i1 GETSTATIC (CField cls sig)
 
+loadString :: Generator e g => String -> g e ()
 loadString str =
-  i8 LDC1 (CString str)
+  i8 LDC1 (CString $ fromString $ encodeString $ str)
 
+allocArray :: Generator e g => B.ByteString -> g e ()
 allocArray cls =
   i1 ANEWARRAY (CClass cls)