Closures are implemented by taking the local variables that
need to survive the scope of the function, and copying them
into a gc allocated chuck of memory. That chunk, called the
closure here, is inserted into the linked list of stack
frames instead of the usual stack frame.
buildClosure() inserts code just after the function prolog
is complete. It allocates memory for the closure, allocates
a local variable (sclosure) to point to it, inserts into it
the link to the enclosing frame, and copies into it the parameters
that are referred to in nested functions.
In VarExp::toElem and SymOffExp::toElem, when referring to a
variable that is in a closure, takes the offset from sclosure rather
than from the frame pointer.
getEthis() and NewExp::toElem need to use sclosure, if set, rather
than the current frame pointer.
Closures are implemented by taking the local variables that need to survive the scope of the function, and copying them into a gc allocated chuck of memory. That chunk, called the closure here, is inserted into the linked list of stack frames instead of the usual stack frame.
buildClosure() inserts code just after the function prolog is complete. It allocates memory for the closure, allocates a local variable (sclosure) to point to it, inserts into it the link to the enclosing frame, and copies into it the parameters that are referred to in nested functions. In VarExp::toElem and SymOffExp::toElem, when referring to a variable that is in a closure, takes the offset from sclosure rather than from the frame pointer.
getEthis() and NewExp::toElem need to use sclosure, if set, rather than the current frame pointer.