//===----------------------------------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// // Pre-specialization of some popular generic classes and functions. //===----------------------------------------------------------------------===// import Swift // ============================================================================= // Definitions of proxy functions that mimic a generic function signature in the // standard library and are annotated with the standard library's // actual generic function name. The "prespecialize" annotation forces // the actual generic function to be specialized based on the argument // types passed to the proxy function. // ============================================================================= extension Collection { // _failEarlyRangeCheck(_: A.Index, bounds: Swift.Range) -> () @_semantics("prespecialize.$sSlsE20_failEarlyRangeCheck_6boundsy5IndexQz_SnyADGtF") func _prespecializeCollection(index: Index, range: Range) {} } extension Collection where Iterator == IndexingIterator { // makeIterator() -> Swift.IndexingIterator @_semantics("prespecialize.$sSlss16IndexingIteratorVyxG0B0RtzrlE04makeB0ACyF") func _prespecializeIndexingIterator() {} } extension BidirectionalCollection { // reversed() -> ReversedCollection @_semantics("prespecialize.$sSKsE8reverseds18ReversedCollectionVyxGyF") func _prespecializeBidirectionalCollection() {} } extension MutableCollection where Self: BidirectionalCollection { // _reverse(within: Swift.Range) -> () @_semantics("prespecialize.$sSMsSKRzrlE8_reverse6withinySny5IndexSlQzG_tF") mutating func _prespecializeMutableBirectionalCollection(range: Range) {} // _insertionSort(within: Swift.Range, // by: (A.Element, A.Element // ) throws -> Swift.Bool) throws -> () @_semantics("prespecialize.$sSMsSKRzrlE14_insertionSort6within2byySny5IndexSlQzG_Sb7ElementSTQz_AHtKXEtKF") mutating func _prespecializeMutableBirectionalCollection(range: Range, cmp: (Element, Element) throws -> Bool) {} // _insertionSort( // within: Swift.Range, // sortedEnd: A.Index, // by: (A.Element, A.Element) throws -> Swift.Bool // ) throws -> () @_semantics("prespecialize.$sSMsSKRzrlE14_insertionSort6within9sortedEnd2byySny5IndexSlQzG_AFSb7ElementSTQz_AItKXEtKF") mutating func _prespecializeMutableBirectionalCollection(range: Range, end: Index, cmp: (Element, Element) throws -> Bool) {} } // extension MutableCollection where Self: BidirectionalCollection extension MutableCollection where Self: RandomAccessCollection { // sort(by: (A.Element, A.Element) throws -> Swift.Bool) throws -> () @_semantics("prespecialize.$sSMsSkRzrlE4sort2byySb7ElementSTQz_ADtKXE_tKF") mutating func _prespecializeMutableRandomAccessCollection(cmp: (Element, Element) throws -> Bool) throws {} } extension RandomAccessCollection where Index : Strideable, Index.Stride == Int { // index(after: A.Index) -> A.Index @_semantics("prespecialize.$sSksSx5IndexRpzSnyABG7IndicesRtzSiAA_6StrideRTzrlE5index5afterA2B_tF") func _prespecializeRandomAccessCollection(after: Index) {} // indices.getter : Swift.Range @_semantics("prespecialize.$sSksSx5IndexRpzSnyABG7IndicesRtzSiAA_6StrideRTzrlE7indicesACvg") func _prespecializeRandomAccessCollection() {} } // _allocateUninitializedArray(Builtin.Word) -> ([A], Builtin.RawPointer) @_semantics("prespecialize.$ss27_allocateUninitializedArrayySayxG_BptBwlF") func _prespecializeArray(_ word: Builtin.Word) -> ([T], Builtin.RawPointer) { return ([], Builtin.inttoptr_Word(word)) } extension Array { // init() -> [A] @_semantics("prespecialize.$sS2ayxGycfC") // startIndex.getter : Swift.Int @_semantics("prespecialize.$sSa10startIndexSivg") // _getCapacity() -> Swift.Int @_semantics("prespecialize.$sSa12_getCapacitySiyF") // _makeMutableAndUnique() -> () @_semantics("prespecialize.$sSa21_makeMutableAndUniqueyyF") // _copyToContiguousArray() -> Swift.ContiguousArray @_semantics("prespecialize.$sSa22_copyToContiguousArrays0cD0VyxGyF") // _hoistableIsNativeTypeChecked() -> Swift.Bool @_semantics("prespecialize.$sSa29_hoistableIsNativeTypeCheckedSbyF") // count.getter : Swift.Int @_semantics("prespecialize.$sSa5countSivg") // capacity.getter : Swift.Int @_semantics("prespecialize.$sSa8capacitySivg") // endIndex.getter : Swift.Int @_semantics("prespecialize.$sSa8endIndexSivg") // formIndex(before: inout Swift.Int) -> () @_semantics("prespecialize.$sSa9formIndex6beforeySiz_tF") func _prespecializeArray() {} // _makeUniqueAndReserveCapacityIfNotUnique() -> () @_semantics("prespecialize.$sSa034_makeUniqueAndReserveCapacityIfNotB0yyF") func _prespecializeMutableArray() {} // _checkSubscript(_: Swift.Int, wasNativeTypeChecked: Swift.Bool) -> Swift._DependenceToken @_semantics("prespecialize.$sSa15_checkSubscript_20wasNativeTypeCheckeds16_DependenceTokenVSi_SbtF") func _prespecializeArray(index: Int, flag: Bool) {} // _getElement(_: Swift.Int, wasNativeTypeChecked: Swift.Bool, matchingSubscriptCheck: Swift._DependenceToken) -> A @_semantics("prespecialize.$sSa11_getElement_20wasNativeTypeChecked22matchingSubscriptCheckxSi_Sbs16_DependenceTokenVtF") func _prespecializeArray(index: Int, flag: Bool, token: _DependenceToken) {} // init(arrayLiteral: A...) -> [A] @_semantics("prespecialize.$sSa12arrayLiteralSayxGxd_tcfC") func _prespecializeArray(arrayLiteral: Element...) {} // init(_unsafeUninitializedCapacity: Swift.Int, initializingWith: (inout Swift.UnsafeMutableBufferPointer, inout Swift.Int) throws -> ()) throws -> [A] @_semantics("prespecialize.$sSa28_unsafeUninitializedCapacity16initializingWithSayxGSi_ySryxGz_SiztKXEtKcfC") func _prespecializeArray(capacity: Int, generator: (inout UnsafeMutableBufferPointer, inout Int) throws -> ()) {} // removeAll(keepingCapacity: Swift.Bool) -> () @_semantics("prespecialize.$sSa9removeAll15keepingCapacityySb_tF") // default argument 0 of Swift.Array.removeAll(keepingCapacity: Swift.Bool) -> () @_semantics("prespecialize.$sSa9removeAll15keepingCapacityySb_tFfA_") func _prespecializeArray(flag: Bool) {} // init(_uninitializedCount: Swift.Int) -> [A] @_semantics("prespecialize.$sSa19_uninitializedCountSayxGSi_tcfC") // _reserveCapacityAssumingUniqueBuffer(oldCount: Swift.Int) -> () @_semantics("prespecialize.$sSa36_reserveCapacityAssumingUniqueBuffer8oldCountySi_tF") // reserveCapacity(Swift.Int) -> () @_semantics("prespecialize.$sSa15reserveCapacityyySiF") // _copyToNewBuffer(oldCount: Swift.Int) -> () @_semantics("prespecialize.$sSa16_copyToNewBuffer8oldCountySi_tF") // _getCount() -> Swift.Int @_semantics("prespecialize.$sSa9_getCountSiyF") // formIndex(after: inout Swift.Int) -> () @_semantics("prespecialize.$sSa9formIndex5afterySiz_tF") // subscript.modify : (Swift.Int) -> A @_semantics("prespecialize.$sSayxSiciM") // subscript.getter : (Swift.Int) -> A @_semantics("prespecialize.$sSayxSicig") // subscript.read : (Swift.Int) -> A @_semantics("prespecialize.$sSayxSicir") func _prespecializeArray(index: Int) {} // _appendElementAssumeUniqueAndCapacity(_: Swift.Int, newElement: __owned A) -> () @_semantics("prespecialize.$sSa37_appendElementAssumeUniqueAndCapacity_03newB0ySi_xntF") func _prespecializeArray(index: Int, element: Element) {} // append(__owned A) -> () @_semantics("prespecialize.$sSa6appendyyxnF") // init(repeating: A, count: Swift.Int) -> [A] @_semantics("prespecialize.$sSa9repeating5countSayxGx_SitcfC") func _prespecializeArray(element: Element, index: Int) {} // replaceSubrange( // _: Swift.Range, with: __owned A1 // ) -> () @_semantics("prespecialize.$sSa15replaceSubrange_4withySnySiG_qd__nt7ElementQyd__RszSlRd__lF") func _prespecializeArray(range: Range, collection: C) where Element == C.Element {} // _withUnsafeMutableBufferPointerIfSupported( // (inout Swift.UnsafeMutableBufferPointer) throws -> A1 // ) throws -> A1? @_semantics("prespecialize.$sSa42_withUnsafeMutableBufferPointerIfSupportedyqd__Sgqd__SryxGzKXEKlF") func _prespecializeArray(with: (inout UnsafeMutableBufferPointer) throws -> R) {} } // extension Array extension _ContiguousArrayBuffer { // startIndex.getter : Swift.Int @_semantics("prespecialize.$ss22_ContiguousArrayBufferV10startIndexSivg") // firstElementAddress.getter : Swift.UnsafeMutablePointer @_semantics("prespecialize.$ss22_ContiguousArrayBufferV19firstElementAddressSpyxGvg") // count.getter : Swift.Int @_semantics("prespecialize.$ss22_ContiguousArrayBufferV7_buffer19shiftedToStartIndexAByxGAE_SitcfC") // endIndex.getter : Swift.Int @_semantics("prespecialize.$ss22_ContiguousArrayBufferV8endIndexSivg") // init() -> Swift._ContiguousArrayBuffer @_semantics("prespecialize.$ss22_ContiguousArrayBufferVAByxGycfC") func _prespecializeContiguousArrayBuffer() {} // _copyContents(subRange: Swift.Range, initializing: Swift.UnsafeMutablePointer) -> Swift.UnsafeMutablePointer @_semantics("prespecialize.$ss22_ContiguousArrayBufferV13_copyContents8subRange12initializingSpyxGSnySiG_AFtF") func _prespecializeContiguousArrayBuffer(range: Range, pointer: UnsafeMutablePointer) {} // _initStorageHeader(count: Swift.Int, capacity: Swift.Int) -> () @_semantics("prespecialize.$ss22_ContiguousArrayBufferV18_initStorageHeader5count8capacityySi_SitF") func _prespecializeContiguousArrayBuffer(count: Int, capacity: Int) {} @_semantics("prespecialize.$ss22_ContiguousArrayBufferV5countSivg") // init(_buffer: Swift._ContiguousArrayBuffer, shiftedToStartIndex: Swift.Int) -> Swift._ContiguousArrayBuffer func _prespecializeContiguousArrayBuffer(buffer: _ContiguousArrayBuffer, index: Int) {} } #if _runtime(_ObjC) extension _ArrayBuffer { // requestNativeBuffer() -> Swift._ContiguousArrayBuffer? @_semantics("prespecialize.$ss12_ArrayBufferV013requestNativeB0s011_ContiguousaB0VyxGSgyF") // _nonNative.getter : Swift._CocoaArrayWrapper @_semantics("prespecialize.$ss12_ArrayBufferV10_nonNatives06_CocoaA7WrapperVvg") // startIndex.getter : Swift.Int @_semantics("prespecialize.$ss12_ArrayBufferV10startIndexSivg") // firstElementAddress.getter : Swift.UnsafeMutablePointer @_semantics("prespecialize.$ss12_ArrayBufferV19firstElementAddressSpyxGvg") // isUniquelyReferenced() -> Swift.Bool @_semantics("prespecialize.$ss12_ArrayBufferV20isUniquelyReferencedSbyF") // count.setter : Swift.Int @_semantics("prespecialize.$ss12_ArrayBufferV5countSivs") // _native.getter : Swift._ContiguousArrayBuffer @_semantics("prespecialize.$ss12_ArrayBufferV7_natives011_ContiguousaB0VyxGvg") // _isNative.getter : Swift.Bool @_semantics("prespecialize.$ss12_ArrayBufferV9_isNativeSbvg") // capacity.getter : Swift.Int @_semantics("prespecialize.$ss12_ArrayBufferV8capacitySivg") // endIndex.getter : Swift.Int @_semantics("prespecialize.$ss12_ArrayBufferV8endIndexSivg") func _prespecializeArrayBuffer() {} // requestUniqueMutableBackingBuffer(minimumCapacity: Swift.Int) -> Swift._ContiguousArrayBuffer? @_semantics("prespecialize.$ss12_ArrayBufferV027requestUniqueMutableBackingB015minimumCapacitys011_ContiguousaB0VyxGSgSi_tF") // _getElementSlowPath(Swift.Int) -> Swift.AnyObject @_semantics("prespecialize.$ss12_ArrayBufferV19_getElementSlowPathyyXlSiF") // subscript.getter : (Swift.Int) -> A @_semantics("prespecialize.$ss12_ArrayBufferVyxSicig") // subscript.read : (Swift.Int) -> A @_semantics("prespecialize.$ss12_ArrayBufferVyxSicir") func _prespecializeArrayBuffer(index: Int) {} // _typeCheck(Swift.Range) -> () @_semantics("prespecialize.$ss12_ArrayBufferV10_typeCheckyySnySiGF") func _prespecializeArrayBuffer(range: Range) {} // _copyContents(subRange: Swift.Range, initializing: Swift.UnsafeMutablePointer) -> Swift.UnsafeMutablePointer @_semantics("prespecialize.$ss12_ArrayBufferV13_copyContents8subRange12initializingSpyxGSnySiG_AFtF") func _prespecializeArrayBuffer(range: Range, pointer: UnsafeMutablePointer) {} // _checkInoutAndNativeTypeCheckedBounds(_: Swift.Int, wasNativeTypeChecked: Swift.Bool) -> () @_semantics("prespecialize.$ss12_ArrayBufferV37_checkInoutAndNativeTypeCheckedBounds_03wasfgH0ySi_SbtF") func _prespecializeArrayBuffer(index: Int, flag: Bool) {} // init(_buffer: Swift._ContiguousArrayBuffer, shiftedToStartIndex: Swift.Int) -> Swift._ArrayBuffer @_semantics("prespecialize.$ss12_ArrayBufferV7_buffer19shiftedToStartIndexAByxGs011_ContiguousaB0VyxG_SitcfC") func _prespecializeArrayBuffer(buffer: _ContiguousArrayBuffer, index: Int) {} } #endif // ObjC extension Range { // contains(A) -> Swift.Bool @_semantics("prespecialize.$sSn8containsySbxF") func _prespecializeRange(bound: Bound) {} // init(uncheckedBounds: (lower: A, upper: A)) -> Swift.Range @_semantics("prespecialize.$sSn15uncheckedBoundsSnyxGx5lower_x5uppert_tcfC") func _prespecializeRange(bounds: (lower: Bound, upper: Bound)) {} } extension Range where Bound: Strideable, Bound.Stride : SignedInteger { // startIndex.getter @_semantics("prespecialize.$sSnsSxRzSZ6StrideRpzrlE10startIndexxvg") // endIndex.getter @_semantics("prespecialize.$sSnsSxRzSZ6StrideRpzrlE8endIndexxvg") // index(after: A) -> A @_semantics("prespecialize.$sSnsSxRzSZ6StrideRpzrlE5index5afterxx_tF") // subscript.read @_semantics("prespecialize.$sSnsSxRzSZ6StrideRpzrlEyxxcir") func _prespecializeIntegerRange(bound: Bound) {} } extension ClosedRange { // init(uncheckedBounds: (lower: A, upper: A)) -> Swift.ClosedRange @_semantics("prespecialize.$sSN15uncheckedBoundsSNyxGx5lower_x5uppert_tcfC") func _prespecializeClosedRange() {} } extension ClosedRange where Bound: Strideable, Bound.Stride : SignedInteger { // startIndex.getter @_semantics("prespecialize.$sSNsSxRzSZ6StrideRpzrlE10startIndexSNsSxRzSZABRQrlE0C0Oyx_Gvg") // endIndex.getter @_semantics("prespecialize.$sSNsSxRzSZ6StrideRpzrlE8endIndexSNsSxRzSZABRQrlE0C0Oyx_Gvg") // subscript.read @_semantics("prespecialize.$sSNsSxRzSZ6StrideRpzrlEyxSNsSxRzSZABRQrlE5IndexOyx_Gcir") func _prespecializeIntegerClosedRange() {} // index(after: ClosedRange< where A: Swift.Strideable, A.Stride: Swift.SignedInteger>.Index) // -> ClosedRange< where A: Swift.Strideable, A.Stride: Swift.SignedInteger>.Index @_semantics("prespecialize.$sSNsSxRzSZ6StrideRpzrlE5index5afterSNsSxRzSZABRQrlE5IndexOyx_GAG_tF") func _prespecializeIntegerClosedRange(range: Self) {} } // IndexingIterator.next() -> A.Element? @_semantics("prespecialize.$ss16IndexingIteratorV4next7ElementQzSgyF") func _prespecializeIndexingIterator(_ x: IndexingIterator) where Elements : Collection {} // ============================================================================= // Helpers that construct arguments of the necessary specialized types, // passing them to the above generic proxy functions. // ============================================================================= func prespecializeCollections(_ element: T) { var umbp = UnsafeMutableBufferPointer.allocate(capacity: 1) let cmp = { (_: T, _: T) in return false } unsafe umbp._prespecializeMutableBirectionalCollection(range: 0..<0) unsafe umbp._prespecializeMutableBirectionalCollection(range: 0..<0, cmp: cmp) unsafe umbp._prespecializeMutableBirectionalCollection(range: 0..<0, end: 0, cmp: cmp) try! unsafe umbp._prespecializeMutableRandomAccessCollection(cmp: cmp) let _: (Array, Builtin.RawPointer) = _prespecializeArray(0._builtinWordValue) var array = Array() array._prespecializeArray() array._prespecializeMutableArray() array._prespecializeArray(index: 0, flag: false) array._prespecializeArray(index: 0, flag: false, token: _DependenceToken()) array._prespecializeArray(arrayLiteral: element) unsafe array._prespecializeArray(capacity: 0) { (_: inout UnsafeMutableBufferPointer, _: inout Int) in return } array._prespecializeArray(flag: false) array._prespecializeArray(index: 0) array._prespecializeArray(index: 0, element: element) array._prespecializeArray(element: element, index: 0) array._prespecializeArray(range: 0..<0, collection: EmptyCollection()) unsafe array._prespecializeArray(with: { (_: inout UnsafeMutableBufferPointer) -> Optional<()> in return () }) array._prespecializeBidirectionalCollection() array._prespecializeRandomAccessCollection() try! array._prespecializeMutableRandomAccessCollection(cmp: cmp) let cab = _ContiguousArrayBuffer() cab._prespecializeContiguousArrayBuffer() unsafe cab._prespecializeContiguousArrayBuffer(range: (0..<0), pointer: umbp.baseAddress!) cab._prespecializeContiguousArrayBuffer(count: 0, capacity: 0) cab._prespecializeContiguousArrayBuffer(buffer: cab, index: 0) #if _runtime(_ObjC) let ab = _ArrayBuffer() ab._prespecializeArrayBuffer() ab._prespecializeArrayBuffer(index: 0) ab._prespecializeArrayBuffer(range: (0..<0)) unsafe ab._prespecializeArrayBuffer(range: (0..<0), pointer: umbp.baseAddress!) ab._prespecializeArrayBuffer(index: 0, flag: false) ab._prespecializeArrayBuffer(buffer: cab, index: 0) ab._prespecializeRandomAccessCollection(after: 0) ab._prespecializeRandomAccessCollection() ab._prespecializeCollection(index: 0, range: (0..<0)) #endif // ObjC var ca = ContiguousArray() ca._prespecializeRandomAccessCollection() try! ca._prespecializeMutableRandomAccessCollection(cmp: cmp) let cb = _ContiguousArrayBuffer() cb._prespecializeRandomAccessCollection() } func prespecializeRanges() { // Range (0..<0)._prespecializeCollection(index: 0, range: (0..<0)) (0..<0)._prespecializeRange(bound: 0) (0..<0)._prespecializeRange(bounds: (0, 0)) (0..<0)._prespecializeIntegerRange(bound: 0) (0..<0)._prespecializeIndexingIterator() _prespecializeIndexingIterator((0..<0).makeIterator()) // ClosedRange (0...0)._prespecializeClosedRange() (0...0)._prespecializeIntegerClosedRange() (0...0)._prespecializeIntegerClosedRange(range: (0...0)) (0...0)._prespecializeIndexingIterator() _prespecializeIndexingIterator((0...0).makeIterator()) } // ============================================================================= // Top-level function that statically calls all generic entry points // that require prespecialization. // ============================================================================= // Allow optimization here so that specialization occurs. func prespecializeAll() { prespecializeCollections(() as Any) prespecializeCollections("a" as Character) prespecializeCollections("a" as Unicode.Scalar) prespecializeCollections("a".utf8) prespecializeCollections("a".utf16) prespecializeCollections("a".unicodeScalars) prespecializeCollections("a" as String) prespecializeCollections(1.5 as Double) prespecializeCollections(1.5 as Float) prespecializeCollections(1 as Int) prespecializeCollections(1 as UInt) prespecializeCollections(1 as Int8) prespecializeCollections(1 as Int16) prespecializeCollections(1 as Int32) prespecializeCollections(1 as Int64) prespecializeCollections(1 as UInt8) prespecializeCollections(1 as UInt16) prespecializeCollections(1 as UInt32) prespecializeCollections(1 as UInt64) prespecializeRanges() } // Mark with optimize(none) to make sure its not get // rid of by dead function elimination. @_optimize(none) internal func _swift_forcePrespecializations() { prespecializeAll() }