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.
On May 6, 2014, at 4:22 PM, Mikael <mikael.rcv@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.
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.
Marc