-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Java .class files assembler/disassembler
--   
--   This package declares data types for Java .class files format and
--   functions to assemble/disassemble Java bytecode. See dump-class.hs,
--   rebuild-class.hs, TestGen.hs for examples of usage.
--   
--   As of version 0.4.0, all generator functions can work with any
--   instance of GeneratorMonad class, not only MonadState GState.
@package hs-java
@version 0.4.1


-- | This module declares (low-level) data types for Java .class files
--   structures, and Binary instances to read/write them.
module JVM.ClassFile

-- | Any (class<i> field</i> method/ ...) attribute format. Some formats
--   specify special formats for <tt>attributeValue</tt>.
data Attribute
Attribute :: Word16 -> Word32 -> ByteString -> Attribute
[attributeName] :: Attribute -> Word16
[attributeLength] :: Attribute -> Word32
[attributeValue] :: Attribute -> ByteString

-- | Field signature format
data FieldType

-- | B
SignedByte :: FieldType

-- | C
CharByte :: FieldType

-- | D
DoubleType :: FieldType

-- | F
FloatType :: FieldType

-- | I
IntType :: FieldType

-- | J
LongInt :: FieldType

-- | S
ShortInt :: FieldType

-- | Z
BoolType :: FieldType

-- | L <tt>{class name}</tt>
ObjectType :: String -> FieldType

