On Thu, 05 Aug 2010 15:13:26 -0400, simendsjo <simen.end...@pandavre.com> wrote:

On 05.08.2010 20:53, Steven Schveighoffer wrote:
On Thu, 05 Aug 2010 14:45:18 -0400, simendsjo
<simen.end...@pandavre.com> wrote:

This is only tested on dmd 2.047 on win7.

According to the spec at http://digitalmars.com/d/2.0/arrays.html:
"Concatenation always creates a copy of its operands, even if one of
the operands is a 0 length array"

But this doesn't seem like the case:

auto a = [0];
auto oldPtr = a.ptr;
assert(a.length == 1);
assert(a.capacity == 3);
a ~= 1;
assert(a.ptr != oldPtr); // Fails - Still the same array

Concatenation is this:

a ~ 1

appending is this:

a ~= 1

Two separate operations, two separate semantics. It might not be easy to
determine that from the spec, but I believe the spec is clear.

-Steve

Hmm... Doing "a = a ~ 1", and it works like specified.
I always assumed that composite operators would mean the same..
That "a += 1" is the same as "a = a + 1" etc.
I cannot find this behavior explained in the spec though..

From the Expression spec, I found that "a op= b" is the same as "a = a op b" - see "Assignment Operator Expressions". No mention of a CatAssignExpression behaving differently. Array doesn't mention anything either.

I found this line in the spec:

"These issues also apply to concatenating arrays with the ~ and ~= operators."

Where "These issues" refer to reallocating in place (look at the section for setting the length of an array).

I think this line is in error, as it directly conflicts with the statement:

"Concatenation always creates a copy of its operands, even if one of the operands is a 0 length array"

I think the line should read:

"These issues also apply to appending arrays with the ~= operator. Note that the concatenation operator ~ is not affected since it always reallocates."

I can assure you that the runtime does always make a copy on concatenation, and always tries to append in place if possible on an expanding length or an append.

The spec needs some work, but the runtime is correct.

I will file a bug against the spec for you.

-Steve

Reply via email to