My Reference Safety System (DIP???)

Zach the Mystic via Digitalmars-d digitalmars-d at puremagic.com
Sat Feb 28 21:29:17 PST 2015


On Saturday, 28 February 2015 at 20:49:22 UTC, Marc Schütz wrote:
> I encountered an ugly problem. Actually, I had already run into 
> it in my first proposal, but Steven Schveighoffer just posted 
> about it here, which made me aware again:
>
> http://forum.dlang.org/thread/mcqcor$aa$1@digitalmars.com#post-mcqk4s:246qb:241:40digitalmars.com
>
>     class T {
>         void doSomething() scope;
>     }
>     struct S {
>         RC!T t;
>     }
>     void main() {
>         auto s = S(RC!T()); // `s.t`'s refcount is 1
>         foo(s, s.t);        // borrowing, no refcount changes
>     }
>     void foo(ref S s, scope T t) {
>         s.t = RC!T();       // drops the old `s.t`
>         t.doSomething();    // oops, `t` is gone
>     }

One quick thing. I suggest a solution here:

http://forum.dlang.org/post/jycylhdhdewtgumbavep@forum.dlang.org

You do the checking and adding in the called function, not the 
caller. The algorithm:

1. Keep a compile-time refcount per function. Does the parameter 
get released, i.e. does the refcount ever go below 1? If not, 
stop.

2. Can the parameter contain (as a member) a reference to a 
refcounted struct of the types of any of the other parameters? If 
not, stop.

3. Okay, you need to preserve the reference. Add a call to opAdd 
at the beginning and one to opRelease at the end of the function. 
Done.


More information about the Digitalmars-d mailing list