YhcSource codeContentsIndex
ByteCode.CompileYhcCore
Synopsis
type Var = CoreVarName
data CState = CState {
csFlags :: Flags
csImports :: (Map String CoreImport)
csConsts :: (Map ConstItem CRef)
csThisFunc :: String
csNextConst :: CRef
csNextLabel :: Label
csMaxDepth :: Int
csIns :: [UseIns]
csEnv :: (Map Var Where)
csDepth :: Int
csEvals :: (Set Var)
csFails :: [(Label, Int)]
}
data CMode
= Strict
| Lazy
data Where
= Stack Int
| Arg Int
type Compiler a = State CState a
bcCompile :: Flags -> IntState -> [CoreImport] -> Core -> BCModule
coreToImports :: Core -> [CoreImport]
cCore :: Core -> Compiler [BCDecl]
cData :: CoreData -> Compiler [BCDecl]
cCtor :: CoreCtor -> Int -> Compiler BCDecl
cFunc :: CoreFunc -> Compiler [BCDecl]
cBody :: CoreExpr -> [Var] -> Compiler [UseIns]
cBody' :: CoreExpr -> [Var] -> Compiler [UseIns]
cPrim :: CoreFunc -> Compiler [BCDecl]
isOnlyCon :: CoreCtorName -> Compiler Bool
cExpr :: CMode -> CoreExpr -> Compiler ()
cArgs :: CMode -> [CoreExpr] -> Compiler ()
cCallGlobal :: CMode -> Var -> Int -> Int -> Compiler ()
cIfBranch :: CoreExpr -> Bool -> Label -> Label -> Compiler Bool
type Alt = (Label, CorePat, CoreExpr)
cAlt :: Label -> Alt -> Compiler Bool
cBinding :: Bool -> (CoreVarName, CoreExpr) -> Int -> Compiler ()
cFail :: Compiler Bool
primForFunc :: CoreFuncName -> Maybe Ins
flattenCoreApp :: CoreExpr -> (CoreExpr, [CoreExpr])
decomposeAlts :: [Alt] -> Compiler (Bool, Bool, [Tag], Maybe Label)
altsAsIf :: [(CorePat, CoreExpr)] -> Maybe (CoreExpr, CoreExpr)
pushConst :: ConstItem -> Compiler ()
pushVar :: Var -> Compiler ()
getIns :: Compiler [UseIns]
getDepth :: Compiler Int
emit :: Ins -> Compiler ()
emitUse :: Ins -> [Var] -> Set Var -> Compiler ()
shiftStack :: Int -> Compiler ()
evalVar :: CMode -> Var -> Compiler ()
eval :: CMode -> Compiler ()
makePure :: Compiler a -> Compiler (a, CState)
asNewFunc :: Compiler a -> Compiler a
branchs :: Label -> String -> [Compiler Bool] -> Compiler ()
bind :: Var -> Where -> Compiler ()
addConst :: ConstItem -> Compiler CRef
newLabel :: Compiler Label
newLabels :: Int -> Compiler [Label]
withFailure :: Label -> Compiler a -> Compiler a
getFailure :: Compiler (Label, Int)
whereIsVar :: Var -> Compiler Where
lookupImport :: String -> Compiler CoreImport
lookupImportData :: String -> Compiler CoreData
lookupImportArity :: String -> Compiler Int
isFailure :: Var -> Bool
intersectManySets :: Ord a => [Set a] -> Set a
Documentation
type Var = CoreVarName
a variable, just to save typing space
data CState
The state of the compilation process
Constructors
CState
csFlags :: Flagsthe overal compilation flags
csImports :: (Map String CoreImport)import definitions
csConsts :: (Map ConstItem CRef)the current constant table items
csThisFunc :: Stringthe name of the current func (for debugging the compiler)
csNextConst :: CRefthe next available constant reference
csNextLabel :: Labelthe next available label
csMaxDepth :: Intthe maximum stack depth encountered
csIns :: [UseIns]the outputted instructions
csEnv :: (Map Var Where)a mapping from variables to arg/stack locations
csDepth :: Intthe current stack depth
csEvals :: (Set Var)the set of already evaluated variables
csFails :: [(Label, Int)]the stack of failure labels and stack depths
data CMode
compiler mode (strict or lazy)
Constructors
Strict
Lazy
show/hide Instances
Eq CMode
Show CMode
data Where
where a variable is stored
Constructors
Stack Inton the stack
Arg Intas an argument
show/hide Instances
Show Where
type Compiler a = State CState a

A case pattern

A monad for compiling

