Steve Fink:
# > >  - Easy to forget to remove temporaries from the root set
# > >  - Easy to double-anchor objects and forget to remove the 
# temporary
# > >    anchoring
# > >  - longjmp() can bypass the unanchoring
# > 
# > The temporary objects could be stored in a stack, which is 
# popped when 
# > leaving the current function (both with normal exits and longjmp). 
# > This should make it a lot less likely to forget the unanchoring.
# 
# How do you do this with longjmp? I could see chaining another 
# handler onto the longjmp context so that longjmp would 
# backtrack through all of these allocations, but that would 
# require allocating space for another context. And allocating 
# space further slows down the common case...
# 
# longjmp is really the major blocker for this option, so if 
# you can work around it, then maybe we'll have something. Your 
# stack-based approach sounds plausible as a way to make it 
# easier to handle the bookkeeping, as long as you don't do it 
# with macros. :-) Maybe wrapper functions?
Pseudocode:

void some_func(struct Parrot_Interp *interpreter) {
        anchor(interpreter, a);
        anchor(interpreter, b);
        
        TRY(interpreter) {
                something_that_might_throw_an_exception();
        }
        CATCH(interpreter) {
                
        }
        
        unanchor(interpreter, b);
        unanchor(interpreter, a);
}

#define TRY(interp) if(setup_exception((interp))
#define CATCH(interp) else

BOOLVAL setup_exception(struct Parrot_Interp *interpreter) {
        Parrot_jmpbuf jb=NULL;
        //setup jmpbuf...
        
        if(setjmp(jmpbuf)) {
                jb=stack_pop(interpreter, interpreter->jb_stack);
                //Everything above us naturally falls off
                interpreter->anchor_stack_top=jb->anchor_stack_top;
        }
        else {
                Parrot_jmpbuf *jb=malloc(sizeof(Parrot_jmpbuf));
                
                jb->real_jmpbuf=jmpbuf;
                jb->anchor_stack_top=interpreter->anchor_stack_top;
                ...
                stack_push(interpreter, interpreter->jb_stack, jb);
        }
}

Yeah, I know, macros are evil, but they make this code *soooo* much
prettier...

--Brent Dax <[EMAIL PROTECTED]>
@roles=map {"Parrot $_"} qw(embedding regexen Configure)

"If you want to propagate an outrageously evil idea, your conclusion
must be brazenly clear, but your proof unintelligible."
    --Ayn Rand, explaining how today's philosophies came to be

Reply via email to