On Mon, May 03, 2004 at 10:46:28AM -0400, Dan Sugalski wrote: > 3) The embedding wrapper is responsible for setting and resetting the > top of stack.
I don't think that this is quite right. The embedding wrapper needs to set (and reset) the top of stack only if it's not set. Otherwise this scenario could happen: Eternal Program | +-> Embedding wrapper (sets stack top) | +-> More parrot code with something unanchored on stack * | +-> Call back out to a subroutine in the external program | +-> Embedding wrapper (sets stack top) | +-> More parrot code that triggers GC | +-> GC And the GC routine won't spot that pointer on the stack at * If the embedding wrapper (well wrappers onto the data access functions and onto the runloop) both set a stack top if it's not yet set, and clear it on exit if they set it, then I think that parrot won't fall foul of the above. Effectively the embedder is playing by the same rules as Leo said that we have to have for a nested call to the runloop - anything calling the runloop must ensure that all PMCs are anchored. Nicholas Clark