October 30 [Issue 24838] New: @nogc lambda shouldn't allocate closure when lambda refers only to 'this' | ||||
|---|---|---|---|---|
| ||||
https://issues.dlang.org/show_bug.cgi?id=24838 Issue ID: 24838 Summary: @nogc lambda shouldn't allocate closure when lambda refers only to 'this' Product: D Version: D2 Hardware: All OS: All Status: NEW Severity: enhancement Priority: P1 Component: dmd Assignee: nobody@puremagic.com Reporter: turkeyman@gmail.com error : function `MyClass.myMethod` is `@nogc` yet allocates closure for `myMethod()` with the GC delegate `MyClass.myMethod.__lambda3` closes over variable `this` class MyClass { void doSomething(); void myMethod() @nogc { acceptsCallback(¬Lambda); // this works; delegate is created from the method acceptsCallback((){ doSomething(); }); // doesn't work! closure needlessly tries to allocate } void notLambda() { doSomething(); } } I think this is essentially a bug and a serious usability hindrance. The lambda seems to try and allocate a closure because it captures `this`, but that's no reason to allocate a closure! A function that receives `this` as context is called a method... in the extremely common case where a lambda closes `this` and nothing else, the lambda should just be synthesised as a method of `this` rather than a closure. The double-indirection from the closure is pointless and inefficient anyway. This would make lambda's about 100x more useful in @nogc code, because they can naturally access `this` as context without any closure allocation. -- | ||||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply