On Wed, Jul 09, 2014 at 11:33:09PM +0200, Johannes Pfau via Digitalmars-d wrote:
[...]
> For delegates scope can prevent closure heap allocation. For all other
> types it does nothing. Example:
> 
> import std.stdio;
> 
> void testA(void delegate() cb)
> {
>     cb();
> }
> void testB(scope void delegate() cb)
> {
>     cb();
> }
> 
> void main()
> {
>     int a;
>     void callback() {a = 42;}
> //Callback accesses a, testA might store a reference to callback
> //->a might be accessible after this main function returns
> //->can't keep it on the stack. Allocate a on the heap
>     testA(&callback); 
> 
> //Callback accesses a, but testB does not store a reference
> //as it tells us by using scope
> //So as soon as testB returns, there's no reference to a floating
> //around and we can allocate a on the stack.
> //(Of course as long as we call testA in this function, a is always on
> // the heap. but if we only call testB it can be on the stack)
>     testB(&callback);
> }

Unfortunately, it seems that this is not enforced by the compiler at
all. For example:

        int delegate() globDg;
        
        void func(scope int delegate() dg) {
                globDg = dg;    // shouldn't compile, but does
                globDg();
        }
        
        void sub() {
                int x;
                func(() { return ++x; }); // oops
        }
        
        void trashme() {
                import std.stdio;
                writeln(globDg()); // prints garbage
        }
        
        void main() {
                sub();
                trashme();
        }

If 'scope' is commented out, then it works as expected (i.e., x gets
allocated on the heap).

        https://issues.dlang.org/show_bug.cgi?id=13085


T

-- 
Dogs have owners ... cats have staff. -- Krista Casada

Reply via email to