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