17
17
// const Metadata * const *elements,
18
18
// const char *labels,
19
19
// const ValueWitnessTable *proposedWitnesses);
20
- //
21
- // SWIFT_RUNTIME_EXPORT SWIFT_CC(swift)
22
- // MetadataResponse
23
- // swift_getTupleTypeMetadata2(MetadataRequest request,
24
- // const Metadata *elt0, const Metadata *elt1,
25
- // const char *labels,
26
- // const ValueWitnessTable *proposedWitnesses);
27
- // SWIFT_RUNTIME_EXPORT SWIFT_CC(swift)
28
- // MetadataResponse
29
- // swift_getTupleTypeMetadata3(MetadataRequest request,
30
- // const Metadata *elt0, const Metadata *elt1,
31
- // const Metadata *elt2, const char *labels,
32
- // const ValueWitnessTable *proposedWitnesses);
20
+
33
21
34
22
@_silgen_name ( " swift_getTupleTypeMetadata " )
35
23
private func swift_getTupleTypeMetadata(
@@ -40,31 +28,13 @@ private func swift_getTupleTypeMetadata(
40
28
proposedWitnesses: UnsafeRawPointer ?
41
29
) -> ( value: Any . Type , state: Int )
42
30
43
- @_silgen_name ( " swift_getTupleTypeMetadata2 " )
44
- private func swift_getTupleTypeMetadata2 (
45
- request: Int ,
46
- element1: Any . Type ,
47
- element2: Any . Type ,
48
- labels: UnsafePointer < Int8 > ? ,
49
- proposedWitnesses: UnsafeRawPointer ?
50
- ) -> ( value: Any . Type , state: Int )
51
-
52
- @_silgen_name ( " swift_getTupleTypeMetadata3 " )
53
- private func swift_getTupleTypeMetadata3 (
54
- request: Int ,
55
- element1: Any . Type ,
56
- element2: Any . Type ,
57
- element3: Any . Type ,
58
- labels: UnsafePointer < Int8 > ? ,
59
- proposedWitnesses: UnsafeRawPointer ?
60
- ) -> ( value: Any . Type , state: Int )
61
-
62
31
public enum TypeConstruct ion {
63
32
/// Returns a tuple metatype of the given element types.
64
33
public static func tupleType<
65
34
ElementTypes: BidirectionalCollection
66
35
> (
67
- of elementTypes: __owned ElementTypes
36
+ of elementTypes: __owned ElementTypes,
37
+ labels: String ? = nil
68
38
) -> Any . Type where ElementTypes. Element == Any . Type {
69
39
// From swift/ABI/Metadata.h:
70
40
// template <typename int_type>
@@ -78,39 +48,50 @@ public enum TypeConstruction {
78
48
let elementCountFlag = 0x0000FFFF
79
49
assert ( elementTypes. count != 1 , " A one-element tuple is not a realistic Swift type " )
80
50
assert ( elementTypes. count <= elementCountFlag, " Tuple size exceeded \( elementCountFlag) " )
81
- switch elementTypes. count {
82
- case 2 :
83
- return swift_getTupleTypeMetadata2 (
84
- request: 0 ,
85
- element1: elementTypes [ elementTypes. startIndex] ,
86
- element2: elementTypes [ elementTypes. index ( elementTypes. startIndex, offsetBy: 1 ) ] ,
87
- labels: nil ,
88
- proposedWitnesses: nil ) . value
89
- case 3 :
90
- return swift_getTupleTypeMetadata3 (
91
- request: 0 ,
92
- element1: elementTypes [ elementTypes. startIndex] ,
93
- element2: elementTypes [ elementTypes. index ( elementTypes. startIndex, offsetBy: 1 ) ] ,
94
- element3: elementTypes [ elementTypes. index ( elementTypes. startIndex, offsetBy: 2 ) ] ,
95
- labels: nil ,
96
- proposedWitnesses: nil ) . value
97
- default :
98
- let result = elementTypes. withContiguousStorageIfAvailable { elementTypesBuffer in
99
- swift_getTupleTypeMetadata (
51
+
52
+ var flags = elementTypes. count
53
+
54
+ // If we have labels to provide, then say the label pointer is not constant
55
+ // because the lifetime of said pointer will only be vaild for the lifetime
56
+ // of the 'swift_getTupleTypeMetadata' call. If we don't have labels, then
57
+ // our label pointer will be empty and constant.
58
+ if labels != nil {
59
+ // Has non constant labels
60
+ flags |= 0x10000
61
+ }
62
+
63
+ let result = elementTypes. withContiguousStorageIfAvailable { elementTypesBuffer in
64
+ if let labels = labels {
65
+ return labels. withCString { labelsPtr in
66
+ swift_getTupleTypeMetadata (
67
+ request: 0 ,
68
+ flags: flags,
69
+ elements: elementTypesBuffer. baseAddress,
70
+ labels: labelsPtr,
71
+ proposedWitnesses: nil
72
+ )
73
+ }
74
+ } else {
75
+ return swift_getTupleTypeMetadata (
100
76
request: 0 ,
101
- flags: elementTypesBuffer . count ,
77
+ flags: flags ,
102
78
elements: elementTypesBuffer. baseAddress,
103
79
labels: nil ,
104
- proposedWitnesses: nil ) . value
80
+ proposedWitnesses: nil
81
+ )
105
82
}
106
- guard let result = result else {
107
- fatalError ( """
108
- The collection of element types does not support an internal representation of
109
- contiguous storage
110
- """ )
111
- }
112
- return result
113
83
}
84
+
85
+ guard let result = result else {
86
+ fatalError (
87
+ """
88
+ The collection of element types does not support an internal representation of
89
+ contiguous storage
90
+ """
91
+ )
92
+ }
93
+
94
+ return result. value
114
95
}
115
96
116
97
/// Creates a type-erased tuple with the given elements.
0 commit comments