Small @nogc experience report

Shachar Shemesh shachar at weka.io
Wed Sep 19 18:51:33 UTC 2018


On 19/09/18 21:35, Steven Schveighoffer wrote:
> On 9/19/18 1:13 PM, Shachar Shemesh wrote:
> 
>> There is a catch, though. Writing Mecca with @nogc required 
>> re-implementing quite a bit of druntime. Mecca uses its own exception 
>> allocations (mkEx, just saw it's not yet documented, it's under 
>> mecca.lib.exception). The same module also has "enforceNGC". We also 
>> have our own asserts. This is partially to support our internal 
>> logging facility, that needs a static list of formats, but it also 
>> solves a very important problem with D's @nogc:
>>
>> void func() @nogc {
>>    assert(condition, string); // string is useless without actual info 
>> about what went wrong.
>>    assert(condition, format(string, arg, arg)); // No good - format is 
>> not @nogc
>>    ASSERT!"format"(condition, arg, arg); // @nogc and convenient
>> }
>>
>> So, yes, we do use @nogc, but it took a *lot* of work to do it.
> 
> I'm running into this coincidentally right now, when trying to debug a 
> PR. I found I'm getting a range error deep inside a phobos function. But 
> because Phobos is trying to be pure @nogc nothrow @safe, I can do almost 
> nothing to display what is wrong.
> 
> What I ended up doing is making an extern(C) hook that had the "right" 
> attributes, even though it's not @nogc (let's face it, you are about to 
> crash anyway).
> 
> But it got me thinking, what a useless interface to display errors we 
> have! Inside Throwable, there is the function toString(someDelegate 
> sink) which prints out the exception trace.
> 
> Near the front there is this:
> 
>          if (msg.length)
>          {
>              sink(": "); sink(msg);
>          }
> 
> My, wouldn't it be nice to be able to override this! And forget about 
> the whole msg BS. When an exception trace is printed, there are almost 
> no restrictions as to what can be done. We should delay the generation 
> of the message until then as well! Not to mention that if we can output 
> things piecemeal through the sink, we don't even have to allocate at all.
> 
> I'm going to write up a more detailed post on this, but it's annoying to 
> throw exceptions without any information EXCEPT what can be converted 
> into a string at runtime at the time of exception. All that is missing 
> is this hook to generate the message.
> 
> -Steve

Then by all means, have a look at ASSERT inside mecca.lib.exception.


More information about the Digitalmars-d mailing list