Skip to content

Commit ffd6e71

Browse files
authored
Merge pull request #563 from lhoward/SR-2384
2 parents bc8dec5 + fc1ad02 commit ffd6e71

File tree

2 files changed

+11
-57
lines changed

2 files changed

+11
-57
lines changed

Foundation/NSKeyedArchiver.swift

Lines changed: 8 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -34,44 +34,6 @@ internal let NSPropertyListClasses : [AnyClass] = [
3434
NSNumber.self
3535
]
3636

37-
// NSUniqueObject is a wrapper that allows both hashable and non-hashable objects
38-
// to be used as keys in a dictionary
39-
internal struct NSUniqueObject : Hashable {
40-
var _backing : Any
41-
var _hashValue : () -> Int
42-
var _equality : (Any) -> Bool
43-
44-
init<T: Hashable>(hashableObject: T) {
45-
self._backing = hashableObject
46-
self._hashValue = { hashableObject.hashValue }
47-
self._equality = {
48-
if let other = $0 as? T {
49-
return hashableObject == other
50-
}
51-
return false
52-
}
53-
}
54-
55-
init(_ object: Any) {
56-
// FIXME can't we check for Hashable directly?
57-
if let ns = object as? NSObject {
58-
self.init(hashableObject: ns)
59-
} else if let ah = object as? AnyHashable {
60-
self.init(hashableObject: ah)
61-
} else {
62-
fatalError("Non-object, non-hashable type used as key")
63-
}
64-
}
65-
66-
var hashValue: Int {
67-
return _hashValue()
68-
}
69-
}
70-
71-
internal func ==(x : NSUniqueObject, y : NSUniqueObject) -> Bool {
72-
return x._equality(y._backing)
73-
}
74-
7537
open class NSKeyedArchiver : NSCoder {
7638
struct ArchiverFlags : OptionSet {
7739
let rawValue : UInt
@@ -99,8 +61,8 @@ open class NSKeyedArchiver : NSCoder {
9961
private var _flags = ArchiverFlags(rawValue: 0)
10062
private var _containers : Array<EncodingContext> = [EncodingContext()]
10163
private var _objects : Array<Any> = [NSKeyedArchiveNullObjectReferenceName]
102-
private var _objRefMap : Dictionary<NSUniqueObject, UInt32> = [:]
103-
private var _replacementMap : Dictionary<NSUniqueObject, Any> = [:]
64+
private var _objRefMap : Dictionary<AnyHashable, UInt32> = [:]
65+
private var _replacementMap : Dictionary<AnyHashable, Any> = [:]
10466
private var _classNameMap : Dictionary<String, String> = [:]
10567
private var _classes : Dictionary<String, _NSKeyedArchiverUID> = [:]
10668
private var _cache : Array<_NSKeyedArchiverUID> = []
@@ -309,17 +271,15 @@ open class NSKeyedArchiver : NSCoder {
309271
return NSKeyedArchiveNullObjectReference
310272
}
311273

312-
let oid = NSUniqueObject(objv!)
313-
314-
uid = self._objRefMap[oid]
274+
uid = self._objRefMap[objv as! AnyHashable]
315275
if uid == nil {
316276
if conditional {
317277
return nil // object has not been unconditionally encoded
318278
}
319279

320280
uid = UInt32(self._objects.count)
321281

322-
self._objRefMap[oid] = uid
282+
self._objRefMap[objv as! AnyHashable] = uid
323283
self._objects.insert(NSKeyedArchiveNullObjectReferenceName, at: Int(uid!))
324284
}
325285

@@ -333,9 +293,7 @@ open class NSKeyedArchiver : NSCoder {
333293
if objv == nil {
334294
return true // always have a null reference
335295
} else {
336-
let oid = NSUniqueObject(objv!)
337-
338-
return self._objRefMap[oid] != nil
296+
return self._objRefMap[objv as! AnyHashable] != nil
339297
}
340298
}
341299

@@ -403,13 +361,11 @@ open class NSKeyedArchiver : NSCoder {
403361
Update replacement object mapping
404362
*/
405363
private func replaceObject(_ object: Any, withObject replacement: Any?) {
406-
let oid = NSUniqueObject(object)
407-
408364
if let unwrappedDelegate = self.delegate {
409-
unwrappedDelegate.archiver(self, willReplace: object, with: replacement)
365+
unwrappedDelegate.archiver(self, willReplace: object as! AnyHashable, with: replacement)
410366
}
411367

412-
self._replacementMap[oid] = replacement
368+
self._replacementMap[object as! AnyHashable] = replacement
413369
}
414370

415371
/**
@@ -514,7 +470,7 @@ open class NSKeyedArchiver : NSCoder {
514470
}
515471

516472
// check replacement cache
517-
objectToEncode = self._replacementMap[NSUniqueObject(object!)]
473+
objectToEncode = self._replacementMap[object as! AnyHashable]
518474
if objectToEncode != nil {
519475
return objectToEncode
520476
}

Foundation/NSKeyedUnarchiver.swift

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ open class NSKeyedUnarchiver : NSCoder {
4646
private var _containers : Array<DecodingContext>? = nil
4747
private var _objects : Array<Any> = []
4848
private var _objRefMap : Dictionary<UInt32, Any> = [:]
49-
private var _replacementMap : Dictionary<NSUniqueObject, Any> = [:]
49+
private var _replacementMap : Dictionary<AnyHashable, Any> = [:]
5050
private var _classNameMap : Dictionary<String, AnyClass> = [:]
5151
private var _classes : Dictionary<UInt32, AnyClass> = [:]
5252
private var _cache : Array<_NSKeyedArchiverUID> = []
@@ -371,13 +371,11 @@ open class NSKeyedUnarchiver : NSCoder {
371371
Replace object with another one
372372
*/
373373
private func replaceObject(_ object: Any, withObject replacement: Any) {
374-
let oid = NSUniqueObject(object)
375-
376374
if let unwrappedDelegate = self.delegate {
377375
unwrappedDelegate.unarchiver(self, willReplace: object, with: replacement)
378376
}
379377

380-
self._replacementMap[oid] = replacement
378+
self._replacementMap[object as! AnyHashable] = replacement
381379
}
382380

383381
private func _decodingError(_ code: NSCocoaError, withDescription description: String) -> NSError {
@@ -394,7 +392,7 @@ open class NSKeyedUnarchiver : NSCoder {
394392
}
395393

396394
// check replacement cache
397-
object = self._replacementMap[NSUniqueObject(decodedObject!)]
395+
object = self._replacementMap[decodedObject as! AnyHashable]
398396
if object != nil {
399397
return object
400398
}

0 commit comments

Comments
 (0)