On Friday, 13 December 2013 at 17:35:27 UTC, John Colvin wrote:
On Friday, 13 December 2013 at 16:37:51 UTC, Gary Willoughby
wrote:
I have the following code which is massively simplified from a
larger type. The problem occurs between assigning the value to
the type and retrieving it.
The value is assigned through opAssign and the assert passes.
When using a property to retrieve the same data the assert
fails!
import std.bitmanip;
import std.stdio;
import std.traits;
struct IpAddress
{
private ubyte[] _octets;
this(uint value)
{
this.opAssign(value);
}
public @property ubyte[] data()
{
assert(this._octets == [1, 2, 3, 4]);
return this._octets;
}
public void opAssign(uint value)
{
this._octets = value.nativeToBigEndian();
assert(this._octets == [1, 2, 3, 4]);
}
}
unittest
{
auto ipAddress = IpAddress(0x01020304);
assert(ipAddress.data == [1, 2, 3, 4]);
}
Any ideas why?
On a side note i also expected nativeToBigEndian to byte flip
the hex literal, no idea why it hasn't, it's been a long
day... I'm using MacOSX (Intel).
Compiled with: rdmd --force -de -debug -main -property
-unittest -w file.d
opAssign is escaping a reference to its stack by assigning the
static array to the slice _octets. Therefore, garbage.
I'm not going to lie that has gone over my head a little. Could
you explain it more simply please? I just want to totally
understand the issue here. Thanks.