[swift-evolution] [Pitch] make @noescape the default
Matthew Johnson
musical.matthew at mac.com
Sat Dec 19 19:10:23 CST 2015
Sent from my iPad
> On Dec 19, 2015, at 6:38 PM, Dmitri Gribenko <gribozavr at gmail.com> wrote:
>
> On Sat, Dec 19, 2015 at 12:10 PM, Matthew Johnson via swift-evolution
> <swift-evolution at swift.org> wrote:
>> @noescape is safer because it does not require thinking about lifetime issues for captured objects. My hunch was that @noescape (or @autoclosure with implies @noescape) is also more common. I had a look through the standard library and this is definitely the case there.
>>
>> What does everyone think about making @noescape the default and introducing @escaping (or something similar) to annotate function arguments that do escape the call stack?
>
> @noescape provides additional guarantees and the optimizer can learn
> to rely on it in future. Thus, it effectively becomes ABI, and you
> can't remove in future versions of the library without breaking the
> ABI. I think adding it should be an explicit decision because of
> that.
>
That makes sense. Still, it would be a shame to have to add it manually if it is actually the right thing a significant majority of the time (Andrew has a good point about looking at app level code to assess this).
One thing to consider - the compiler already detects when function arguments escape the call stack already and provides an error if they are marked @noescape. Because of this it also detects when they do not escape the call stack. I don't think it would be possible to forget @escaping when that is your purpose as you would get an error.
Changing the escaping behavior of a function argument seems like a major change in functionality and thus breaking ABI is probably more acceptable in that case (I'm trying to think of a time when this would even happen - maybe making an synchronous operation asynchronous?).
As the compiler already detects whether the argument escapes or not it seems like the annotation primarily serves a documentation purpose - if you can accept the idea that a change in escaping behavior is significant enough to warrant potentially breaking ABI.
> Dmitri
>
> --
> main(i,j){for(i=2;;i++){for(j=2;j<i;j++){if(!(i%j)){j=0;break;}}if
> (j){printf("%d\n",i);}}} /*Dmitri Gribenko <gribozavr at gmail.com>*/
More information about the swift-evolution
mailing list