runtime hook for Crash on Error

Timon Gehr timon.gehr at gmx.ch
Wed Jun 6 12:27:31 PDT 2012


On 06/06/2012 07:18 PM, Lars T. Kyllingstad wrote:
> On Wednesday, 6 June 2012 at 13:26:09 UTC, Steven Schveighoffer wrote:
>> On Wed, 06 Jun 2012 05:13:39 -0400, Lars T. Kyllingstad
>> <public at kyllingen.net> wrote:
>>
>>> On Friday, 1 June 2012 at 12:29:27 UTC, Steven Schveighoffer wrote:
>>>> On Fri, 01 Jun 2012 04:48:27 -0400, Dmitry Olshansky
>>>> <dmitry.olsh at gmail.com> wrote:
>>>>
>>>>> I don't agree that OutOfMemory is critical:
>>>>> --> make it an exception ?
>>>>
>>>> No. What we need is a non-throwing version of malloc that returns
>>>> NULL. (throwing version can wrap this). If you want to throw an
>>>> exception, then throw it there (or use enforce).
>>>
>>> With some sugar:
>>>
>>> auto a = nothrow new Foo; // Returns null on OOM
>>>
>>> Then, ordinary new can be disallowed in nothrow code.
>>
>> That doesn't work, new conflates memory allocation with construction.
>> What if the constructor throws?
>
> The constructor would have to be marked nothrow as well. Actually, that
> is currently the case:
>
> class Foo
> {
> this() { }
> }
>
> void bar() nothrow
> {
> auto f = new Foo;
> // Error: constructor this is not nothrow
> // Error: function 'bar' is nothrow yet may throw
> }
>
> The only difference between "new" and "nothrow new" is that the latter
> would return null on allocation failure instead of throwing an
> OutOfMemoryError.
>
> Based on this discussion, I gather that one of the big problems is that
> the compiler is free to elide stack unwinding code for nothrow
> functions, despite the fact that they can in fact throw Errors. One
> solution would therefore be to disallow *all* throwing from nothrow
> functions, including Errors.
>
> Besides OutOfMemoryError, I can only think of two other Errors that
> would make this a hassle: AssertError and RangeError. However, both of
> these signify problems with the program logic, and unwinding the stack
> is probably a bad idea anyway, so why not simply make these abort()?
>
> -Lars
>

In the current implementation, in contract checking may catch 
AssertErrors and resume the program normally.


More information about the Digitalmars-d mailing list