On Jul 18, 2014, at 9:52 AM, Josh Haberman <jhaber...@gmail.com> wrote:
> 
>> The only option when targeting C is to use
>> setjmp / longjmp, but that is going to be pretty inefficient.
> 
> Why do you think of setjmp/longjmp as inefficient? If you use the
> _setjmp/_longjmp variants that don't fiddle with the signal mask, they
> seem pretty efficient to me.
> 
> The bigger problem with setjmp/longjmp to me is that they don't let
> you clean up variables sitting on the stack, as Rust language
> semantics do I believe?
> 
> I can think of a way to do this portably, but it costs two extra
> pointers every time you declare any stack variables. Basically you
> could, every time you declare local variables, make them part of a
> struct that has a pointer to the enclosing local var struct, and a
> pointer to an unwind function. Then when a task fails, traverse this
> list of frames and run the unwind function for each one before calling
> longjmp().
> 
> It's wasteful of stack space (since this is basically duplicating
> unwind info that exists at the system level, like in .eh_frame), but
> it is portable.

This is more along the lines of what I meant. The 32-bit ARM Darwin ABI 
actually uses this form of exception handling, and LLVM has some support for 
it. Unlike DWARF unwinding you incur a cost for every cleanup that you 
register, so it can be quite expensive. Having had to debug issues with it in 
the past in LLVM, I'm not sure I would really trust the codegen to be correct.

Cameron
_______________________________________________
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to