Skip to content

Commit e37475b

Browse files
committed
[span] small ABI tweaks
1 parent 57345f7 commit e37475b

File tree

4 files changed

+27
-33
lines changed

4 files changed

+27
-33
lines changed

stdlib/public/core/Span/RawSpan.swift

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,19 @@
1616
@available(SwiftStdlib 6.1, *)
1717
@frozen
1818
public struct RawSpan: ~Escapable, Copyable, BitwiseCopyable {
19-
@usableFromInline let _pointer: UnsafeRawPointer?
19+
@usableFromInline internal let _pointer: UnsafeRawPointer?
2020

21-
@usableFromInline @inline(__always)
22-
var _start: UnsafeRawPointer { _pointer.unsafelyUnwrapped }
21+
@_alwaysEmitIntoClient
22+
internal func _start() -> UnsafeRawPointer {
23+
_pointer._unsafelyUnwrappedUnchecked
24+
}
2325

24-
@usableFromInline let _count: Int
26+
@usableFromInline internal let _count: Int
2527

2628
@_disallowFeatureSuppression(NonescapableTypes)
27-
@usableFromInline @inline(__always)
29+
@_alwaysEmitIntoClient
2830
@lifetime(immortal)
29-
init(
31+
internal init(
3032
_unchecked pointer: UnsafeRawPointer?,
3133
byteCount: Int
3234
) {
@@ -194,7 +196,7 @@ extension RawSpan {
194196
_unsafeSpan span: borrowing Span<Element>
195197
) {
196198
self.init(
197-
_unchecked: UnsafeRawPointer(span._start),
199+
_unchecked: span._pointer,
198200
byteCount: span.count &* MemoryLayout<Element>.stride
199201
)
200202
}
@@ -459,7 +461,7 @@ extension RawSpan {
459461
public func unsafeLoad<T>(
460462
fromUncheckedByteOffset offset: Int, as: T.Type
461463
) -> T {
462-
_start.load(fromByteOffset: offset, as: T.self)
464+
_start().load(fromByteOffset: offset, as: T.self)
463465
}
464466

465467
/// Returns a new instance of the given type, constructed from the raw memory
@@ -515,7 +517,7 @@ extension RawSpan {
515517
public func unsafeLoadUnaligned<T: BitwiseCopyable>(
516518
fromUncheckedByteOffset offset: Int, as: T.Type
517519
) -> T {
518-
_start.loadUnaligned(fromByteOffset: offset, as: T.self)
520+
_start().loadUnaligned(fromByteOffset: offset, as: T.self)
519521
}
520522
}
521523

@@ -545,9 +547,10 @@ extension RawSpan {
545547
guard let spanStart = span._pointer, _count > 0 else {
546548
return _pointer == span._pointer ? Range(_uncheckedBounds: (0, 0)) : nil
547549
}
550+
let start = _start()
548551
let spanEnd = spanStart + span._count
549-
if spanStart < _start || (_start + _count) < spanEnd { return nil }
550-
let lower = _start.distance(to: spanStart)
552+
if spanStart < start || (start + _count) < spanEnd { return nil }
553+
let lower = start.distance(to: spanStart)
551554
return Range(_uncheckedBounds: (lower, lower &+ span._count))
552555
}
553556
}

stdlib/public/core/Span/Span.swift

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,19 @@
1717
@available(SwiftStdlib 6.1, *)
1818
public struct Span<Element: ~Copyable & ~Escapable>
1919
: ~Escapable, Copyable, BitwiseCopyable {
20-
@usableFromInline let _pointer: UnsafeRawPointer?
20+
@usableFromInline internal let _pointer: UnsafeRawPointer?
2121

22-
@usableFromInline @inline(__always)
23-
var _start: UnsafeRawPointer { _pointer.unsafelyUnwrapped }
22+
@_alwaysEmitIntoClient
23+
internal func _start() -> UnsafeRawPointer {
24+
_pointer._unsafelyUnwrappedUnchecked
25+
}
2426

25-
@usableFromInline let _count: Int
27+
@usableFromInline internal let _count: Int
2628

2729
@_disallowFeatureSuppression(NonescapableTypes)
28-
@usableFromInline @inline(__always)
30+
@_alwaysEmitIntoClient
2931
@lifetime(immortal)
30-
init(
32+
internal init(
3133
_unchecked pointer: UnsafeRawPointer?,
3234
count: Int
3335
) {
@@ -426,7 +428,7 @@ extension Span where Element: ~Copyable {
426428
public subscript(unchecked position: Index) -> Element {
427429
//FIXME: change to unsafeRawAddress or unsafeAddress when ready
428430
_read {
429-
let element = _start.advanced(by: position&*MemoryLayout<Element>.stride)
431+
let element = _start().advanced(by: position&*MemoryLayout<Element>.stride)
430432
let binding = Builtin.bindMemory(element._rawValue, count._builtinWordValue, Element.self)
431433
defer { Builtin.rebindMemory(element._rawValue, binding) }
432434
yield UnsafePointer<Element>(element._rawValue).pointee
@@ -469,7 +471,7 @@ extension Span where Element: BitwiseCopyable {
469471
@_alwaysEmitIntoClient
470472
public subscript(unchecked position: Index) -> Element {
471473
get {
472-
let address = _start.advanced(by: position&*MemoryLayout<Element>.stride)
474+
let address = _start().advanced(by: position&*MemoryLayout<Element>.stride)
473475
return address.loadUnaligned(as: Element.self)
474476
}
475477
}
@@ -672,10 +674,11 @@ extension Span where Element: ~Copyable {
672674
guard let spanStart = span._pointer, _count > 0 else {
673675
return _pointer == span._pointer ? Range(_uncheckedBounds: (0, 0)) : nil
674676
}
677+
let start = _start()
675678
let stride = MemoryLayout<Element>.stride
676679
let spanEnd = spanStart + stride&*span._count
677-
if spanStart < _start || spanEnd > (_start + stride&*_count) { return nil }
678-
let byteOffset = _start.distance(to: spanStart)
680+
if spanStart < start || spanEnd > (start + stride&*_count) { return nil }
681+
let byteOffset = start.distance(to: spanStart)
679682
let (lower, r) = byteOffset.quotientAndRemainder(dividingBy: stride)
680683
guard r == 0 else { return nil }
681684
return Range(_uncheckedBounds: (lower, lower &+ span._count))

test/abi/macOS/arm64/stdlib.swift

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -776,24 +776,18 @@ Added: _$sSS5IndexVs28CustomDebugStringConvertiblesWP
776776
// SE-0447 Span and RawSpan
777777
Added: _$ss4SpanVMa
778778
Added: _$ss4SpanVMn
779-
Added: _$ss4SpanVsRi_zRi0_zrlE10_unchecked5countAByxGSVSg_SitcfC
780779
Added: _$ss4SpanVsRi_zRi0_zrlE6_countSivg
781780
Added: _$ss4SpanVsRi_zRi0_zrlE6_countSivpMV
782-
Added: _$ss4SpanVsRi_zRi0_zrlE6_startSVvg
783-
Added: _$ss4SpanVsRi_zRi0_zrlE6_startSVvpMV
784781
Added: _$ss4SpanVsRi_zRi0_zrlE8_pointerSVSgvg
785782
Added: _$ss4SpanVsRi_zRi0_zrlE8_pointerSVSgvpMV
786783
Added: _$ss4SpanVsRi_zrlE5countSivpMV
787784
Added: _$ss4SpanVsRi_zrlE7indicesSnySiGvpMV
788785
Added: _$ss4SpanVsRi_zrlE7isEmptySbvpMV
789786
Added: _$ss4SpanVss15BitwiseCopyableRzlE9uncheckedxSi_tcipMV
790787
Added: _$ss4SpanVss15BitwiseCopyableRzlEyxSicipMV
791-
Added: _$ss7RawSpanV10_unchecked9byteCountABSVSg_SitcfC
792788
Added: _$ss7RawSpanV11byteOffsetsSnySiGvpMV
793789
Added: _$ss7RawSpanV6_countSivg
794790
Added: _$ss7RawSpanV6_countSivpMV
795-
Added: _$ss7RawSpanV6_startSVvg
796-
Added: _$ss7RawSpanV6_startSVvpMV
797791
Added: _$ss7RawSpanV7isEmptySbvpMV
798792
Added: _$ss7RawSpanV8_pointerSVSgvg
799793
Added: _$ss7RawSpanV8_pointerSVSgvpMV

test/abi/macOS/x86_64/stdlib.swift

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -777,24 +777,18 @@ Added: _$sSS5IndexVs28CustomDebugStringConvertiblesWP
777777
// SE-0447 Span and RawSpan
778778
Added: _$ss4SpanVMa
779779
Added: _$ss4SpanVMn
780-
Added: _$ss4SpanVsRi_zRi0_zrlE10_unchecked5countAByxGSVSg_SitcfC
781780
Added: _$ss4SpanVsRi_zRi0_zrlE6_countSivg
782781
Added: _$ss4SpanVsRi_zRi0_zrlE6_countSivpMV
783-
Added: _$ss4SpanVsRi_zRi0_zrlE6_startSVvg
784-
Added: _$ss4SpanVsRi_zRi0_zrlE6_startSVvpMV
785782
Added: _$ss4SpanVsRi_zRi0_zrlE8_pointerSVSgvg
786783
Added: _$ss4SpanVsRi_zRi0_zrlE8_pointerSVSgvpMV
787784
Added: _$ss4SpanVsRi_zrlE5countSivpMV
788785
Added: _$ss4SpanVsRi_zrlE7indicesSnySiGvpMV
789786
Added: _$ss4SpanVsRi_zrlE7isEmptySbvpMV
790787
Added: _$ss4SpanVss15BitwiseCopyableRzlE9uncheckedxSi_tcipMV
791788
Added: _$ss4SpanVss15BitwiseCopyableRzlEyxSicipMV
792-
Added: _$ss7RawSpanV10_unchecked9byteCountABSVSg_SitcfC
793789
Added: _$ss7RawSpanV11byteOffsetsSnySiGvpMV
794790
Added: _$ss7RawSpanV6_countSivg
795791
Added: _$ss7RawSpanV6_countSivpMV
796-
Added: _$ss7RawSpanV6_startSVvg
797-
Added: _$ss7RawSpanV6_startSVvpMV
798792
Added: _$ss7RawSpanV7isEmptySbvpMV
799793
Added: _$ss7RawSpanV8_pointerSVSgvg
800794
Added: _$ss7RawSpanV8_pointerSVSgvpMV

0 commit comments

Comments
 (0)