Safe Haskell | None |
---|
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).
- data GState = GState {
- generated :: [Instruction]
- currentPool :: Pool Direct
- nextPoolIndex :: Word16
- doneMethods :: [Method Direct]
- currentMethod :: Maybe (Method Direct)
- stackSize :: Word16
- locals :: Word16
- classPath :: [Tree CPEntry]
- emptyGState :: GState
- class (Monad (g e), MonadState GState (g e)) => Generator e g where
- data Generate e a
- data GenerateIO e a
- addToPool :: Generator e g => Constant Direct -> g e Word16
- i0 :: Generator e g => Instruction -> g e ()
- i1 :: Generator e g => (Word16 -> Instruction) -> Constant Direct -> g e ()
- i8 :: Generator e g => (Word8 -> Instruction) -> Constant Direct -> g e ()
- newMethod :: (Generator e g, Throws UnexpectedEndMethod e) => [AccessFlag] -> ByteString -> [ArgumentSignature] -> ReturnSignature -> g e () -> g e (NameType (Method Direct))
- setStackSize :: Generator e g => Word16 -> g e ()
- setMaxLocals :: Generator e g => Word16 -> g e ()
- withClassPath :: ClassPath () -> GenerateIO e ()
- getClassField :: (Throws ENotFound e, Throws ENotLoaded e) => String -> ByteString -> GenerateIO e (NameType (Field Direct))
- getClassMethod :: (Throws ENotFound e, Throws ENotLoaded e) => String -> ByteString -> GenerateIO e (NameType (Method Direct))
- generate :: [Tree CPEntry] -> ByteString -> Generate (Caught SomeException NoExceptions) () -> Class Direct
- generateIO :: [Tree CPEntry] -> ByteString -> GenerateIO (Caught SomeException NoExceptions) () -> IO (Class Direct)
- generateCodeLength :: Generate (Caught SomeException NoExceptions) a -> Word32
Documentation
Generator state
GState | |
|
Eq GState | |
Show GState | |
MonadState GState (GenerateIO e) | |
MonadState GState (Generate e) | |
MonadIO (EMT e (StateT GState IO)) |
Empty generator state
class (Monad (g e), MonadState GState (g e)) => Generator e g whereSource
MonadState GState (EMT e (State GState)) => Generator e Generate | |
Generator e GenerateIO |
Generate monad
data GenerateIO e a Source
IO version of Generate monad
Generator e GenerateIO | |
MonadState GState (GenerateIO e) | |
Monad (GenerateIO e) | |
MonadIO (GenerateIO e) |
i0 :: Generator e g => Instruction -> g e ()Source
Generate one (zero-arguments) instruction
i1 :: Generator e g => (Word16 -> Instruction) -> Constant Direct -> g e ()Source
Generate one one-argument instruction
i8 :: Generator e g => (Word8 -> Instruction) -> Constant Direct -> g e ()Source
Generate one one-argument instruction
:: (Generator e g, Throws UnexpectedEndMethod e) | |
=> [AccessFlag] | Access flags for method (public, static etc) |
-> ByteString | Method name |
-> [ArgumentSignature] | Signatures of method arguments |
-> ReturnSignature | Method return signature |
-> g e () | Generator for method code |
-> g e (NameType (Method Direct)) |
Generate new method
setStackSize :: Generator e g => Word16 -> g e ()Source
Set maximum stack size for current method
setMaxLocals :: Generator e g => Word16 -> g e ()Source
Set maximum number of local variables for current method
withClassPath :: ClassPath () -> GenerateIO e ()Source
Update ClassPath
getClassField :: (Throws ENotFound e, Throws ENotLoaded e) => String -> ByteString -> GenerateIO e (NameType (Field Direct))Source
Get class field signature from current ClassPath
getClassMethod :: (Throws ENotFound e, Throws ENotLoaded e) => String -> ByteString -> GenerateIO e (NameType (Method Direct))Source
Get class method signature from current ClassPath
generate :: [Tree CPEntry] -> ByteString -> Generate (Caught SomeException NoExceptions) () -> Class DirectSource
Generate a class
generateIO :: [Tree CPEntry] -> ByteString -> GenerateIO (Caught SomeException NoExceptions) () -> IO (Class Direct)Source
Generate a class
generateCodeLength :: Generate (Caught SomeException NoExceptions) a -> Word32Source