bcCompile
:: Flagscompiler flags
-> IntStateinternal state
-> [CoreImport]items imported into core
-> Corecore to compile
-> BCModulecompiled bytecode
Compile Yhc.Core into bytecode, top-level function
coreToImports :: Core -> [CoreImport]
convert a core to a list of imports of the items within that core
cCore :: Core -> Compiler [BCDecl]
Compile the complete Yhc.Core into bytecode declarations
cData :: CoreData -> Compiler [BCDecl]
Compile a Data declaration into bytecode declarations
cCtor
:: CoreCtorthe constructor to compile
-> Intthe tag of the constructor
-> Compiler BCDeclthe geenrated declaration
Compile a single constructor into a declaration
cFunc :: CoreFunc -> Compiler [BCDecl]
Compile a function declaration into a bytecode declaration
cBody :: CoreExpr -> [Var] -> Compiler [UseIns]
compile the body of the a function and its arguments to bytecode instructions
cBody' :: CoreExpr -> [Var] -> Compiler [UseIns]
compile the body of a function that is definitely not a selector
cPrim :: CoreFunc -> Compiler [BCDecl]
compile a primitive function
isOnlyCon :: CoreCtorName -> Compiler Bool
decide whether a constructor is the only constructor in the datatype
cExpr :: CMode -> CoreExpr -> Compiler ()
compile an expression (either strictly or lazily)
cArgs :: CMode -> [CoreExpr] -> Compiler ()
compile the arguments to a function
cCallGlobal
:: CModemode to compile in (strict or lazy)
-> Varthe name of the function to call
-> Intthe number of arguments given
-> Intthe number of arguments expected
-> Compiler ()
emit instructions to call a global function
cIfBranch :: CoreExpr -> Bool -> Label -> Label -> Compiler Bool
compile an if branch
type Alt = (Label, CorePat, CoreExpr)
an internal alternative
cAlt :: Label -> Alt -> Compiler Bool
compile an alternative
cBinding :: Bool -> (CoreVarName, CoreExpr) -> Int -> Compiler ()
compile a let binding (either for recursive or non-recursive let)
cFail :: Compiler Bool
compile a failure
primForFunc :: CoreFuncName -> Maybe Ins
return the special primitive instruction associated with a function, or Nothing
flattenCoreApp :: CoreExpr -> (CoreExpr, [CoreExpr])
turn a nested application of CoreApp into a function and list of arguments
decomposeAlts :: [Alt] -> Compiler (Bool, Bool, [Tag], Maybe Label)
decompose a list of alternatives into (int-case,complete,tags,default) where int-case is true if this is an int-case, complete is true if the case is complete, tags is the list of constructor tag numbers and default is the default case (if there is one)
altsAsIf :: [(CorePat, CoreExpr)] -> Maybe (CoreExpr, CoreExpr)
decides whether a list of core alternatives are really an if
pushConst :: ConstItem -> Compiler ()
introduce instructions to push a constant
pushVar :: Var -> Compiler ()
push a variable on the stack
getIns :: Compiler [UseIns]
get the instructions
getDepth :: Compiler Int
get the current depth
emit :: Ins -> Compiler ()
emit an instruction
emitUse :: Ins -> [Var] -> Set Var -> Compiler ()
emit an instruction, with usage information
shiftStack :: Int -> Compiler ()
shift all the (Stack n) variables on the stack, also update the depth
evalVar :: CMode -> Var -> Compiler ()
evaluate a variable if it hasn't been evaluated already
eval :: CMode -> Compiler ()
emit an EVAL instruction, if the mode is strict
makePure :: Compiler a -> Compiler (a, CState)
takes a compiler function and changes it so that it doesn't actually modify the state
asNewFunc :: Compiler a -> Compiler a
takes a compiler and executes it as a new function body
branchs :: Label -> String -> [Compiler Bool] -> Compiler ()
take a list of compilers for different branches, run them all and then merge the results the compiler returns a bool indicating whether it returns normally, if it doesn't return normally then it doesn't need to have a depth matching the other branchs.
bind :: Var -> Where -> Compiler ()
bind a variable to a location
addConst :: ConstItem -> Compiler CRef
add a constant to the constant table (if not present) and return its reference
newLabel :: Compiler Label
allocate a new label
newLabels :: Int -> Compiler [Label]
allocate several new labels
withFailure :: Label -> Compiler a -> Compiler a
run a compiler in a new failure block
getFailure :: Compiler (Label, Int)
get the most current failure
whereIsVar :: Var -> Compiler Where
return where a variable can be found
lookupImport :: String -> Compiler CoreImport
lookup an import
lookupImportData :: String -> Compiler CoreData
lookup a data constructor
lookupImportArity :: String -> Compiler Int
lookup the arity of a name
isFailure :: Var -> Bool
test whether an expression a failure variable
intersectManySets :: Ord a => [Set a] -> Set a
calculate the intersection of many sets (analogous to unionManySets)
Produced by Haddock version 0.8