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.

Reply via email to