The msg send built in is worse than exploiting AnyObject magic. I'd rather fall 
back to that

Sent from my moss-covered three-handled family gradunza

> On Nov 8, 2016, at 4:34 PM, Alexis <abeingess...@apple.com> wrote:
> 
> 
> 
>> On Nov 8, 2016, at 6:22 PM, Andrew Trick <atr...@apple.com> wrote:
>> 
>> 
>>> On Nov 7, 2016, at 12:15 PM, Alexis via swift-dev <swift-dev@swift.org> 
>>> wrote:
>>> 
>>> Does _unsafeReferenceCast at least verify that the types in question could 
>>> theoretically be cast into each other? That is, one is derived from the 
>>> other? If so, that would probably be an acceptable improvement. (the best 
>>> we could ever hope to do?)
>> 
>> This is what I call lying about types. _unsafeReferenceCast does not and 
>> should not support that. It *should* actually have sanity checks to catch 
>> such incorrect usage. The checks aren’t implemented yet. Instead you may end 
>> up with a crash in the runtime.
>> 
>> unsafeBitCast is the way to lie about a type. It only works when 
>> - dealing with a @objc class protocol
>> - we guarantee that the mistyped reference will never be dynamically cast or 
>> accessed in any way other than msgSend
>> 
>> Those conditions make it immune from struct aliasing based on a 
>> technicality. It does encourage bad practice, and our memory model 
>> documentation now needs to make exceptions for this special, confusing case.
>> 
>> I like JoeG’s idea of a msgSend builtin. I’m just not sure that would 
>> completely obsolete shadow protocols. Are we also using them to satisfy 
>> protocol requirements?
> 
> Once “inside” the realm of shadow protocols, they do provide some decent 
> static type safety guarantees. They provide an assertion that the NSFooCore 
> API is satisfied by all the types we expect. It also provides a nice single 
> place for us to declare the APIs we’re interested in. What does messing up a 
> msgSend imply? Is it type-safe? Do I just get a “no such message” crash at 
> runtime?
> 
>> 
>> -Andy
>> 
>>>> On Nov 7, 2016, at 2:30 PM, Dave Abrahams <dabrah...@apple.com> wrote:
>>>> 
>>>> 
>>>> on Mon Nov 07 2016, Alexis <abeingessner-AT-apple.com> wrote:
>>>> 
>>>>>> On Nov 4, 2016, at 11:55 PM, Dave Abrahams via swift-dev 
>>>>>> <swift-dev@swift.org> wrote:
>>>>>> 
>>>>>> 
>>>>>>> on Fri Nov 04 2016, Slava Pestov <swift-dev-AT-swift.org 
>>>>>>> <http://swift-dev-at-swift.org/>> wrote:
>>>>>>> 
>>>>>>> If the casts are always in one direction, can you make one protocol
>>>>>>> refine another?
>>>>>> 
>>>>>> Yeah, I am shocked if they don't do that already.
>>>>> 
>>>>> They do; _NSFoo: _NSFooCore
>>>>> 
>>>>> But the problem is that we have _NSFooCores and want _NSFoos.
>>>> 
>>>> Right.  Then you need type punning without any dynamic checks,
>>>> a.k.a. _unsafeReferenceCast
>>>> 
>>>>> 
>>>>>> 
>>>>>>> Also note that @objc protocols are self-conforming as long as they
>>>>>>> don’t contain initializers or static methods, but I’m not sure if that
>>>>>>> helps.
>>>>>> 
>>>>>> Doesn't; we're not using these in a generic context; they're just
>>>>>> existentials.
>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>> On Nov 4, 2016, at 4:29 PM, Alexis via swift-dev <swift-dev@swift.org> 
>>>>>>>> wrote:
>>>>>>>> 
>>>>>>>> The swift standard library has this nasty little pattern/problem in it:
>>>>>>>> 
>>>>>>>> The types in the core library want to know about several types
>>>>>>>> defined in foundation: NSString, NSArray, NSDictionary, etc. But
>>>>>>>> core is imported by Foundation, so it can’t (circular references
>>>>>>>> between modules). Thankfully, everything in ObjC is pretty opaquely
>>>>>>>> defined and uniform, and Swift knows how to hook into that uniform
>>>>>>>> layout. So the core library defines Shadow Protocols which provide
>>>>>>>> whatever subset of that type’s API is considered interesting. These
>>>>>>>> protocols are then used in place of the ObjC types. There’s also
>>>>>>>> some magic compiler hooks so core lib types can subclass those
>>>>>>>> foundation types.
>>>>>>>> 
>>>>>>>> However there’s sometimes two Shadow Protocols: one that defines the
>>>>>>>> APIs the stdlib should provide (_NSFooCore), and one that extends
>>>>>>>> that with extra APIs the stdlib wants to consume (_NSFoo). This
>>>>>>>> leads to an awkward situation: as far as the runtime is concerned,
>>>>>>>> the stdlib’s _NSFooCores don’t conform to _NSFoo! We know they do
>>>>>>>> because it’s all just a big lie to hook into ObjC message passing
>>>>>>>> with a bit of type safety, but the runtime doesn’t. So if you try to
>>>>>>>> do a safe type cast, it will fail. This leads to a situation where
>>>>>>>> we sprinkle code with unsafeBitCast’s to _NSFoo which is a massive
>>>>>>>> refactoring hazard.
>>>>>>>> 
>>>>>>>> For instance, there was a struct-containing-a-class that was being
>>>>>>>> cast to _NSFoo in HashedCollections. This happened to work (but was
>>>>>>>> probably still a violation of strict aliasing?) because the struct’s
>>>>>>>> only field was the class. However the struct was later changed to a
>>>>>>>> class, which silently made the cast completely incorrect, banishing
>>>>>>>> the real _NSFoo to the shadow (protocol) realm.
>>>>>>>> 
>>>>>>>> Can we do anything better here? Note that there’s a few places where
>>>>>>>> we also cast an AnyObject into an _NSFoo, but there’s some chance
>>>>>>>> this is all legacy junk that can be updated to at least use
>>>>>>>> _NSFooCore, if not _NSFoo itself.
>>>>>>>> _______________________________________________
>>>>>>>> swift-dev mailing list
>>>>>>>> swift-dev@swift.org
>>>>>>>> https://lists.swift.org/mailman/listinfo/swift-dev
>>>>>>> 
>>>>>>> _______________________________________________
>>>>>>> swift-dev mailing list
>>>>>>> swift-dev@swift.org <mailto:swift-dev@swift.org>
>>>>>>> https://lists.swift.org/mailman/listinfo/swift-dev
>>>>> <https://lists.swift.org/mailman/listinfo/swift-dev>
>>>>>>> 
>>>>>> 
>>>>>> -- 
>>>>>> -Dave
>>>>>> 
>>>>>> _______________________________________________
>>>>>> swift-dev mailing list
>>>>>> swift-dev@swift.org <mailto:swift-dev@swift.org>
>>>>>> https://lists.swift.org/mailman/listinfo/swift-dev
>>>>> <https://lists.swift.org/mailman/listinfo/swift-dev>
>>>> 
>>>> -- 
>>>> -Dave
>>> 
>>> _______________________________________________
>>> swift-dev mailing list
>>> swift-dev@swift.org
>>> https://lists.swift.org/mailman/listinfo/swift-dev
>> 
> 
_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to