On Friday, 2 May 2014 at 17:46:54 UTC, deadalnix wrote:
On Friday, 2 May 2014 at 09:41:48 UTC, Marc Schütz wrote:
To make this more useful, turn it into a requirement. It gets us deterministic destruction for reference types. Example:

       ...
       isolated tmp = new Tempfile();
       // use tmp
       ...
       // tmp is guaranteed to get cleaned up
   }


No because...

This needs more elaboration. The problem is control flow:

   isolated a = new A();
   if(...) {
       immutable b = a;
       ...
   }
   a.foo(); // <-- ???

(Similar for loops and gotos.)

There are several possibilities:


Of this.

1) isolateds must be consumed either in every branch or in no branch, and this is statically enforced by the compiler.

2) It's just "forbidden", but the compiler doesn't guarantee it except where it can.

3) The compiler inserts a hidden variable to track the status of the isolated, and asserts if it is used while it's in an invalid state. This can be elided if it can be proven to be unnecessary.


These solutions are all unnecessary restrictive. If the variable may be consumed it is consumed. This is a problem solved for ages for non nullables, there is no need to brainstorm here.

I think the situation is different here. For nullables, you wouldn't gain much by more precise tracking. For isolated, as noted, we'd gain deterministic lifetimes for reference types. This is IMO important enough to accept a few minor complications (which are anyway solvable). There would be no more need for the unsafe std.typecons.scoped, which only works for classes anyway, but not slices or pointers.


I would prefer 3), as it is the most flexible. I also believe a similar runtime check is done in other situations (to guard against return of locals in @safe code, IIRC).


3 is idiotic as the compiler can't ensure anything at compile time.

You can in most cases. Runtime failure is only for the cases where it's not possible.

Random failure at runtime for valid code is not desirable.

It's not random, and the code was _not_ valid: it tried to use a consumed isolated.

Reply via email to