On 4/1/17 3:34 PM, 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.


Horrible. Introducing the verbose way for the most commonly useful scenario and pushing the complexity on to programmers.

I don't understand what's so difficult to just recognize that "throw new Exception" creates a unique object that is passed to the exception handler. So just mark the exception as unique in the exception handler code so that catch site is aware of it. Are we just bend on penalizing programmers for not typing out "scope"?

In turn I don't see what adding "scope" to the catch site accomplishes - you still need to ensure the reference doesn't escape. And if it doesn't escape you may just as well deallocate the exception object.

> Such a scheme preserves backward compatibility and leverages the work
> done on "scope".

Pardon but I don't see how. It has one good thing going for it - the same keyword.


---
Dmitry Olshansky

Andrei

Reply via email to