Exceptions in @nogc code

Guillaume Piolat via Digitalmars-d digitalmars-d at puremagic.com
Sat Apr 1 11:56:56 PDT 2017


On Saturday, 1 April 2017 at 13:34:58 UTC, Andrei Alexandrescu 
wrote:
> Walter and I discussed the following promising setup:
>
> Use "throw new scope Exception" from @nogc code. That will 
> cause the exception to be allocated in a special stack-like 
> region.
>
> If the catching code uses "catch (scope Exception obj)", then a 
> reference to the exception thus created will be passed to 
> catch. At the end of the catch block there's no outstanding 
> reference to "obj" so it will be freed. All @nogc code must use 
> this form of catch.
>
> If the catching code uses "catch (Exception obj)", the 
> exception is cloned on the gc heap and then freed.
>
> Finally, if an exception is thrown with "throw new Exception" 
> it can be caught with "catch (scope Exception obj)" by copying 
> the exception from the heap into the special region, and then 
> freeing the exception on the heap.
>
> Such a scheme preserves backward compatibility and leverages 
> the work done on "scope".
>
>
> Andrei

(currently using @nogc exceptions with malloc+emplace and 
destroy+free)

OK. The important bit imho is that exception don't become special 
class objects.
ie. "scope new" is not specific to exceptions.
The other @nogc blocker is .destroy


More information about the Digitalmars-d mailing list