The CodeTree sub-structure contains functions that construct and operate on the intermediate code structure of the Poly/ML compiler. It is intended for compilers for languages other than Standard ML to target the back-end.
The intermediate code-tree is untyped and almost no checking is performed on it. It is very easy to cause the compiler or garbage-collector to crash and a failure could occur at some random point.
structure CodeTree : sig type codeBinding type codetree type machineWord val mkConstant: machineWord -> codetree val mkLoadArgument: int -> codetree val mkLoadClosure: int -> codetree val mkLoadLocal: int -> codetree val mkEnv: codeBinding list * codetree -> codetree val mkFunction: codetree * int * string * codetree list * int -> codetree val mkInlineFunction: codetree * int * string * codetree list * int -> codetree val mkCall: codetree * codetree list -> codetree val mkTuple: codetree list -> codetree val mkInd: int * codetree -> codetree val mkIf: codetree * codetree * codetree -> codetree val mkBeginLoop: codetree * (int * codetree) list -> codetree val mkLoop: codetree list -> codetree val mkWhile: codetree * codetree -> codetree val mkRaise: codetree -> codetree val mkHandle: codetree * codetree -> codetree val Ldexc: codetree val mkDec: int * codetree -> codeBinding val mkMutualDecs: (int * codetree) list -> codeBinding val mkNullDec: codetree -> codeBinding val rtsFunction: int -> codetree val pretty: codetree -> pretty val genCode: codetree * int -> unit -> codetree val evalue: codetree -> machineWord option val encodeBinary: codetree -> Word8Vector.vector val decodeBinary: Word8Vector.vector -> codetree val unsafeMakeFunctor: string * NameSpace.signatureVal * NameSpace.signatureVal * codetree -> NameSpace.functorVal end
This encodes the code-tree as a byte vector. It is intended to allow compiled code to be exported and subsequently imported by decodeBinary. There are a number of restrictions on the code-tree to allow it to be exported, primarily that it is fully self-contained. It is really only suitable for use with the code of a functor.
This function imports a code-tree that has been encoded with encodeBinary.
val unsafeMakeFunctor: string * NameSpace.signatureVal * NameSpace.signatureVal * codetree -> NameSpace.functorVal
This function can be used to create a functor from code and signature information.
The genCode function compiles code and returns a function that, when called, will execute the compiled code. genCode(c, nBindings) takes the codetree c and an integer nBindings which is the number of binding addresses used in the top-level tree, or more specifically at least one more than the maximum binding address used. Binding addresses used within functions are not included in this; they are counted within their respective function. The result is a function of type unit -> codetree which when called executes the code. The result is a codetree. Currently this will always be a Constant node whose value can be extracted by evalue.
The evalue function extracts the value from a Constant node. If the argument is not a Constant node the result will be NONE.