Copyright | (c) The University of Glasgow 2001 |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | Jeffrey Young <jeffrey.young@iohk.io> Luite Stegeman <luite.stegeman@iohk.io> Sylvain Henry <sylvain.henry@iohk.io> Josh Meredith <josh.meredith@iohk.io> |
Stability | experimental |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
Top level driver of the JavaScript Backend RTS. This file is an
implementation of the JS RTS for the JS backend written as an EDSL in
Haskell. It assumes the existence of pre-generated JS functions, included as
js-sources in base. These functions are similarly assumed for non-inline
Primops, See Prim
. Most of the elements in this module are
constants in Haskell Land which define pieces of the JS RTS.
Synopsis
- garbageCollector :: JStat
- resetRegister :: StgReg -> JStat
- resetResultVar :: StgRet -> JStat
- closureConstructors :: StgToJSConfig -> JStat
- stackManip :: JStat
- bitsIdx :: Integer -> [Int]
- bhLneStats :: StgToJSConfig -> JExpr -> JExpr -> JStat
- declRegs :: JStat
- regGettersSetters :: JStat
- loadRegs :: JStat
- assignRegs :: StgToJSConfig -> [JExpr] -> JStat
- assignRegs' :: Array Int Ident
- declRets :: JStat
- closureTypes :: JStat
- rtsDecls :: JStat
- rtsText :: StgToJSConfig -> String
- rtsDeclsText :: String
- rts :: StgToJSConfig -> JStat
- rts' :: StgToJSConfig -> JStat
Documentation
garbageCollector :: JStat Source #
The garbageCollector resets registers and result variables.
resetRegister :: StgReg -> JStat Source #
Reset the register r
in JS Land. Note that this "resets" by setting the
register to a dummy variable called "null", not by setting to JS's nil
value.
resetResultVar :: StgRet -> JStat Source #
Reset the return variable r
in JS Land. Note that this "resets" by
setting the register to a dummy variable called "null", not by setting to
JS's nil value.
closureConstructors :: StgToJSConfig -> JStat Source #
Define closures based on size, these functions are syntactic sugar, e.g., a
Haskell function which generates some useful JS. Each Closure constructor
follows the naming convention h$cN, where N is a natural number. For example,
h$c (with the nat omitted) is a JS Land Constructor for a closure in JS land
which has a single entry function f
, and no fields; identical to h$c0. h$c1
is a JS Land Constructor for a closure with an entry function f
, and a
single field x1
, 'Just foo' is an example of this kind of closure. h$c2
is a JS Land Constructor for a closure with an entry function and two data
fields: x1
and x2
. And so on. Note that this has JIT performance
implications; you should use h$c1, h$c2, h$c3, ... h$c24 instead of making
objects manually so layouts and fields can be changed more easily and so the
JIT can optimize better.
stackManip :: JStat Source #
JS Payload to perform stack manipulation in the RTS
bhLneStats :: StgToJSConfig -> JExpr -> JExpr -> JStat Source #
regGettersSetters :: JStat Source #
JS payload to define getters and setters on the registers.
assignRegs :: StgToJSConfig -> [JExpr] -> JStat Source #
Assign registers R1 ... Rn in descending order, that is assign Rn first.
This function uses the assignRegs'
array to construct functions which set
the registers.
assignRegs' :: Array Int Ident Source #
JS payload which defines an array of function symbols that set N registers
from M parameters. For example, h$l2 compiles to:
function h$l4(x1, x2, x3, x4) {
h$r4 = x1;
h$r3 = x2;
h$r2 = x3;
h$r1 = x4;
};
closureTypes :: JStat Source #
JS payload defining the types closures.
rtsText :: StgToJSConfig -> String Source #
print the embedded RTS to a String
rtsDeclsText :: String Source #
print the RTS declarations to a String.
rts' :: StgToJSConfig -> JStat Source #
JS Payload which defines the embedded RTS.