> On Sep 5, 2017, at 15:52, Greg Parker <gpar...@apple.com> wrote:
> 
> 
>> On Sep 5, 2017, at 11:59 AM, Jordan Rose via swift-dev <swift-dev@swift.org 
>> <mailto:swift-dev@swift.org>> wrote:
>> 
>> Hey, all. In preparation for the several proposals we have to come this 
>> year, I cleaned up docs/LibraryEvolution.rst 
>> <https://github.com/apple/swift/pull/11742> a little bit based on what's 
>> changed in Swift 4. This is mostly just mentioning things about generic 
>> subscripts, but there is one issue that I remember John bringing up some 
>> time in this past year: once you've made a struct fixed-contents, what can 
>> you change about its stored properties?
>> 
>>> To opt out of this flexibility, a struct may be marked '@fixedContents'. 
>>> This promises that no stored properties will be added to or removed from 
>>> the struct, even non-public ones.
>> 
>> Interestingly, this means that you can have non-public members of a 
>> fixed-contents struct. This is actually pretty sensible: it's the equivalent 
>> of a C++ class with non-public fields but a defaulted, inlinable copy 
>> constructor. Any inlinable members can access these properties directly as 
>> well; it's just outsiders that can't see them. But if inlinable code can 
>> reference these things, and if we really want them to be fast, that means 
>> they have to have a known offset at compile-time.
>> 
>> Now, we don't plan to stick to C's layout for structs, even fixed-contents 
>> structs. We'd really like users to not worry about manually packing things 
>> into trailing alignment space. But we still need a way to lay out fields 
>> consistently; if you have two stored properties with the same type, one of 
>> them has to go first. There are two ways to do this: sort by name, and sort 
>> by declaration order. That means we can either allow reordering or allow 
>> renaming, but not both. Which do people think is more important?
>> 
>> At the moment I'm inclined to go with "allow renaming" just because that's 
>> what C does. It's not great because you're allowed to reorder nearly 
>> everything else in the language, but there's a "least surprise" principle 
>> here that I think is still useful. It'd be surprising for the name of a 
>> non-public property to affect your library's ABI.
> 
> In a somewhat similar semantic situation, Objective-C non-fragile ivars chose 
> to allow reordering and disallow renaming. One reason is that we wanted to 
> prevent accidental ABI breaks as best we could. The assumption was that a 
> name change is probably deliberate, but an order change is likely to be an 
> accidental effect of source code rearrangement. In addition, erroneous name 
> changes are more likely to be caught downstream (for example when clients 
> fail to build because they didn't change their use of the name), but 
> erroneous order changes are less likely to be caught later.
> 
> The goal of preventing accidental ABI breaks becomes less important if Swift 
> gets good ABI-diffing tools that can help catch errors after they are 
> introduced. ObjC had no effective way to verify that your current ABI matched 
> your previously-published ABI.

Good point. One slight difference here is that if you do break the ABI with 
non-fragile ivars, it only matters if there are direct references to them from 
outside the library. For @fixedContents structs, the client may have direct 
references to any fields, even the non-public ones, in order to properly 
implement the value copy operation.

Jordan

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

Reply via email to