> On 4 Oct 2017, at 07:11, Slava Pestov via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> 
> 
>> On Oct 3, 2017, at 10:09 PM, Chris Lattner <clatt...@nondot.org 
>> <mailto:clatt...@nondot.org>> wrote:
>> 
>> On Oct 3, 2017, at 9:59 PM, Slava Pestov <spes...@apple.com 
>> <mailto:spes...@apple.com>> wrote:
>>>>> It wouldn't avoid the complexity, because we want the "non-ABI, 
>>>>> always-emit-into-client" behavior for the standard library. For the 
>>>>> soon-to-be-ABI-stable libraries where @inlinable even matters, such as 
>>>>> the standard library and Apple SDK overlays, there's pretty much perfect 
>>>>> overlap between things we want to inline and things we don't want to take 
>>>>> up binary space and ABI surface in binaries, so the behavior Slava 
>>>>> proposes seems like the right default. 
>>>> 
>>>> I disagree.  The semantics being proposed perfectly overlap with the 
>>>> transitional plan for overlays (which matters for the next few years), but 
>>>> they are the wrong default for anything other than overlays and the wrong 
>>>> thing for long term API evolution over the next 20 years.
>>> 
>>> Can you elaborate on this? If inlinable functions have public entry points, 
>>> the version in the framework may or may not be called… because of SIL 
>>> serialization and inlining. Since the existence of the public entry point 
>>> doesn’t offer much of a guarantee, it seems desirable to not have the 
>>> public entry point. For example if the inlinable function is not used 
>>> elsewhere in the framework, we wouldn’t have to emit it at all. This might 
>>> make the standard library smaller for instance.
>> 
>> Sure, let me explain the same thing a different way: because the symbol is 
>> known to be present, clients are not *forced* to inline the body of the 
>> function if it is not profitable.  They know that there is always a single 
>> canonical implementation of the function, so they aren’t forced to replicate 
>> it N times for N clients.
>> 
>> Remember also that there are times where the body of a symbol isn’t the 
>> thing that is useful.  If you curry a method for example, you want its 
>> address.  With the proposed inlining semantics, this forces a copy of the 
>> body to be emitted in every module that uses it, because you don’t have a 
>> canonical name for the thing.
>> 
>>> However I’m still waiting for Dave or Jordan to chime in with the original 
>>> justification for the ‘always emit into client’ behavior. IIRC there was a 
>>> resilience-related argument too, but I don’t remember what it is now.
>> 
>> The only argument I can imagine is the “If it gets inlined, you’re 
>> guaranteed to get the version of the symbol you build against”.  The concern 
>> is that some instances are inlined and some are not, and if the inline and 
>> out of line versions diverge then you can have exciting problems.
>> 
>> My view on that is that you’ve already lost if you’d done this.  If you mark 
>> a declaration as fragile (allowing it to be inlined) you’ve specifically 
>> guaranteed that you’re not going to be changing the observable semantics of 
>> the function.  Introducing new performance optimizations is fine of course.
> 
> I understand your reasoning here, but note that in Jordan’s proposal, he’s 
> adding two new keywords, exhaustive and nonexhaustive. If exhaustive becomes 
> @fragile, does nonexhaustive still make sense?

I’ve already made this argument in the corresponding thread: I’m against 
nonexhaustive because it is the default behaviour (for the same reason we don’t 
have/need non-final). Therefore, I wouldn’t feel bad about seeing it go.

> Slava
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to