You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This is both dmd and druntime issue.
By fixing issue 6178, AA value setting with opAssign behavior has been properly fixed in 2.064.
struct S
{
int val;
this(int v) { val = 1; }
void opAssign(S) { val = 2; }
}
void main()
{
S[int] aa;
aa[1] = S(1); // S(1) is moved in the newly allocated AA slot
aa[1] = S(2); // opAssign(S1) is called on existing aa[1] value
assert(aa.length == 1 && aa[1].val == 2);
}
But, the generated code is a little inefficient because it would search the given key twice.
// aa[1] = S(1); is lowered to:
1 in aa ? aa[1].opAssign(S(1)) : aa[1].__ctor(1);
// --> 1 in aa is the first key search.
// --> aa[1] is the second key search.
To fix the issue, we need to add a new internal function in druntime, and compiler should generate code which uses the function.
The new function's spec is:
- it takes at least two arguments, the AA and assigned value.
- it should return two values, one is the allocated/found slot, and the other is a boolean flag which the returned slot is newly allocated or not.
The text was updated successfully, but these errors were encountered:
Kenji Hara (@9rnsr) reported this on 2013-11-02T05:51:21Z
Transferred from https://issues.dlang.org/show_bug.cgi?id=11420
Description
This is both dmd and druntime issue. By fixing issue 6178, AA value setting with opAssign behavior has been properly fixed in 2.064. struct S { int val; this(int v) { val = 1; } void opAssign(S) { val = 2; } } void main() { S[int] aa; aa[1] = S(1); // S(1) is moved in the newly allocated AA slot aa[1] = S(2); // opAssign(S1) is called on existing aa[1] value assert(aa.length == 1 && aa[1].val == 2); } But, the generated code is a little inefficient because it would search the given key twice. // aa[1] = S(1); is lowered to: 1 in aa ? aa[1].opAssign(S(1)) : aa[1].__ctor(1); // --> 1 in aa is the first key search. // --> aa[1] is the second key search. To fix the issue, we need to add a new internal function in druntime, and compiler should generate code which uses the function. The new function's spec is: - it takes at least two arguments, the AA and assigned value. - it should return two values, one is the allocated/found slot, and the other is a boolean flag which the returned slot is newly allocated or not.The text was updated successfully, but these errors were encountered: