mirror of
https://github.com/apple/swift.git
synced 2026-06-20 15:42:51 +02:00
6d8aa71814
Conformance entries are used for fast conformance lookup, which doesn't need to query the runtime's conformance lookup table. A conformance entry specifies if the class conforms or does not conform to a protocol. At runtime, a type cast instruction to an existential can directly load the witness table pointer from the VTable. If null, the class does not conform to the protocol.
82 lines
3.2 KiB
Plaintext
82 lines
3.2 KiB
Plaintext
// RUN: %empty-directory(%t)
|
|
// RUN: %target-swift-frontend -parse-sil -emit-sib -parse-as-library -parse-stdlib -module-name vtable -o %t/vtable.sib %s
|
|
// RUN: %target-sil-opt %t/vtable.sib -o - -emit-sorted-sil | %FileCheck %s
|
|
|
|
sil_stage canonical
|
|
|
|
import Builtin
|
|
|
|
public protocol P1: Base {}
|
|
public protocol P2: Base {}
|
|
public protocol P3: Base {}
|
|
|
|
public class Base: P2 {
|
|
func m1()
|
|
func m2()
|
|
}
|
|
|
|
public class Derived : Base {
|
|
override func m2()
|
|
func m3()
|
|
}
|
|
|
|
sil hidden_external [serialized] @$s1x4BaseC2m1yyF : $@convention(method) (@guaranteed Base) -> ()
|
|
|
|
sil hidden_external [serialized] @$s1x4BaseC2m2yyF : $@convention(method) (@guaranteed Base) -> ()
|
|
|
|
sil hidden_external [serialized] @$s1x4BaseCfd : $@convention(method) (@guaranteed Base) -> @owned Builtin.NativeObject
|
|
|
|
sil hidden_external [serialized] @$s1x4BaseCfD : $@convention(method) (@owned Base) -> ()
|
|
|
|
sil hidden_external [serialized] @$s1x4BaseCACycfC : $@convention(method) (@thick Base.Type) -> @owned Base
|
|
|
|
sil hidden_external [serialized] @$s1x4BaseCACycfc : $@convention(method) (@owned Base) -> @owned Base
|
|
|
|
sil hidden_external [serialized] @$s1x7DerivedC2m2yyF : $@convention(method) (@guaranteed Derived) -> ()
|
|
|
|
sil hidden_external [serialized] @$s1x7DerivedC2m3yyF : $@convention(method) (@guaranteed Derived) -> ()
|
|
|
|
sil hidden_external [serialized] @$s1x7DerivedCfd : $@convention(method) (@guaranteed Derived) -> @owned Builtin.NativeObject
|
|
|
|
sil hidden_external [serialized] @$s1x7DerivedCfD : $@convention(method) (@owned Derived) -> ()
|
|
|
|
sil hidden_external [serialized] @$s1x7DerivedCACycfC : $@convention(method) (@thick Derived.Type) -> @owned Derived
|
|
|
|
sil hidden_external [serialized] @$s1x7DerivedCACycfc : $@convention(method) (@owned Derived) -> @owned Derived
|
|
|
|
sil_vtable Base {
|
|
no_conformance P1
|
|
conformance Base: P2 module vtable
|
|
no_conformance P3
|
|
#Base.m1: (Base) -> () -> () : @$s1x4BaseC2m1yyF
|
|
#Base.m2: (Base) -> () -> () : @$s1x4BaseC2m2yyF
|
|
#Base.init!initializer: (Base.Type) -> () -> Base : @$s1x4BaseCACycfc
|
|
#Base.deinit!deallocator: @$s1x4BaseCfD
|
|
}
|
|
|
|
// CHECK-LABEL: sil_vtable Base {
|
|
// CHECK-NEXT: no_conformance P1
|
|
// CHECK-NEXT: conformance Base: P2 module vtable
|
|
// CHECK-NEXT: no_conformance P3
|
|
// CHECK-NEXT: #Base.m1: (Base) -> () -> () : @$s1x4BaseC2m1yyF
|
|
// CHECK-NEXT: #Base.m2: (Base) -> () -> () : @$s1x4BaseC2m2yyF
|
|
// CHECK-NEXT: #Base.init!initializer: (Base.Type) -> () -> Base : @$s1x4BaseCACycfc
|
|
// CHECK-NEXT: #Base.deinit!deallocator: @$s1x4BaseCfD
|
|
// CHECK-NEXT: }
|
|
|
|
sil_vtable Derived {
|
|
#Base.m1: (Base) -> () -> () : @$s1x4BaseC2m1yyF [inherited]
|
|
#Base.m2: (Base) -> () -> () : @$s1x7DerivedC2m2yyF [override]
|
|
#Base.init!initializer: (Base.Type) -> () -> Base : @$s1x7DerivedCACycfc [override]
|
|
#Derived.m3: (Derived) -> () -> () : @$s1x7DerivedC2m3yyF
|
|
#Derived.deinit!deallocator: @$s1x7DerivedCfD
|
|
}
|
|
|
|
// CHECK-LABEL: sil_vtable Derived {
|
|
// CHECK-NEXT: #Base.m1: (Base) -> () -> () : @$s1x4BaseC2m1yyF [inherited]
|
|
// CHECK-NEXT: #Base.m2: (Base) -> () -> () : @$s1x7DerivedC2m2yyF [override]
|
|
// CHECK-NEXT: #Base.init!initializer: (Base.Type) -> () -> Base : @$s1x7DerivedCACycfc [override]
|
|
// CHECK-NEXT: #Derived.m3: (Derived) -> () -> () : @$s1x7DerivedC2m3yyF
|
|
// CHECK-NEXT: #Derived.deinit!deallocator: @$s1x7DerivedCfD
|
|
// CHECK-NEXT: }
|