assert() vs. enforce(), invariant() vs. ... ?
Jacob Carlborg
doob at me.com
Sun Sep 1 02:24:45 PDT 2013
On 2013-09-01 01:09, Andrei Alexandrescu wrote:
> Oh I see. Yes, if we do find a way to define scope to provide
> guarantees, that would be awesome.
How about this:
Object bar ()
{
scope a = new Object;
return a;
}
void main ()
{
bar();
}
In the above code the compiler can determine that it's unsafe to return
"a", with the following error:
Error: escaping reference to scope local a
So apparently it can do some form of limited escape analysis. But it's
quite easy to fool the compiler. The example below won't result in any
compiler errors.
Object foo (Object o)
{
return o;
}
Object bar ()
{
scope a = new Object;
return foo(a);
}
void main ()
{
bar();
}
What if we can help the compiler a bit. If we want to pass a scope
object to another function it's required that the function takes the
parameter as "scope", like this:
Object foo (scope Object o)
{
return o;
}
Object bar ()
{
scope a = new Object;
return foo(a);
}
void main ()
{
bar();
}
Now the compiler knows the "o" in "foo" is scope allocated and will
perform the same analysis it did in the first example. This time the
error will appear in "foo" and not in "bar".
Perhaps we can allow returning scope allocated objects as well if the
function is marked as such:
scope(Object) foo (scope Object o)
{
return o;
}
Object bar ()
{
scope a = new Object;
return foo(a);
}
void main ()
{
bar();
}
Now the error will appear again in "bar" since it doesn't return a scope
object.
--
/Jacob Carlborg
More information about the Digitalmars-d
mailing list