DIP77 - Fix unsafe RC pass by 'ref'

weaselcat via Digitalmars-d digitalmars-d at puremagic.com
Fri Apr 10 15:01:32 PDT 2015


On Friday, 10 April 2015 at 21:50:13 UTC, Michel Fortin wrote:
> On 2015-04-10 21:29:19 +0000, Walter Bright 
> <newshound2 at digitalmars.com> said:
>
>> On 4/10/2015 2:11 PM, Martin Nowak wrote:
>>> On 04/09/2015 01:10 AM, Walter Bright wrote:
>>>> http://wiki.dlang.org/DIP77
>>> 
>>> In the first problem example:
>>> 
>>>  struct S {
>>>      RCArray!T array;
>>>  }
>>>  void main() {
>>>      auto s = S(RCArray!T([T()])); // s.array's refcount is 
>>> now 1
>>>      foo(s, s.array[0]);           // pass by ref
>>>  }
>>>  void foo(ref S s, ref T t) {
>>>      s.array = RCArray!T([]);      // drop the old s.array
>>>      t.doSomething();              // oops, t is gone
>>>  }
>>> 
>>> What do you do to pin s.array?
>>> 
>>> auto tmp = s;
>>> 
>>> or
>>> 
>>> auto tmp = s.array;
>>> 
>> 
>> The latter.
>
> And how is it pinned in this case?
>
>  struct S {
>      private RCArray!T array;
>      ref T opIndex(int index) return { return array[index]; }
>      void clear() { s.array = RCArray!T([]); }
>  }
>  void main() {
>      auto s = S(RCArray!T([T()])); // s.array's refcount is now 
> 1
>      foo(s, s[0]);           // pass by ref
>  }
>  void foo(ref S s, ref T t) {
>      s.clear();            // drop the old s.array
>      t.doSomething();              // oops, t is gone
>  }

AFAICT it would create a temporary copy of s.array, which would 
keep t valid.

> Nope. It'll scan at compile time the types reachable through 
> the parameters. If any of those types are RCO's that have a 
> type that matches a ref parameter, the
ref parameter's RCO will get copied.


More information about the Digitalmars-d mailing list