[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