digitalmars.D.learn - Strage class' with invariant() {} function behaviour
- mumba (26/26) Oct 08 2008 Hello people.
- Jarrett Billingsley (12/38) Oct 08 2008 D's contracts allow you to put an out contract on a function to see
- mumba (2/6) Oct 08 2008 Sorry, but I don't understand this sentence :). What do you mean by "upd...
- Jarrett Billingsley (4/10) Oct 08 2008 By updated I mean that there seem to be some areas in the D2 compiler
Hello people.
Check this out, and explain please.
class Foo {
invariant(Object) bar() {
return new invariant(Object); //return sth caller cannot change
}
}
So far, so good. Now:
class Foo {
invariant() {} //some design by contract stuff, nothing related to type's
storage classes
Object bar() { //less restrictive version of the previous func
return new Object;
}
}
So far so good. Now let's make a fusion:
class Foo {
invariant() {}
invariant(Object) bar() {
return new invariant(Object);
}
}
BANG! (dmd v2.014)
variable test.Foo.bar.__result cannot modify invariant
...
Of course, I have some theories, but I wouldn't come here if they were good, so
I'll keep them for myself. Tell me yours.
cheers.
Oct 08 2008
On Wed, Oct 8, 2008 at 2:34 PM, mumba <qniol o2.pl> wrote:
Hello people.
Check this out, and explain please.
class Foo {
invariant(Object) bar() {
return new invariant(Object); //return sth caller cannot change
}
}
So far, so good. Now:
class Foo {
invariant() {} //some design by contract stuff, nothing related to type's
storage classes
Object bar() { //less restrictive version of the previous func
return new Object;
}
}
So far so good. Now let's make a fusion:
class Foo {
invariant() {}
invariant(Object) bar() {
return new invariant(Object);
}
}
BANG! (dmd v2.014)
variable test.Foo.bar.__result cannot modify invariant
...
Of course, I have some theories, but I wouldn't come here if they were good,
so I'll keep them for myself. Tell me yours.
cheers.
D's contracts allow you to put an out contract on a function to see
what the result of the function was:
void foo()
out(result) { /* check that result is reasonable */ }
body { /* function body */ }
When you declare a class invariant, it calls the invariant after each
public method is called. My guess is that D is inserting an implicit
"out(result) { assert(this); }" on each public method, but the out
contract probably hasn't yet been updated and thinks typeof(result) is
just Object, not invariant(Object). Hence, error.
It's most likely a bug.
Oct 08 2008
Jarrett Billingsley Wrote:
My guess is that D is inserting an implicit
"out(result) { assert(this); }" on each public method, but the out
contract probably hasn't yet been updated and thinks typeof(result) is
just Object, not invariant(Object). Hence, error.
Sorry, but I don't understand this sentence :). What do you mean by "updated"?
"assert(this) added"? I guess not, since this is what D is actually doing
(beginning of the sentence) so how we can even expect having sth done before we
did it? Is there some kind of "update" D performs in order to turn types to
invariant(types)?
Oct 08 2008
On Wed, Oct 8, 2008 at 3:31 PM, mumba <qniol o2.pl> wrote:Jarrett Billingsley Wrote:By updated I mean that there seem to be some areas in the D2 compiler that still don't know about const and invariant. assert(this) calls the invariant of 'this'.My guess is that D is inserting an implicit "out(result) { assert(this); }" on each public method, but the out contract probably hasn't yet been updated and thinks typeof(result) is just Object, not invariant(Object). Hence, error.Sorry, but I don't understand this sentence :). What do you mean by "updated"? "assert(this) added"? I guess not, since this is what D is actually doing (beginning of the sentence) so how we can even expect having sth done before we did it? Is there some kind of "update" D performs in order to turn types to invariant(types)?
Oct 08 2008








"Jarrett Billingsley" <jarrett.billingsley gmail.com>