> On Nov 8, 2016, at 4:41 PM, Dave Abrahams via swift-dev <swift-dev@swift.org> 
> wrote:
> 
> The msg send built in is worse than exploiting AnyObject magic. I'd rather 
> fall back to that

As a builtin, we could probably constrain it to be type safe. The AnyObject 
magic implementation right now implies a bunch of optional meddling that I 
don't think we optimize away well, though it does have the benefit of already 
being readily available. Doug also still wants to kill it some day…

-Joe

> 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

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

Reply via email to