-
+-- | 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)