Consider:

module foo;

struct S {
    immutable(int)[] arr;
    void fuzz() const pure {
    }
}

void bar(S s) {
    s.fuzz();
}

void main() {
    shared S s;
    bar(s);   // a
    s.fuzz(); // b
}


In this case, the line marked 'a' works perfectly - it compiles and does what I'd expect it to.

However,the line marked 'b' does not compile - " non-shared const method foo.S.fuzz is not callable using a shared mutable object ".

The reason for this is that fuzz takes the 'this' pointer by reference, and so risks that another thread corrupt the internal state while it's working.

Seeing as line 'a' works, it seems safe for line 'b' to make a copy behind the scenes (structs in D are defined to have cheap copying, I seem to recall) and call fuzz on that copy - the type system claims that the call to fuzz cannot possibly change the state of the struct on which it is called.

With the state of 'shared' as it is, I'm unsure if this is a change that should be done - it seems perhaps better to wait for a true overhaul of the feature.

Where I specifically found a need for this is in attempting to fix bug 11188[1]. While I have found a workaround, it's needed per function, and I'm pretty sure it'll break some specific other cases.

[1]: http://d.puremagic.com/issues/show_bug.cgi?id=11188

--
  Simen

Reply via email to