Escape Analysis on reddit
Denis Koroskin
2korden at gmail.com
Fri Oct 31 14:10:38 PDT 2008
On Fri, 31 Oct 2008 23:17:41 +0300, Steven Schveighoffer
<schveiguy at yahoo.com> wrote:
> "Walter Bright" wrote
>> http://www.reddit.com/r/programming/comments/7akzd/escape_analysis/
>
> The question is, in the example:
>
> int* bar(int* p) { return p; }
> int* foo()
> {
> int x = 3;
> return bar(&x);
> }
>
> where is the problem? Is the problem in bar, or is the problem in foo?
>
> The real problem is in foo, because there's technically nothing wrong
> with
> bar.
>
> So what ends up happening in your scheme is this:
>
> int *bar(int *p) { return p;}
>
> void foo(scope int *p)
> {
> int *x = bar(p); // no escape, but compile error
> }
>
> So yes, you are protected, but at the cost of not being able to write
> code
> that is provably safe. The end result is you end up removing scope
> where it
> really should be, and then virally, it makes you remove scope decorations
> everywhere else. I predict that if this is implemented, nobody will be
> able
> to use it.
>
> In order for this to be useful, we need to have a way to express total
> relationships between parameters and the return value. And that would
> probably be so convoluted that it's not worth the syntax.
>
> I'll reiterate my challenge from another thread:
>
> void f(ref int *a, int *b, int *c) { if(*b < *c) a = b; else a = c;}
>
> struct S
> {
> int *v;
> }
>
> int *f2(S* s) { return s.v;}
>
> void f3(ref int *a, ref int *b, ref int *c)
> {
> int *tmp = a;
> a = b; b = c; c = tmp;
> }
>
> void f4()
> {
> int a=1, b=2, c=3;
> auto ap = &a;
> auto bp = &b;
> auto cp = &c;
> S s(cp);
>
> f(ap, bp, cp);
> b = *f2(&s);
> f3(ap, bp, cp);
> }
>
> Please tell me how I should mark f, S, f2, and f3 such that f4 compiles.
> Note that this code all works in D1 and provably has no problems with
> escaping values, since f4 returns void, and no globals are accessed.
>
> -Steve
>
>
I will state the question slightly different. f4 is now pure. What changes
should be done to source code (if any) so that it compiles?
pure void f4()
{
int a=1, b=2, c=3;
auto ap = &a;
auto bp = &b;
auto cp = &c;
S s(cp);
f(ap, bp, cp);
b = *f2(&s);
f3(ap, bp, cp);
}
More information about the Digitalmars-d
mailing list