1717// const Metadata * const *elements,
1818// const char *labels,
1919// 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+
3321
3422@_silgen_name ( " swift_getTupleTypeMetadata " )
3523private func swift_getTupleTypeMetadata(
@@ -40,31 +28,13 @@ private func swift_getTupleTypeMetadata(
4028 proposedWitnesses: UnsafeRawPointer ?
4129) -> ( value: Any . Type , state: Int )
4230
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-
6231public enum TypeConstruct ion {
6332 /// Returns a tuple metatype of the given element types.
6433 public static func tupleType<
6534 ElementTypes: BidirectionalCollection
6635 > (
67- of elementTypes: __owned ElementTypes
36+ of elementTypes: __owned ElementTypes,
37+ labels: String ? = nil
6838 ) -> Any . Type where ElementTypes. Element == Any . Type {
6939 // From swift/ABI/Metadata.h:
7040 // template <typename int_type>
@@ -78,39 +48,50 @@ public enum TypeConstruction {
7848 let elementCountFlag = 0x0000FFFF
7949 assert ( elementTypes. count != 1 , " A one-element tuple is not a realistic Swift type " )
8050 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 (
10076 request: 0 ,
101- flags: elementTypesBuffer . count ,
77+ flags: flags ,
10278 elements: elementTypesBuffer. baseAddress,
10379 labels: nil ,
104- proposedWitnesses: nil ) . value
80+ proposedWitnesses: nil
81+ )
10582 }
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
11383 }
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
11495 }
11596
11697 /// Creates a type-erased tuple with the given elements.
0 commit comments