On Tuesday, 13 December 2016 at 04:45:35 UTC, Andrei Alexandrescu wrote:
On 12/12/16 11:07 PM, Jonathan M Davis wrote:
On Monday, 12 December 2016 at 15:51:07 UTC, Andrei Alexandrescu wrote:
Here it is:

https://github.com/dlang/druntime/pull/1710

It relieves code that uses assert from needing the GC. I think all Errors should be singletons - multiple objects in that hierarchy arguably make no sense. But of course there are many situations out
there. If this breaks your code, please holler.

I don't know if that would actually work with polymorphic contracts in
classes.

How do you mean that? Do you have an example in mind?

I mean that with virtual functions, in contracts get ||ed and out contracts get &&ed. Since that involves assertions, unless the compiler is doing something special there with assert, that involves throwing multiple AssertErrors and catching them. Depending on how that's implemented, having a singleton for AssertError would break that. If so, I expect that it's fixable, but simply turning AssertError into a singleton without verifying how that would affects contracts on virtual functions seems like a bad idea.

It also could be problematic with unit tests - especially unit
tests that catch AssertErrors (e.g. if someone wants to test the
contracts).

What kind of problems would it create?

Well, if anyone is catching AssertErrors in unit tests, then they'll no longer be getting multiple of them. For some stuff, it wouldn't matter, but for other stuff it would break it. For instance, while the default test runner stops on the first failure in a unittest block, others are going to run them all and then print out the failures, and if AssertError is a singelton, then all of the AssertErrors that were stored to print at the end would then be the same AssertError and would print the same thing, defeating the purpose of the alternate test runner.

Is reducing dependencies for core constructs a good thing?

It is when it reduces functionality, which this does. It puts unnecessary restrictions on AssertError which are of zero benefit for the vast majority of D programs.

And if we fix it so that exceptions don't need the GC (which is arguably needed for @nogc to be widely used), then this whole problem goes away anyway. So, I'm inclined to argue that we just fix _that_ problem and not worry about the fact that assert currently triggers the GC on failure.

I agree the perfect system would fix everything - problem is we don't have it yet. The per-thread singleton is a step forward (which at some point we should probably make publicly available).

We _need_ to fix the fact that exceptions require the GC, or @nogc is utterly useless for large portions of D code simply because of the exceptions, which will make it much harder to use D without the GC. If we fix it so that exceptions don't need the GC, then this problem goes away, and these changes are just an unnecessary complication in druntime.

- Jonathan M Davis

Reply via email to