//===----------------------------------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See http://swift.org/LICENSE.txt for license information // See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// import ObjectiveC import Foundation internal var _temporaryLocaleCurrentLocale: NSLocale? = nil extension NSLocale { @objc public class func _swiftUnittest_currentLocale() -> NSLocale { return _temporaryLocaleCurrentLocale! } } public func withOverriddenLocaleCurrentLocale( _ temporaryLocale: NSLocale, _ body: @noescape () -> Result ) -> Result { let oldMethod = class_getClassMethod( NSLocale.self, #selector(getter: NSLocale.current)) precondition(oldMethod != nil, "could not find +[Locale currentLocale]") let newMethod = class_getClassMethod( NSLocale.self, #selector(NSLocale._swiftUnittest_currentLocale)) precondition(newMethod != nil, "could not find +[Locale _swiftUnittest_currentLocale]") precondition(_temporaryLocaleCurrentLocale == nil, "nested calls to withOverriddenLocaleCurrentLocale are not supported") _temporaryLocaleCurrentLocale = temporaryLocale method_exchangeImplementations(oldMethod, newMethod) let result = body() method_exchangeImplementations(newMethod, oldMethod) _temporaryLocaleCurrentLocale = nil return result } public func withOverriddenLocaleCurrentLocale( _ temporaryLocaleIdentifier: String, _ body: @noescape () -> Result ) -> Result { precondition( NSLocale.availableLocaleIdentifiers.contains(temporaryLocaleIdentifier), "requested locale \(temporaryLocaleIdentifier) is not available") return withOverriddenLocaleCurrentLocale( NSLocale(localeIdentifier: temporaryLocaleIdentifier), body) } /// Executes the `body` in an autorelease pool if the platform does not /// implement the return-autoreleased optimization. /// /// (Currently, only the i386 iOS and watchOS simulators don't implement the /// return-autoreleased optimization.) @inline(never) public func autoreleasepoolIfUnoptimizedReturnAutoreleased( invoking body: @noescape () -> Void ) { #if arch(i386) && (os(iOS) || os(watchOS)) autoreleasepool(invoking: body) #else body() #endif } @_silgen_name("swift_stdlib_NSArray_getObjects") internal func _stdlib_NSArray_getObjects( nsArray: AnyObject, objects: AutoreleasingUnsafeMutablePointer?, rangeLocation: Int, rangeLength: Int) extension NSArray { public func available_getObjects( _ objects: AutoreleasingUnsafeMutablePointer?, range: NSRange ) { return _stdlib_NSArray_getObjects( nsArray: self, objects: objects, rangeLocation: range.location, rangeLength: range.length) } } @_silgen_name("swift_stdlib_NSDictionary_getObjects") func _stdlib_NSDictionary_getObjects( nsDictionary: NSDictionary, objects: AutoreleasingUnsafeMutablePointer?, andKeys keys: AutoreleasingUnsafeMutablePointer? ) extension NSDictionary { public func available_getObjects( _ objects: AutoreleasingUnsafeMutablePointer?, andKeys keys: AutoreleasingUnsafeMutablePointer? ) { return _stdlib_NSDictionary_getObjects( nsDictionary: self, objects: objects, andKeys: keys) } }