[gambit-list] How JS backend GC:s?
Marc Feeley
feeley at iro.umontreal.ca
Tue May 6 17:46:47 EDT 2014
On May 6, 2014, at 5:40 PM, Mikael <mikael.rcv at gmail.com> wrote:
>
>
>
> 2014-05-06 23:32 GMT+02:00 Marc Feeley <feeley at iro.umontreal.ca>:
>
> On May 6, 2014, at 4:22 PM, Mikael <mikael.rcv at gmail.com> wrote:
>
> > Dear Marc,
> >
> > Just curious, Gambit's JS backend, it uses the JS VM:s GC right -
> >
> > How do you make the SCM to JS object mapping deliver that?
> >
> > I mean, say, a cons cell, a vector, a closure, a firstclass continuation and a stack frame, about how are those mapped to JS objects as for the JS VM to be able to GC them just as it does with ordinary values?
> >
> > - Gambit uses numbers for object references ordinarily, so I guess the object mapping has been done deeper than that, so that actual JS object references are used as SCM object references by the JS backend.
>
> Scheme objects are mapped to JS objects. So a pair is an instance of the “class” Gambit_Pair, and a vector is an instance of the class Gambit_Vector. Scheme closures are JS closures. A Scheme continuation is a chain of frames (each frame is a JS array). So everything is garbage collectible by the JS GC.
>
> There is a bit of fanciness in how the continuations are created. The Scheme stack is an extensible array and stack frames are allocated in this array contiguously. When a continuation is captured the stack is emptied and each frame becomes an independent JS array.
>
> Aha. And then, when one stack frame (JS array) refers to another stack frame (JS array), then this is done by the means of an actual object reference?
>
> E.g.
>
> var frame1 = [value, value ...... ];
>
> var frame2 [value, ........ frame1, ...];
>
Exactly.
The details of how the chain of frames is created when the continuation is captured are given in the paper “http://users-cs.au.dk/danvy/sfp12/papers/thivierge-feeley-paper-sfp12.pdf”.
Marc
More information about the Gambit-list
mailing list