@@ -756,6 +756,31 @@ extension Substring.UTF8View {
756
756
public var span : Span < UTF8 . CodeUnit > {
757
757
@lifetime ( borrow self)
758
758
borrowing get {
759
+ #if _runtime(_ObjC)
760
+ // handle non-UTF8 Objective-C bridging cases here
761
+ if !_wholeGuts. isFastUTF8 && _wholeGuts. _object. hasObjCBridgeableObject {
762
+ let foreign = String ( _wholeGuts)
763
+ let dts = foreign. distance ( from: foreign. startIndex, to: startIndex)
764
+ let dte = foreign. distance ( from: startIndex, to: endIndex)
765
+
766
+ let storage : __StringStorage
767
+ if let associated = _wholeGuts. getAssociatedStorage ( ) {
768
+ storage = associated
769
+ }
770
+ else {
771
+ storage = _wholeGuts. getOrAllocateAssociatedStorage ( )
772
+ }
773
+ let native = storage. asString
774
+ let nativeStart = native. index ( native. startIndex, offsetBy: dts)
775
+ let startOffset = nativeStart. _encodedOffset
776
+ let endOffset = native. index ( nativeStart, offsetBy: dte) . _encodedOffset
777
+
778
+ let ( start, count) = unsafe ( storage. start, storage. count)
779
+ var span = unsafe Span( _unsafeStart: start, count: count)
780
+ span = unsafe span. _extracting ( unchecked: startOffset..< endOffset)
781
+ return unsafe _override Lifetime ( span, borrowing: self )
782
+ }
783
+ #endif
759
784
let start = _slice. _startIndex. _encodedOffset
760
785
let end = _slice. _endIndex. _encodedOffset
761
786
if _wholeGuts. isSmall {
@@ -765,15 +790,11 @@ extension Substring.UTF8View {
765
790
let span = unsafe Span( _unsafeStart: address, count: end &- start)
766
791
return unsafe _override Lifetime ( span, borrowing: self )
767
792
}
768
- else if _wholeGuts. isFastUTF8 {
769
- let buffer = unsafe _wholeGuts . _object . fastUTF8 . extracting( start..< end)
770
- let count = end &- start
771
- _internalInvariant ( count == buffer. count)
772
- let span = unsafe Span( _unsafeElements: buffer)
773
- return unsafe _override Lifetime ( span, borrowing: self )
774
- }
775
- // handle other Objective-C bridging cases here
776
- fatalError ( " Some bridged Strings are not supported at this time " )
793
+ _precondition ( _wholeGuts. isFastUTF8)
794
+ let buffer = unsafe _wholeGuts . _object . fastUTF8 . extracting( start..< end)
795
+ _internalInvariant ( ( end &- start) == buffer. count)
796
+ let span = unsafe Span( _unsafeElements: buffer)
797
+ return unsafe _override Lifetime ( span, borrowing: self )
777
798
}
778
799
}
779
800
}
0 commit comments