Sent from my iPad

> On Dec 19, 2015, at 6:38 PM, Dmitri Gribenko <[email protected]> wrote:
> 
> On Sat, Dec 19, 2015 at 12:10 PM, Matthew Johnson via swift-evolution
> <[email protected]> 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 <[email protected]>*/
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to