[Issue 16193] New: opApply() doesn't heap allocate closure
    via Digitalmars-d-bugs 
    digitalmars-d-bugs at puremagic.com
       
    Wed Jun 22 06:46:23 PDT 2016
    
    
  
https://issues.dlang.org/show_bug.cgi?id=16193
          Issue ID: 16193
           Summary: opApply() doesn't heap allocate closure
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: schuetzm at gmx.net
// yy.d
module yy;
struct S {
    int opApply(int delegate(int) dg) {
        foreach(i; 1 .. 10) {
            int result = dg(i);
            if(result) return result;
        }
        return 0;
    }
}
// xx.d
import yy;
int* px, py;
int foo() {
    int x = 0, y = 0;
    foreach(i; S.init) {
        px = &x; py = &y;
        y++;
    }
    return y;
}
void main() {
    import std.stdio;
    writeln(foo());
    int z = 0;
    writeln("&x = ", px, " &y = ", py, " &z = ", &z);
}
# dmd -c xx.d
# dmd -c yy.d
# dmd -ofxx xx.o yy.o
# ./xx
prints:
9
&x = 7FFEAD3C47C0 &y = 7FFEAD3C47C4 &z = 7FFEAD3C47E8
(or similar)
As can be seen, all local variables are allocated next to each other, evidently
on the stack. This happens even though S.opApply() doesn't take its delegate as
scope. I'm deliberately using separate compilation here to make sure that the
compiler has no way to infer that the closure doesn't escape.
--
    
    
More information about the Digitalmars-d-bugs
mailing list