Plan for Exceptions and @nogc?

Jonathan Marler via Digitalmars-d digitalmars-d at puremagic.com
Tue Feb 17 14:14:08 PST 2015


On Tuesday, 17 February 2015 at 21:30:00 UTC, Matthias Bentrup 
wrote:
> On Tuesday, 17 February 2015 at 20:48:07 UTC, Jonathan Marler 
> wrote:
>> That would work if you didn't have to unwind the stack but 
>> unfortunately you do.  The catch block exists in the context 
>> of the function it is written in.  That means it assumes the 
>> stack pointer and stack variables are all in the context of 
>> it's defining function.  If you executed the catch code when 
>> the stack wasn't unwound, then it wouldn't know where any of 
>> the variables were.  Does that make sense?  Think about it for 
>> a minute.  You proposal suggests that the catch code can be 
>> executed no matter how many child functions have been added to 
>> the stack.  This is impossible since the catch code no longer 
>> knows where all of it's stack variables are.  Normally it uses 
>> an offset to the stack pointer but now it has been changed.  
>> That's why you have to unwind the stack.
>
> So the catcher would have to behave like a delegate.

Sure but then you're allocating GC memory again (compounding the 
problem you're trying to solve in the first place).  The best 
solution I can think of that should work in almost every case is 
to allocate the exception on the non-GC heap, then make the 
catcher cleans up the exception.  Simple, and makes sense when 
you think about the lifetime of an exception.  This would have 
been dangerous before but with the new scope semantics D can 
ensure that the exception does not escape the catch block (and 
therefore gets cleaned up properly).


More information about the Digitalmars-d mailing list