Skip to content

Commit 37c084b

Browse files
committed
Use UnsafeMutableRawPointer in HashedCollection _UnmanagedAnyObjectArray.
In order to conform to the memory model.
1 parent 37b7890 commit 37c084b

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

stdlib/public/core/HashedCollections.swift.gyb

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -265,11 +265,11 @@ internal func _stdlib_NSObject_isEqual(_ lhs: AnyObject, _ rhs: AnyObject) -> Bo
265265
/// Like `UnsafeMutablePointer<Unmanaged<AnyObject>>`, or `id
266266
/// __unsafe_unretained *` in Objective-C ARC.
267267
internal struct _UnmanagedAnyObjectArray {
268-
/// Underlying pointer, Unmanaged to escape reference counting.
269-
internal var value: UnsafeMutablePointer<Unmanaged<AnyObject>>
268+
/// Underlying pointer.
269+
internal var value: UnsafeMutableRawPointer
270270

271271
internal init(_ up: UnsafeMutablePointer<AnyObject>) {
272-
self.value = UnsafeMutablePointer(up)
272+
self.value = UnsafeMutableRawPointer(up)
273273
}
274274

275275
internal init?(_ up: UnsafeMutablePointer<AnyObject>?) {
@@ -279,10 +279,16 @@ internal struct _UnmanagedAnyObjectArray {
279279

280280
internal subscript(i: Int) -> AnyObject {
281281
get {
282-
return value[i].takeUnretainedValue()
282+
let unmanaged = value.load(
283+
fromByteOffset: i * strideof(AnyObject.self),
284+
as: Unmanaged<AnyObject>.self)
285+
return unmanaged.takeUnretainedValue()
283286
}
284287
nonmutating set(newValue) {
285-
value[i] = Unmanaged.passUnretained(newValue)
288+
let unmanaged = Unmanaged.passUnretained(newValue)
289+
value.storeBytes(of: unmanaged,
290+
toByteOffset: i * strideof(AnyObject.self),
291+
as: Unmanaged<AnyObject>.self)
286292
}
287293
}
288294
}

0 commit comments

Comments
 (0)