Merge pull request #12602 from phausler/swift-4.0-branch-NSData_isCompact_availability_guard
[Foundation] Guard Data access to NSData._isCompact under availability guards
diff --git a/stdlib/public/SDK/Foundation/Data.swift b/stdlib/public/SDK/Foundation/Data.swift
index acac34f..9e20435 100644
--- a/stdlib/public/SDK/Foundation/Data.swift
+++ b/stdlib/public/SDK/Foundation/Data.swift
@@ -38,6 +38,22 @@
import _SwiftFoundationOverlayShims
import _SwiftCoreFoundationOverlayShims
+internal func __NSDataIsCompact(_ data: NSData) -> Bool {
+ if #available(OSX 10.10, iOS 8.0, tvOS 9.0, watchOS 2.0, *) {
+ return data._isCompact()
+ } else {
+ var compact = true
+ let len = data.length
+ data.enumerateBytes { (_, byteRange, stop) in
+ if byteRange.length != len {
+ compact = false
+ }
+ stop.pointee = true
+ }
+ return compact
+ }
+}
+
@_silgen_name("__NSDataWriteToURL")
internal func __NSDataWriteToURL(_ data: NSData, _ url: NSURL, _ options: UInt, _ error: NSErrorPointer) -> Bool
@@ -130,7 +146,7 @@
case .mutable:
return try apply(UnsafeRawBufferPointer(start: _bytes?.advanced(by: range.lowerBound - _offset), count: Swift.min(range.count, _length)))
case .customReference(let d):
- if d._isCompact() {
+ if __NSDataIsCompact(d) {
let len = d.length
guard len > 0 else {
return try apply(UnsafeRawBufferPointer(start: nil, count: 0))
@@ -161,7 +177,7 @@
return try apply(UnsafeRawBufferPointer(buffer))
}
case .customMutableReference(let d):
- if d._isCompact() {
+ if __NSDataIsCompact(d) {
let len = d.length
guard len > 0 else {
return try apply(UnsafeRawBufferPointer(start: nil, count: 0))
@@ -505,7 +521,7 @@
case .mutable:
return _bytes!.advanced(by: index - _offset).assumingMemoryBound(to: UInt8.self).pointee
case .customReference(let d):
- if d._isCompact() {
+ if __NSDataIsCompact(d) {
return d.bytes.advanced(by: index - _offset).assumingMemoryBound(to: UInt8.self).pointee
} else {
var byte: UInt8 = 0
@@ -519,7 +535,7 @@
return byte
}
case .customMutableReference(let d):
- if d._isCompact() {
+ if __NSDataIsCompact(d) {
return d.bytes.advanced(by: index - _offset).assumingMemoryBound(to: UInt8.self).pointee
} else {
var byte: UInt8 = 0
diff --git a/stdlib/public/SwiftShims/NSDataShims.h b/stdlib/public/SwiftShims/NSDataShims.h
index a4baabd..20d8726 100644
--- a/stdlib/public/SwiftShims/NSDataShims.h
+++ b/stdlib/public/SwiftShims/NSDataShims.h
@@ -21,7 +21,7 @@
FOUNDATION_EXPORT const NSDataDeallocator NSDataDeallocatorNone;
@interface NSData (FoundationSPI)
-- (BOOL)_isCompact;
+- (BOOL)_isCompact API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));
@end
NS_END_DECLS