DIP74 updated with new protocol for function calls
Matthias Bentrup via Digitalmars-d
digitalmars-d at puremagic.com
Sun Mar 1 00:57:16 PST 2015
On Sunday, 1 March 2015 at 07:04:09 UTC, Zach the Mystic wrote:
> On Saturday, 28 February 2015 at 21:12:54 UTC, Andrei
> Alexandrescu wrote:
>> Defines a significantly better function call protocol:
>>
>> http://wiki.dlang.org/DIP74
>>
>> Andrei
>
> This is obviously much better, Andrei.
>
> I think an alternative solution (I know -- another idea --
> against my own first idea!) is to keep track of this from the
> caller's side. The compiler, in this case, when copying a
> ref-counted type (or derivative) into a parameter, would
> actually check to see if it's splitting the variable in two.
> Look at this:
>
> class RcType {...}
>
> void fun(RcType1 c, RcType1 d);
>
> auto x = new RcType;
>
> fun(x, x);
>
> If the compiler were smart, it would realize that by splitting
> parameters this way, it's actually adding an additional
> reference to x. The function should get one x for free, and
> then force an opAdd/opRelease, for every additional x (or x
> derivative) it detects in the same call.
>
> This might be even better than the improved current proposal.
> The real key is realizing that duplicating an lvalue into the
> same function call is subtly adding a new reference to it.
>
> Eh??
Note that you can get the same issue without duplicate
parameters, if you pass an alias to a global variable.
static A a;
void fun(A x) {
a = null; // Releases x
x.func();
}
void main() {
a = new A();
fun(a);
}
More information about the Digitalmars-d
mailing list