Invariants are useless the way they are defined

deadalnix deadalnix at gmail.com
Sun Aug 25 23:49:03 PDT 2013


On Monday, 26 August 2013 at 06:14:02 UTC, Ali Çehreli wrote:
> On 08/25/2013 05:16 AM, deadalnix wrote:
>
> > The problem is that invariant are checked at the
> beginning/end on public
> > function calls. As a consequence, it is impossible to use any
> public
> > method in an invariant.
>
> That's a very interesting observation. Could the solution be 
> running the invariant only once, at the outermost public 
> function call? Hm... It would have to be a runtime feature 
> then, right? Every public function would have calls to the 
> invariant but those calls would have to be elided at runtime. I 
> think...
>

No need for runtime check :D

We simply need to add invariant check in the caller, not the 
callee, and not introduce them if the caller is itself subject to 
invariant insertion when called.

> Here is another interesting observation: It is acceptable and 
> quite normal that the object is in limbo state during a public 
> member function. As a consequence, any function that operates 
> on the object must use the object in a write-only fashion 
> during that time frame. This is true even for non-member 
> functions that the object is passed to. So, in theory, even a 
> logging function cannot use the object. Hm...
>

The question of constness of invariant/contracts has been raised, 
I do think the object should be const, but Andrei think otherwise.


More information about the Digitalmars-d mailing list