-- | <pre>
--   [{type}
--   </pre>
Array :: Maybe Int -> FieldType -> FieldType

-- | Class field signature
type FieldSignature = FieldType

-- | Class method argument signature
data MethodSignature
MethodSignature :: [ArgumentSignature] -> ReturnSignature -> MethodSignature

-- | Return value signature
data ReturnSignature
Returns :: FieldType -> ReturnSignature
ReturnsVoid :: ReturnSignature

-- | Method argument signature
type ArgumentSignature = FieldType

-- | File stage
data File

-- | Direct representation stage
data Direct

-- | Constant pool
type Pool stage = Map Word16 (Constant stage)

-- | Link to some object
type family Link stage a

-- | Class method format
data Method stage
Method :: AccessFlags stage -> Link stage ByteString -> Link stage MethodSignature -> Word16 -> Attributes stage -> Method stage
[methodAccessFlags] :: Method stage -> AccessFlags stage
[methodName] :: Method stage -> Link stage ByteString
[methodSignature] :: Method stage -> Link stage MethodSignature
[methodAttributesCount] :: Method stage -> Word16
[methodAttributes] :: Method stage -> Attributes stage

-- | Class field format
data Field stage
Field :: AccessFlags stage -> Link stage ByteString -> Link stage FieldSignature -> Word16 -> Attributes stage -> Field stage
[fieldAccessFlags] :: Field stage -> AccessFlags stage
[fieldName] :: Field stage -> Link stage ByteString
[fieldSignature] :: Field stage -> Link stage FieldSignature
[fieldAttributesCount] :: Field stage -> Word16
[fieldAttributes] :: Field stage -> Attributes stage

-- | Generic .class file format
data Class stage
Class :: Word32 -> Word16 -> Word16 -> Word16 -> Pool stage -> AccessFlags stage -> Link stage ByteString -> Link stage ByteString -> Word16 -> [Link stage ByteString] -> Word16 -> [Field stage] -> Word16 -> [Method stage] -> Word16 -> Attributes stage -> Class stage

-- | Magic value: 0xCAFEBABE
[magic] :: Class stage -> Word32
[minorVersion] :: Class stage -> Word16
[majorVersion] :: Class stage -> Word16

-- | Number of items in constants pool
[constsPoolSize] :: Class stage -> Word16

-- | Constants pool itself
[constsPool] :: Class stage -> Pool stage

-- | See <tt>JVM.Types.AccessFlag</tt>
[accessFlags] :: Class stage -> AccessFlags stage

-- | Constants pool item index for this class
[thisClass] :: Class stage -> Link stage ByteString

-- | <ul>
--   <li>-/-- for super class, zero for java.lang.Object</li>
--   </ul>
[superClass] :: Class stage -> Link stage ByteString

-- | Number of implemented interfaces
[interfacesCount] :: Class stage -> Word16

-- | Constants pool item indexes for implemented interfaces
[interfaces] :: Class stage -> [Link stage ByteString]

-- | Number of class fileds
[classFieldsCount] :: Class stage -> Word16

-- | Class fields
[classFields] :: Class stage -> [Field stage]

-- | Number of class methods
[classMethodsCount] :: Class stage -> Word16

-- | Class methods
[classMethods] :: Class stage -> [Method stage]

-- | Number of class attributes
[classAttributesCount] :: Class stage -> Word16

-- | Class attributes
[classAttributes] :: Class stage -> Attributes stage

-- | Constant pool item
data Constant stage
CClass :: Link stage ByteString -> Constant stage
CField :: Link stage ByteString -> Link stage (NameType (Field stage)) -> Constant stage
CMethod :: Link stage ByteString -> Link stage (NameType (Method stage)) -> Constant stage
CIfaceMethod :: Link stage ByteString -> Link stage (NameType (Method stage)) -> Constant stage
CString :: Link stage ByteString -> Constant stage
CInteger :: Word32 -> Constant stage
CFloat :: Float -> Constant stage
CLong :: Word64 -> Constant stage
CDouble :: Double -> Constant stage
CNameType :: Link stage ByteString -> Link stage ByteString -> Constant stage
CUTF8 :: ByteString -> Constant stage
[getString] :: Constant stage -> ByteString
CUnicode :: ByteString -> Constant stage
[getString] :: Constant stage -> ByteString

-- | Access flags. Used for classess, methods, variables.
data AccessFlag

-- | 0x0001 Visible for all
ACC_PUBLIC :: AccessFlag

-- | 0x0002 Visible only for defined class
ACC_PRIVATE :: AccessFlag

-- | 0x0004 Visible only for subclasses
ACC_PROTECTED :: AccessFlag

-- | 0x0008 Static method or variable
ACC_STATIC :: AccessFlag

-- | 0x0010 No further subclassing or assignments
ACC_FINAL :: AccessFlag

-- | 0x0020 Uses monitors
ACC_SYNCHRONIZED :: AccessFlag

-- | 0x0040 Could not be cached
ACC_VOLATILE :: AccessFlag

-- | 0x0080
ACC_TRANSIENT :: AccessFlag

-- | 0x0100 Implemented in other language
ACC_NATIVE :: AccessFlag

-- | 0x0200 Class is interface
ACC_INTERFACE :: AccessFlag

-- | 0x0400
ACC_ABSTRACT :: AccessFlag

-- | Object (class, method, field …) access flags
type family AccessFlags stage

-- | Object (class, method, field) attributes
data family Attributes stage

-- | Default (empty) class file definition.
defaultClass :: (Default (AccessFlags stage), Default (Link stage ByteString), Default (Attributes stage)) => Class stage

-- | Fields and methods have signatures.
class (Binary (Signature a), Show (Signature a), Eq (Signature a)) => HasSignature a where {
    type family Signature a;
}
class HasAttributes a
attributes :: HasAttributes a => a stage -> Attributes stage

-- | Name and signature pair. Used for methods and fields.
data NameType a
NameType :: ByteString -> Signature a -> NameType a
[ntName] :: NameType a -> ByteString
[ntSignature] :: NameType a -> Signature a
fieldNameType :: Field Direct -> NameType (Field Direct)
methodNameType :: Method Direct -> NameType (Method Direct)
lookupField :: ByteString -> Class Direct -> Maybe (Field Direct)
lookupMethod :: ByteString -> Class Direct -> Maybe (Method Direct)
long :: Constant stage -> Bool
toString :: ByteString -> String

-- | Name of the CClass. Error on any other constant.
className :: Constant Direct -> ByteString

-- | Size of attributes set at File stage
apsize :: Attributes File -> Int

-- | Size of attributes set at Direct stage
arsize :: Attributes Direct -> Int

-- | Associative list of attributes at Direct stage
arlist :: Attributes Direct -> [(ByteString, ByteString)]
instance GHC.Show.Show JVM.ClassFile.Attribute
instance GHC.Classes.Eq JVM.ClassFile.Attribute
instance GHC.Classes.Ord JVM.ClassFile.MethodSignature
instance GHC.Classes.Eq JVM.ClassFile.MethodSignature
instance GHC.Classes.Ord JVM.ClassFile.ReturnSignature
instance GHC.Classes.Eq JVM.ClassFile.ReturnSignature
instance GHC.Classes.Ord JVM.ClassFile.FieldType
instance GHC.Classes.Eq JVM.ClassFile.FieldType
instance GHC.Enum.Enum JVM.ClassFile.AccessFlag
instance GHC.Classes.Ord JVM.ClassFile.AccessFlag
instance GHC.Show.Show JVM.ClassFile.AccessFlag
instance GHC.Classes.Eq JVM.ClassFile.AccessFlag
instance GHC.Show.Show (JVM.ClassFile.Attributes JVM.ClassFile.Direct)
instance GHC.Classes.Eq (JVM.ClassFile.Attributes JVM.ClassFile.Direct)
instance GHC.Show.Show (JVM.ClassFile.Attributes JVM.ClassFile.File)
instance GHC.Classes.Eq (JVM.ClassFile.Attributes JVM.ClassFile.File)
instance JVM.ClassFile.HasSignature a => GHC.Classes.Eq (JVM.ClassFile.NameType a)
instance GHC.Classes.Eq (JVM.ClassFile.Class JVM.ClassFile.File)
instance GHC.Classes.Eq (JVM.ClassFile.Class JVM.ClassFile.Direct)
instance GHC.Show.Show (JVM.ClassFile.Class JVM.ClassFile.File)
instance GHC.Show.Show (JVM.ClassFile.Class JVM.ClassFile.Direct)
instance GHC.Classes.Eq (JVM.ClassFile.Constant JVM.ClassFile.File)
instance GHC.Classes.Eq (JVM.ClassFile.Constant JVM.ClassFile.Direct)
instance GHC.Show.Show (JVM.ClassFile.Constant JVM.ClassFile.File)
instance GHC.Classes.Eq (JVM.ClassFile.Field JVM.ClassFile.File)
instance GHC.Classes.Eq (JVM.ClassFile.Field JVM.ClassFile.Direct)
instance GHC.Show.Show (JVM.ClassFile.Field JVM.ClassFile.File)
instance GHC.Show.Show (JVM.ClassFile.Field JVM.ClassFile.Direct)
instance GHC.Classes.Eq (JVM.ClassFile.Method JVM.ClassFile.File)
instance GHC.Classes.Eq (JVM.ClassFile.Method JVM.ClassFile.Direct)
instance GHC.Show.Show (JVM.ClassFile.Method JVM.ClassFile.File)
instance GHC.Show.Show (JVM.ClassFile.Method JVM.ClassFile.Direct)
instance JVM.ClassFile.HasAttributes JVM.ClassFile.Class
instance JVM.ClassFile.HasAttributes JVM.ClassFile.Field
instance JVM.ClassFile.HasAttributes JVM.ClassFile.Method
instance Data.Binary.Class.Binary JVM.ClassFile.Attribute
instance Data.Binary.Class.Binary (JVM.ClassFile.Class JVM.ClassFile.File)
instance GHC.Show.Show (JVM.ClassFile.Constant JVM.ClassFile.Direct)
instance JVM.ClassFile.HasSignature (JVM.ClassFile.Method JVM.ClassFile.Direct)
instance Data.Binary.Class.Binary (JVM.ClassFile.Method JVM.ClassFile.File)
instance JVM.ClassFile.HasSignature (JVM.ClassFile.Field JVM.ClassFile.Direct)
instance Data.Binary.Class.Binary (JVM.ClassFile.Field JVM.ClassFile.File)
instance GHC.Show.Show JVM.ClassFile.MethodSignature
instance Data.Binary.Class.Binary JVM.ClassFile.MethodSignature
instance GHC.Show.Show JVM.ClassFile.ReturnSignature
instance Data.Binary.Class.Binary JVM.ClassFile.ReturnSignature
instance GHC.Show.Show JVM.ClassFile.FieldType
instance Data.Binary.Class.Binary JVM.ClassFile.FieldType
instance JVM.ClassFile.HasSignature a => GHC.Show.Show (JVM.ClassFile.NameType a)
instance JVM.ClassFile.HasSignature a => Data.Binary.Class.Binary (JVM.ClassFile.NameType a)
instance Data.Default.Class.Default (JVM.ClassFile.Attributes JVM.ClassFile.File)
instance Data.Default.Class.Default (JVM.ClassFile.Attributes JVM.ClassFile.Direct)


-- | This module declares data type for JVM instructions, and BinaryState
--   instances to read/write them.
module JVM.Assembler

-- | JVM instruction set. For comments, see JVM specification.
data Instruction

-- | 0
NOP :: Instruction

-- | 1
ACONST_NULL :: Instruction

-- | 2
ICONST_M1 :: Instruction

-- | 3
ICONST_0 :: Instruction

-- | 4
ICONST_1 :: Instruction

-- | 5
ICONST_2 :: Instruction

-- | 6
ICONST_3 :: Instruction

-- | 7
ICONST_4 :: Instruction

-- | 8
ICONST_5 :: Instruction

-- | 9
LCONST_0 :: Instruction

-- | 10
LCONST_1 :: Instruction

-- | 11
FCONST_0 :: Instruction

-- | 12
FCONST_1 :: Instruction

-- | 13
FCONST_2 :: Instruction

-- | 14
DCONST_0 :: Instruction

-- | 15
DCONST_1 :: Instruction

-- | 16
BIPUSH :: Word8 -> Instruction

-- | 17
SIPUSH :: Word16 -> Instruction

-- | 18
LDC1 :: Word8 -> Instruction

-- | 19
LDC2 :: Word16 -> Instruction

-- | 20
LDC2W :: Word16 -> Instruction

-- | 21
ILOAD :: Word8 -> Instruction

-- | 22
LLOAD :: Word8 -> Instruction

-- | 23
FLOAD :: Word8 -> Instruction

-- | 24
DLOAD :: Word8 -> Instruction

-- | 25
ALOAD :: Word8 -> Instruction

-- | 26, 27, 28, 29
ILOAD_ :: IMM -> Instruction

-- | 30, 31, 32, 33
LLOAD_ :: IMM -> Instruction

-- | 34, 35, 36, 37
FLOAD_ :: IMM -> Instruction

-- | 38, 39, 40, 41
DLOAD_ :: IMM -> Instruction

-- | 42, 43, 44, 45
ALOAD_ :: IMM -> Instruction

-- | 46
IALOAD :: Instruction

-- | 47
LALOAD :: Instruction

-- | 48
FALOAD :: Instruction

-- | 49
DALOAD :: Instruction

-- | 50
AALOAD :: Instruction

-- | 51
BALOAD :: Instruction

-- | 52
CALOAD :: Instruction

-- | 53
SALOAD :: Instruction

-- | 54
ISTORE :: Word8 -> Instruction

-- | 55
LSTORE :: Word8 -> Instruction

-- | 56
FSTORE :: Word8 -> Instruction

-- | 57
DSTORE :: Word8 -> Instruction

-- | 58
ASTORE :: Word8 -> Instruction

-- | 59, 60, 61, 62
ISTORE_ :: IMM -> Instruction

-- | 63, 64, 65, 66
LSTORE_ :: IMM -> Instruction

-- | 67, 68, 69, 70
FSTORE_ :: IMM -> Instruction

-- | 71, 72, 73, 74
DSTORE_ :: IMM -> Instruction

-- | 75, 76, 77, 78
ASTORE_ :: IMM -> Instruction

-- | 79
IASTORE :: Instruction

-- | 80
LASTORE :: Instruction

-- | 81
FASTORE :: Instruction

-- | 82
DASTORE :: Instruction

-- | 83
AASTORE :: Instruction

-- | 84
BASTORE :: Instruction

-- | 85
CASTORE :: Instruction

-- | 86
SASTORE :: Instruction

-- | 87
POP :: Instruction

-- | 88
POP2 :: Instruction

-- | 89
DUP :: Instruction

-- | 90
DUP_X1 :: Instruction

-- | 91
DUP_X2 :: Instruction

-- | 92
DUP2 :: Instruction

-- | 93
DUP2_X1 :: Instruction

-- | 94
DUP2_X2 :: Instruction

-- | 95
SWAP :: Instruction

-- | 96
IADD :: Instruction

-- | 97
LADD :: Instruction

-- | 98
FADD :: Instruction

-- | 99
DADD :: Instruction

-- | 100
ISUB :: Instruction

-- | 101
LSUB :: Instruction

-- | 102
FSUB :: Instruction

-- | 103
DSUB :: Instruction

-- | 104
IMUL :: Instruction

-- | 105
LMUL :: Instruction

-- | 106
FMUL :: Instruction

-- | 107
DMUL :: Instruction

-- | 108
IDIV :: Instruction

-- | 109
LDIV :: Instruction

-- | 110
FDIV :: Instruction

-- | 111
DDIV :: Instruction

-- | 112
IREM :: Instruction

-- | 113
LREM :: Instruction

-- | 114
FREM :: Instruction

-- | 115
DREM :: Instruction

-- | 116
INEG :: Instruction

-- | 117
LNEG :: Instruction

-- | 118
FNEG :: Instruction

-- | 119
DNEG :: Instruction

-- | 120
ISHL :: Instruction

-- | 121
LSHL :: Instruction

-- | 122
ISHR :: Instruction

-- | 123
LSHR :: Instruction

-- | 124
IUSHR :: Instruction

-- | 125
LUSHR :: Instruction

-- | 126
IAND :: Instruction

-- | 127
LAND :: Instruction

-- | 128
IOR :: Instruction

-- | 129
LOR :: Instruction

-- | 130
IXOR :: Instruction

-- | 131
LXOR :: Instruction

-- | 132
IINC :: Word8 -> Word8 -> Instruction

-- | 133
I2L :: Instruction

-- | 134
I2F :: Instruction

-- | 135
I2D :: Instruction

-- | 136
L2I :: Instruction

-- | 137
L2F :: Instruction

-- | 138
L2D :: Instruction

-- | 139
F2I :: Instruction

-- | 140
F2L :: Instruction

-- | 141
F2D :: Instruction

-- | 142
D2I :: Instruction

-- | 143
D2L :: Instruction

-- | 144
D2F :: Instruction

-- | 145
I2B :: Instruction

-- | 146
I2C :: Instruction

-- | 147
I2S :: Instruction

-- | 148
LCMP :: Instruction

-- | 149, 150
FCMP :: CMP -> Instruction

-- | 151, 152
DCMP :: CMP -> Instruction

-- | 153, 154, 155, 156, 157, 158
IF :: CMP -> Word16 -> Instruction

-- | 159, 160, 161, 162, 163, 164
IF_ICMP :: CMP -> Word16 -> Instruction

-- | 165, 166
IF_ACMP :: CMP -> Word16 -> Instruction

-- | 167
GOTO :: Word16 -> Instruction

-- | 168
JSR :: Word16 -> Instruction

-- | 169
RET :: Instruction

-- | 170
TABLESWITCH :: Word8 -> Word32 -> Word32 -> Word32 -> [Word32] -> Instruction

-- | 171
LOOKUPSWITCH :: Word8 -> Word32 -> Word32 -> [(Word32, Word32)] -> Instruction

-- | 172
IRETURN :: Instruction

-- | 173
LRETURN :: Instruction

-- | 174
FRETURN :: Instruction

-- | 175
DRETURN :: Instruction

-- | 176
ARETURN :: Instruction

-- | 177
RETURN :: Instruction

-- | 178
GETSTATIC :: Word16 -> Instruction

-- | 179
PUTSTATIC :: Word16 -> Instruction

-- | 180
GETFIELD :: Word16 -> Instruction

-- | 181
PUTFIELD :: Word16 -> Instruction

-- | 182
INVOKEVIRTUAL :: Word16 -> Instruction

-- | 183
INVOKESPECIAL :: Word16 -> Instruction

-- | 184
INVOKESTATIC :: Word16 -> Instruction

-- | 185
INVOKEINTERFACE :: Word16 -> Word8 -> Instruction

-- | 187
NEW :: Word16 -> Instruction

-- | 188, see <tt>ArrayType</tt>
NEWARRAY :: Word8 -> Instruction

-- | 189
ANEWARRAY :: Word16 -> Instruction

-- | 190
ARRAYLENGTH :: Instruction

-- | 191
ATHROW :: Instruction

-- | 192
CHECKCAST :: Word16 -> Instruction

-- | 193
INSTANCEOF :: Word16 -> Instruction

-- | 194
MONITORENTER :: Instruction

-- | 195
MONITOREXIT :: Instruction

-- | 196
WIDE :: Word8 -> Instruction -> Instruction

-- | 197
MULTINANEWARRAY :: Word16 -> Word8 -> Instruction

-- | 198
IFNULL :: Word16 -> Instruction

-- | 199
IFNONNULL :: Word16 -> Instruction

-- | 200
GOTO_W :: Word32 -> Instruction

-- | 201
JSR_W :: Word32 -> Instruction

-- | JVM array type (primitive types)
data ArrayType

-- | 4
T_BOOLEAN :: ArrayType

-- | 5
T_CHAR :: ArrayType

-- | 6
T_FLOAT :: ArrayType

-- | 7
T_DOUBLE :: ArrayType

-- | 8
T_BYTE :: ArrayType

-- | 9
T_SHORT :: ArrayType

-- | 10
T_INT :: ArrayType

-- | 11
T_LONG :: ArrayType

-- | Exception descriptor
data CodeException
CodeException :: Word16 -> Word16 -> Word16 -> Word16 -> CodeException
[eStartPC] :: CodeException -> Word16
[eEndPC] :: CodeException -> Word16
[eHandlerPC] :: CodeException -> Word16
[eCatchType] :: CodeException -> Word16

-- | Format of Code method attribute.
data Code
Code :: Word16 -> Word16 -> Word32 -> [Instruction] -> Word16 -> [CodeException] -> Word16 -> Attributes File -> Code
[codeStackSize] :: Code -> Word16
[codeMaxLocals] :: Code -> Word16
[codeLength] :: Code -> Word32
[codeInstructions] :: Code -> [Instruction]
[codeExceptionsN] :: Code -> Word16
[codeExceptions] :: Code -> [CodeException]
[codeAttrsN] :: Code -> Word16
[codeAttributes] :: Code -> Attributes File

-- | Immediate constant. Corresponding value will be added to base opcode.
data IMM

-- | 0
I0 :: IMM

-- | 1
I1 :: IMM

-- | 2
I2 :: IMM

-- | 3
I3 :: IMM

-- | Comparation operation type. Not all CMP instructions support all
--   operations.
data CMP
C_EQ :: CMP
C_NE :: CMP
C_LT :: CMP
C_GE :: CMP
C_GT :: CMP
C_LE :: CMP
atype2byte :: ArrayType -> Word8

-- | Encode list of instructions
encodeInstructions :: [Instruction] -> ByteString

-- | Encode Java method
encodeMethod :: Code -> ByteString

-- | Decode Java method
decodeMethod :: ByteString -> Code
instance GHC.Enum.Enum JVM.Assembler.ArrayType
instance GHC.Show.Show JVM.Assembler.ArrayType
instance GHC.Classes.Eq JVM.Assembler.ArrayType
instance GHC.Show.Show JVM.Assembler.Code
instance GHC.Classes.Eq JVM.Assembler.Code
instance GHC.Show.Show JVM.Assembler.Instruction
instance GHC.Classes.Eq JVM.Assembler.Instruction
instance GHC.Show.Show JVM.Assembler.CodeException
instance GHC.Classes.Eq JVM.Assembler.CodeException
instance GHC.Show.Show JVM.Assembler.CMP
instance GHC.Enum.Enum JVM.Assembler.CMP
instance GHC.Classes.Ord JVM.Assembler.CMP
instance GHC.Classes.Eq JVM.Assembler.CMP
instance GHC.Show.Show JVM.Assembler.IMM
instance GHC.Enum.Enum JVM.Assembler.IMM
instance GHC.Classes.Ord JVM.Assembler.IMM
instance GHC.Classes.Eq JVM.Assembler.IMM
instance Data.BinaryState.BinaryState GHC.Integer.Type.Integer JVM.Assembler.ArrayType
instance Data.BinaryState.BinaryState GHC.Integer.Type.Integer JVM.Assembler.Code
instance Data.BinaryState.BinaryState GHC.Integer.Type.Integer JVM.Assembler.Instruction
instance Data.BinaryState.BinaryState GHC.Integer.Type.Integer JVM.Assembler.CodeException
instance Data.BinaryState.BinaryState GHC.Integer.Type.Integer JVM.ClassFile.Attribute


-- | This module declares some commonly used functions and instances.
module JVM.Common
toCharList :: ByteString -> [Int]
poolSize :: Pool stage -> Int
(!) :: Ord k => Map k a -> k -> a
showListIx :: (Show i, Show a) => [(i, a)] -> String
mapFindIndex :: Num k => (v -> Bool) -> Map k v -> Maybe k
byteString :: Binary t => t -> ByteString
instance Data.Default.Class.Default Data.ByteString.Lazy.Internal.ByteString

module JVM.Exceptions
data NoItemInPool
NoItemInPool :: a -> NoItemInPool
data UnexpectedEndMethod
UnexpectedEndMethod :: UnexpectedEndMethod
data ENotLoaded
ClassFileNotLoaded :: FilePath -> ENotLoaded
JARNotLoaded :: FilePath -> String -> ENotLoaded
data ENotFound
ClassNotFound :: String -> ENotFound
FieldNotFound :: String -> ByteString -> ENotFound
MethodNotFound :: String -> ByteString -> ENotFound
force :: String -> EM AnyException a -> a
instance GHC.Show.Show JVM.Exceptions.ENotFound
instance GHC.Exception.Type.Exception JVM.Exceptions.ENotFound
instance GHC.Show.Show JVM.Exceptions.ENotLoaded
instance GHC.Exception.Type.Exception JVM.Exceptions.ENotLoaded
instance GHC.Show.Show JVM.Exceptions.UnexpectedEndMethod
instance GHC.Exception.Type.Exception JVM.Exceptions.UnexpectedEndMethod
instance GHC.Exception.Type.Exception JVM.Exceptions.NoItemInPool
instance GHC.Show.Show JVM.Exceptions.NoItemInPool


-- | Functions to convert from low-level .class format representation and
--   high-level Java classes, methods etc representation
module JVM.Converter

-- | Parse .class file data
parseClass :: ByteString -> Class Direct

-- | Parse class data from file
parseClassFile :: FilePath -> IO (Class Direct)
classFile2Direct :: Class File -> Class Direct
classDirect2File :: Class Direct -> Class File
encodeClass :: Class Direct -> ByteString

-- | Try to get class method by name
methodByName :: Class Direct -> ByteString -> Maybe (Method Direct)

-- | Try to get object attribute by name
attrByName :: HasAttributes a => a Direct -> ByteString -> Maybe ByteString

-- | Try to get Code for class method (no Code for interface methods)
methodCode :: Class Direct -> ByteString -> Maybe ByteString

module JVM.Dump

-- | Dump a class to console.
dumpClass :: Class Direct -> IO ()

module Java.ClassPath.Types

-- | Directories tree
data Tree a
Directory :: FilePath -> [Tree a] -> Tree a
File :: a -> Tree a

-- | ClassPath entry
data CPEntry

-- | Not loaded .class file
NotLoaded :: FilePath -> CPEntry

-- | Class loaded from .class file
Loaded :: FilePath -> Class Direct -> CPEntry

-- | Not loaded .jar file
NotLoadedJAR :: FilePath -> FilePath -> CPEntry

-- | Class loaded from .jar file
LoadedJAR :: FilePath -> Class Direct -> CPEntry

-- | ClassPath monad
type ClassPath a = StateT [Tree CPEntry] IO a
instance GHC.Classes.Eq Java.ClassPath.Types.CPEntry
instance GHC.Classes.Eq a => GHC.Classes.Eq (Java.ClassPath.Types.Tree a)
instance GHC.Show.Show Java.ClassPath.Types.CPEntry
instance GHC.Show.Show a => GHC.Show.Show (Java.ClassPath.Types.Tree a)

module Java.ClassPath.Common

-- | map on forest
mapF :: (t -> a) -> [Tree t] -> [Tree a]

-- | mapM on forest
mapFM :: (Monad m, Functor m) => (t -> m a) -> [Tree t] -> m [Tree a]

-- | mapM on tree
mapTM :: (Monad m, Functor m) => (t -> m a) -> Tree t -> m (Tree a)
mapFMF :: (Monad m, Functor m) => (FilePath -> t -> m a) -> [Tree t] -> m [Tree a]
mapTMF :: (Monad m, Functor m) => (FilePath -> t -> m a) -> Tree t -> m (Tree a)

-- | map on tree
mapT :: (t -> a) -> Tree t -> Tree a

-- | Build tree from list of filenames. For example, ["org<i>haskell",
--   "org</i>java"] --&gt; [org/{haskell, java}]
buildTree :: [FilePath] -> [Tree FilePath]

-- | Merge ClassPath forest. For example, [org<i>haskell, org</i>java]
--   --&gt; [org/{haskell, java}].
merge :: [Tree CPEntry] -> [Tree CPEntry]

-- | Add one ClassPath tree to forest.
merge1 :: [Tree CPEntry] -> Tree CPEntry -> [Tree CPEntry]


-- | This module defines functions to read Java JAR files.
module Java.JAR.Archive
readJAREntry :: Enum a => FilePath -> String -> IO (Maybe [a])

-- | Read all entires from JAR file
readAllJAR :: FilePath -> IO [Tree CPEntry]

-- | Read one class from JAR file
readFromJAR :: FilePath -> FilePath -> IO (Class Direct)
checkClassTree :: [Tree CPEntry] -> IO [Tree (FilePath, Class Direct)]
zipJAR :: [Tree (FilePath, Class Direct)] -> Archive ()

module Java.ClassPath

-- | Append one file to ClassPath forest
appendPath :: FilePath -> [Tree CPEntry] -> [Tree CPEntry]

-- | Add one directory to current ClassPath
addDirectory :: FilePath -> ClassPath ()

-- | Load one class in current ClassPath
loadClass :: String -> ClassPath ()

-- | Run ClassPath monad
runClassPath :: ClassPath a -> IO a

-- | Run ClassPath monad and return resulting ClassPath
execClassPath :: ClassPath () -> IO [Tree CPEntry]

-- | Get one ClassPath entry
getEntry :: [Tree CPEntry] -> String -> IO (Maybe CPEntry)


-- | This module defines Generate[IO] monad, which helps generating JVM
--   code and creating Java class constants pool.
--   
--   Code generation could be done using one of two monads: Generate and
--   GenerateIO. Generate monad is pure (simply State monad), while
--   GenerateIO is IO-related. In GenerateIO additional actions are
--   available, such as setting up ClassPath and loading classes (from
--   .class files or JAR archives).
module JVM.Builder.Monad

-- | Generator state
data GState
GState :: [Instruction] -> Pool Direct -> Word16 -> [Method Direct] -> Maybe (Method Direct) -> Word16 -> Word16 -> [Tree CPEntry] -> GState

-- | Already generated code (in current method)
[generated] :: GState -> [Instruction]

-- | Already generated constants pool
[currentPool] :: GState -> Pool Direct

-- | Next index to be used in constants pool
[nextPoolIndex] :: GState -> Word16

-- | Already generated class methods
[doneMethods] :: GState -> [Method Direct]

-- | Current method
[currentMethod] :: GState -> Maybe (Method Direct)

-- | Maximum stack size for current method
[stackSize] :: GState -> Word16

-- | Maximum number of local variables for current method
[locals] :: GState -> Word16
[classPath] :: GState -> [Tree CPEntry]

-- | Empty generator state
emptyGState :: GState
class Monad m => GeneratorMonad m
getGState :: GeneratorMonad m => m GState
putGState :: GeneratorMonad m => GState -> m ()
class (Monad (g e), GeneratorMonad (g e)) => Generator e g
throwG :: (Generator e g, Exception x, Throws x e) => x -> g e a

-- | Generate monad
newtype Generate e a
Generate :: EMT e (State GState) a -> Generate e a
[runGenerate] :: Generate e a -> EMT e (State GState) a

-- | IO version of Generate monad
newtype GenerateIO e a
GenerateIO :: EMT e (StateT GState IO) a -> GenerateIO e a
[runGenerateIO] :: GenerateIO e a -> EMT e (StateT GState IO) a

-- | Add a constant into pool
addToPool :: Generator e g => Constant Direct -> g e Word16

-- | Generate one (zero-arguments) instruction
i0 :: Generator e g => Instruction -> g e ()

-- | Generate one one-argument instruction
i1 :: Generator e g => (Word16 -> Instruction) -> Constant Direct -> g e ()

-- | Generate one one-argument instruction
i8 :: Generator e g => (Word8 -> Instruction) -> Constant Direct -> g e ()

-- | Generate new method
newMethod :: (Generator e g, Throws UnexpectedEndMethod e) => [AccessFlag] -> ByteString -> [ArgumentSignature] -> ReturnSignature -> g e () -> g e (NameType (Method Direct))

-- | Set maximum stack size for current method
setStackSize :: Generator e g => Word16 -> g e ()

-- | Set maximum number of local variables for current method
setMaxLocals :: Generator e g => Word16 -> g e ()

-- | Update ClassPath
withClassPath :: ClassPath () -> GenerateIO e ()

-- | Get class field signature from current ClassPath
getClassField :: (Throws ENotFound e, Throws ENotLoaded e) => String -> ByteString -> GenerateIO e (NameType (Field Direct))

-- | Get class method signature from current ClassPath
getClassMethod :: (Throws ENotFound e, Throws ENotLoaded e) => String -> ByteString -> GenerateIO e (NameType (Method Direct))

-- | Generate a class
generate :: [Tree CPEntry] -> ByteString -> Generate (Caught SomeException NoExceptions) () -> Class Direct

-- | Generate a class
generateIO :: [Tree CPEntry] -> ByteString -> GenerateIO (Caught SomeException NoExceptions) () -> IO (Class Direct)
generateCodeLength :: Generate (Caught SomeException NoExceptions) a -> Word32
instance Control.Monad.State.Class.MonadState JVM.Builder.Monad.GState (JVM.Builder.Monad.GenerateIO e)
instance Control.Monad.IO.Class.MonadIO (JVM.Builder.Monad.GenerateIO e)
instance GHC.Base.Monad (JVM.Builder.Monad.GenerateIO e)
instance GHC.Base.Applicative (JVM.Builder.Monad.GenerateIO e)
instance GHC.Base.Functor (JVM.Builder.Monad.GenerateIO e)
instance Control.Monad.State.Class.MonadState JVM.Builder.Monad.GState (JVM.Builder.Monad.Generate e)
instance GHC.Base.Monad (JVM.Builder.Monad.Generate e)
instance GHC.Base.Applicative (JVM.Builder.Monad.Generate e)
instance GHC.Base.Functor (JVM.Builder.Monad.Generate e)
instance GHC.Show.Show JVM.Builder.Monad.GState
instance GHC.Classes.Eq JVM.Builder.Monad.GState
instance JVM.Builder.Monad.Generator e JVM.Builder.Monad.GenerateIO
instance Control.Monad.State.Class.MonadState JVM.Builder.Monad.GState (Control.Monad.Exception.Base.EMT e (Control.Monad.Trans.State.Lazy.State JVM.Builder.Monad.GState)) => JVM.Builder.Monad.Generator e JVM.Builder.Monad.Generate
instance (GHC.Base.Monad m, Control.Monad.State.Class.MonadState JVM.Builder.Monad.GState m) => JVM.Builder.Monad.GeneratorMonad m
instance Control.Monad.IO.Class.MonadIO (Control.Monad.Exception.Base.EMT e (Control.Monad.Trans.State.Lazy.StateT JVM.Builder.Monad.GState GHC.Types.IO))
instance Control.Monad.State.Class.MonadState st (Control.Monad.Exception.Base.EMT e (Control.Monad.Trans.State.Lazy.StateT st GHC.Types.IO))
instance Control.Monad.State.Class.MonadState st (Control.Monad.Exception.Base.EMT e (Control.Monad.Trans.State.Lazy.State st))


-- | 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
nop :: Generator e g => g e ()
aconst_null :: Generator e g => g e ()
iconst_m1 :: Generator e g => g e ()
iconst_0 :: Generator e g => g e ()
iconst_1 :: Generator e g => g e ()
iconst_2 :: Generator e g => g e ()
iconst_3 :: Generator e g => g e ()
iconst_4 :: Generator e g => g e ()
iconst_5 :: Generator e g => g e ()
lconst_0 :: Generator e g => g e ()
lconst_1 :: Generator e g => g e ()
fconst_0 :: Generator e g => g e ()
fconst_1 :: Generator e g => g e ()
fconst_2 :: Generator e g => g e ()
dconst_0 :: Generator e g => g e ()
dconst_1 :: Generator e g => g e ()
bipush :: Generator e g => Word8 -> g e ()
sipush :: Generator e g => Word16 -> g e ()
ldc1 :: Generator e g => Constant Direct -> g e ()
ldc2 :: Generator e g => Constant Direct -> g e ()
ldc2w :: Generator e g => Constant Direct -> g e ()
iload :: Generator e g => Constant Direct -> g e ()
lload :: Generator e g => Constant Direct -> g e ()
fload :: Generator e g => Constant Direct -> g e ()
dload :: Generator e g => Constant Direct -> g e ()
aload :: Generator e g => Constant Direct -> g e ()
iload_ :: Generator e g => IMM -> g e ()
lload_ :: Generator e g => IMM -> g e ()
fload_ :: Generator e g => IMM -> g e ()
dload_ :: Generator e g => IMM -> g e ()
aload_ :: Generator e g => IMM -> g e ()
iaload :: Generator e g => g e ()
laload :: Generator e g => g e ()
faload :: Generator e g => g e ()
daload :: Generator e g => g e ()
aaload :: Generator e g => g e ()
caload :: Generator e g => g e ()
saload :: Generator e g => g e ()
istore :: Generator e g => Constant Direct -> g e ()
lstore :: Generator e g => Constant Direct -> g e ()
fstore :: Generator e g => Constant Direct -> g e ()
dstore :: Generator e g => Constant Direct -> g e ()
astore :: Generator e g => Constant Direct -> g e ()
istore_ :: Generator e g => Word8 -> g e ()
lstore_ :: Generator e g => Word8 -> g e ()
fstore_ :: Generator e g => Word8 -> g e ()
dstore_ :: Generator e g => Word8 -> g e ()
astore_ :: Generator e g => Word8 -> g e ()
iastore :: Generator e g => g e ()
lastore :: Generator e g => g e ()
fastore :: Generator e g => g e ()
dastore :: Generator e g => g e ()
aastore :: Generator e g => g e ()
bastore :: Generator e g => g e ()
castore :: Generator e g => g e ()
sastore :: Generator e g => g e ()
pop :: Generator e g => g e ()
pop2 :: Generator e g => g e ()
dup :: Generator e g => g e ()
dup_x1 :: Generator e g => g e ()
dup_x2 :: Generator e g => g e ()
dup2 :: Generator e g => g e ()
dup2_x1 :: Generator e g => g e ()
dup2_x2 :: Generator e g => g e ()
swap :: Generator e g => g e ()
iadd :: Generator e g => g e ()
ladd :: Generator e g => g e ()
fadd :: Generator e g => g e ()
dadd :: Generator e g => g e ()
isub :: Generator e g => g e ()
lsub :: Generator e g => g e ()
fsub :: Generator e g => g e ()
dsub :: Generator e g => g e ()
imul :: Generator e g => g e ()
lmul :: Generator e g => g e ()
fmul :: Generator e g => g e ()
dmul :: Generator e g => g e ()
idiv :: Generator e g => g e ()
ldiv :: Generator e g => g e ()
fdiv :: Generator e g => g e ()
ddiv :: Generator e g => g e ()
irem :: Generator e g => g e ()
lrem :: Generator e g => g e ()
frem :: Generator e g => g e ()
drem :: Generator e g => g e ()
ineg :: Generator e g => g e ()
lneg :: Generator e g => g e ()
fneg :: Generator e g => g e ()
dneg :: Generator e g => g e ()
ishl :: Generator e g => g e ()
lshl :: Generator e g => g e ()
ishr :: Generator e g => g e ()
lshr :: Generator e g => g e ()
iushr :: Generator e g => g e ()
lushr :: Generator e g => g e ()
iand :: Generator e g => g e ()
land :: Generator e g => g e ()
ior :: Generator e g => g e ()
lor :: Generator e g => g e ()
ixor :: Generator e g => g e ()
lxor :: Generator e g => g e ()
iinc :: Generator e g => Word8 -> Word8 -> g e ()
i2l :: Generator e g => g e ()
i2f :: Generator e g => g e ()
i2d :: Generator e g => g e ()
l2i :: Generator e g => g e ()
l2f :: Generator e g => g e ()
l2d :: Generator e g => g e ()
f2i :: Generator e g => g e ()
f2l :: Generator e g => g e ()
f2d :: Generator e g => g e ()
d2i :: Generator e g => g e ()
d2l :: Generator e g => g e ()
d2f :: Generator e g => g e ()
i2b :: Generator e g => g e ()
i2c :: Generator e g => g e ()
i2s :: Generator e g => g e ()
lcmp :: Generator e g => g e ()

-- | Wide instruction
wide :: Generator e g => (Word8 -> Instruction) -> Constant Direct -> g e ()
new :: Generator e g => ByteString -> g e ()
newArray :: Generator e g => ArrayType -> g e ()
allocNewArray :: Generator e g => ByteString -> g e ()
invokeVirtual :: Generator e g => ByteString -> NameType (Method Direct) -> g e ()
invokeStatic :: Generator e g => ByteString -> NameType (Method Direct) -> g e ()
invokeSpecial :: Generator e g => ByteString -> NameType (Method Direct) -> g e ()
getStaticField :: Generator e g => ByteString -> NameType (Field Direct) -> g e ()
loadString :: Generator e g => String -> g e ()
allocArray :: Generator e g => ByteString -> g e ()

module JVM.Builder
arrayOf :: FieldType -> FieldType
sizedArray :: Int -> FieldType -> FieldType


-- | This module exports some definitions from standard Java java.lang
--   package.
module Java.Lang
objectClass :: FieldType
stringClass :: FieldType
integerClass :: FieldType
systemClass :: FieldType
object :: IsString s => s
string :: IsString s => s
integer :: IsString s => s
system :: IsString s => s

-- | java.lang.Object.<a>init</a>() method
objectInit :: NameType (Method Direct)

-- | java.lang.Integer.valueOf() method
valueOfInteger :: NameType (Method Direct)


-- | This module exports definitions for some most used classes and methods
--   from standard Java java.io package.
module Java.IO

-- | java.io.PrintStream class name
printStream :: IsString s => s

-- | java.io.PrintStream class as field type
printStreamClass :: FieldType
println :: NameType (Method Direct)
out :: NameType (Field Direct)
printf :: NameType (Method Direct)

module Java.META.Types
type Section = Map String String
type META = [Section]

module Java.META.Spec
class MetaSpec s
loadFirstSection :: MetaSpec s => Section -> s
loadOtherSection :: MetaSpec s => s -> Section -> s
storeMeta :: MetaSpec s => s -> META
loadSpec :: MetaSpec s => META -> s
lookupList :: String -> Maybe String -> [(String, String)]
bool2string :: Bool -> String
string2bool :: String -> Bool

module Java.META.Parser
parseMeta :: String -> Either ParseError META
parseMetaFile :: FilePath -> IO (Either ParseError META)


-- | This module declares functions and data types for JAR meta-information
--   classes, such as MANIFEST.MF etc.
module Java.META

-- | JAR MANIFEST.MF
data Manifest
Manifest :: String -> String -> Bool -> Maybe String -> [String] -> Maybe String -> [ManifestEntry] -> Manifest
[manifestVersion] :: Manifest -> String
[createdBy] :: Manifest -> String
[sealed] :: Manifest -> Bool
[signatureVersion] :: Manifest -> Maybe String
[classPath] :: Manifest -> [String]
[mainClass] :: Manifest -> Maybe String
[manifestEntries] :: Manifest -> [ManifestEntry]

-- | Manifest entry
data ManifestEntry
ManifestEntry :: String -> Bool -> Maybe String -> Bool -> ManifestEntry
[meName] :: ManifestEntry -> String
[meSealed] :: ManifestEntry -> Bool
[meContentType] :: ManifestEntry -> Maybe String
[meBean] :: ManifestEntry -> Bool
instance GHC.Show.Show Java.META.Manifest
instance GHC.Classes.Eq Java.META.Manifest
instance GHC.Show.Show Java.META.ManifestEntry
instance GHC.Classes.Eq Java.META.ManifestEntry
instance Java.META.Spec.MetaSpec Java.META.Manifest

module Java.JAR
readManifest :: Archive (Maybe Manifest)

-- | Read entries from JAR file, using MANIFEST.MF if it exists.
readJAR :: FilePath -> IO [Tree CPEntry]

-- | Read MainClass Entry of a MANIFEST.MF file
readMainClass :: FilePath -> IO (Maybe String)

-- | Add given JAR file to ClassPath
addJAR :: FilePath -> ClassPath ()
