[swift-users] Weird function call behaviour

Slava Pestov spestov at apple.com
Wed Feb 22 15:02:41 CST 2017


> On Feb 22, 2017, at 1:01 PM, David Hart <david.w.hart at me.com> wrote:
> 
> 
>> On 22 Feb 2017, at 21:59, Slava Pestov via swift-users <swift-users at swift.org <mailto:swift-users at swift.org>> wrote:
>> 
>> When a class conforms to a protocol and a requirement is fulfilled by a method in an extension, the class does not get a vtable entry for the extension method. So it cannot be overridden in a subclass — there’s nothing to dynamically dispatch here. We plan on addressing this as part of ABI stability.
> 
> What do you mean by “address” this? Force the vtable entry?

Yeah. Instead of having the witness table for the conformance point directly to the extension method, if the conforming type is a class, we will generate a small thunk that calls a vtable entry, and store the extension method in that vtable entry.

Of course this will only work if the conformance is defined in the same translation unit as the class; if you define the extension in a different module, you’ll get the same behavior you observe below.

Slava

> 
>> Slava
>> 
>> 
>>> On Feb 22, 2017, at 9:39 AM, David Hart via swift-users <swift-users at swift.org <mailto:swift-users at swift.org>> wrote:
>>> 
>>> In the following piece of code, can somebody explain the last result? Why the break in consistency? Is this a bug?
>>> 
>>> protocol P {
>>> 	func foo() -> String
>>> }
>>> 
>>> extension P {
>>> 	func foo() -> String { return "P" }
>>> }
>>> 
>>> class A : P {
>>> 	func foo() -> String { return "A" }
>>> }
>>> 
>>> class B : P {}
>>> class C : B {
>>> 	func foo() -> String { return "C" }
>>> }
>>> 
>>> A().foo()          // A
>>> (A() as P).foo()   // A
>>> B().foo()          // P
>>> (B() as P).foo()   // P
>>> C().foo()          // C
>>> (C() as P).foo()   // P
>>> _______________________________________________
>>> swift-users mailing list
>>> swift-users at swift.org <mailto:swift-users at swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-users <https://lists.swift.org/mailman/listinfo/swift-users>
>> 
>> _______________________________________________
>> swift-users mailing list
>> swift-users at swift.org <mailto:swift-users at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-users
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20170222/08900818/attachment.html>


More information about the swift-users mailing list