Skip to content

Commit c36b537

Browse files
authored
Merge pull request #7234 from apple/revert-7227-revert-7116-unsafeBitCast-Runtime.swift.gyb
2 parents 649037a + 22f1664 commit c36b537

File tree

1 file changed

+25
-33
lines changed

1 file changed

+25
-33
lines changed

stdlib/public/core/Runtime.swift.gyb

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,11 @@ import SwiftShims
2020
// Atomics
2121
//===----------------------------------------------------------------------===//
2222

23-
public typealias _PointerToPointer = UnsafeMutablePointer<UnsafeRawPointer?>
24-
2523
@_transparent
2624
public // @testable
2725
func _stdlib_atomicCompareExchangeStrongPtr(
28-
object target: _PointerToPointer,
29-
expected: _PointerToPointer,
26+
object target: UnsafeMutablePointer<UnsafeRawPointer?>,
27+
expected: UnsafeMutablePointer<UnsafeRawPointer?>,
3028
desired: UnsafeRawPointer?) -> Bool {
3129

3230
// We use Builtin.Word here because Builtin.RawPointer can't be nil.
@@ -71,11 +69,16 @@ public // @testable
7169
func _stdlib_atomicCompareExchangeStrongPtr<T>(
7270
object target: UnsafeMutablePointer<UnsafeMutablePointer<T>${optional}>,
7371
expected: UnsafeMutablePointer<UnsafeMutablePointer<T>${optional}>,
74-
desired: UnsafeMutablePointer<T>${optional}) -> Bool {
72+
desired: UnsafeMutablePointer<T>${optional}
73+
) -> Bool {
74+
let rawTarget = UnsafeMutableRawPointer(target).assumingMemoryBound(
75+
to: Optional<UnsafeRawPointer>.self)
76+
let rawExpected = UnsafeMutableRawPointer(expected).assumingMemoryBound(
77+
to: Optional<UnsafeRawPointer>.self)
7578
return _stdlib_atomicCompareExchangeStrongPtr(
76-
object: unsafeBitCast(target, to: _PointerToPointer.self),
77-
expected: unsafeBitCast(expected, to: _PointerToPointer.self),
78-
desired: unsafeBitCast(desired, to: Optional<UnsafeRawPointer>.self))
79+
object: rawTarget,
80+
expected: rawExpected,
81+
desired: UnsafeRawPointer(desired))
7982
}
8083
% end # optional
8184

@@ -87,10 +90,10 @@ func _stdlib_atomicInitializeARCRef(
8790
desired: AnyObject) -> Bool {
8891
var expected: UnsafeRawPointer?
8992
let desiredPtr = Unmanaged.passRetained(desired).toOpaque()
93+
let rawTarget = UnsafeMutableRawPointer(target).assumingMemoryBound(
94+
to: Optional<UnsafeRawPointer>.self)
9095
let wonRace = _stdlib_atomicCompareExchangeStrongPtr(
91-
object: unsafeBitCast(target, to: _PointerToPointer.self),
92-
expected: &expected,
93-
desired: desiredPtr)
96+
object: rawTarget, expected: &expected, desired: desiredPtr)
9497
if !wonRace {
9598
// Some other thread initialized the value. Balance the retain that we
9699
// performed on 'desired'.
@@ -223,25 +226,14 @@ public func _swift_stdlib_atomicLoadInt(
223226
#endif
224227
}
225228

226-
@_transparent
227-
public // @testable
228-
func _swift_stdlib_atomicLoadPtrImpl(
229-
object target: UnsafeMutablePointer<OpaquePointer>
230-
) -> OpaquePointer? {
231-
let value = Builtin.atomicload_seqcst_Word(target._rawValue)
232-
return OpaquePointer(bitPattern: Int(value))
233-
}
234-
235229
@_transparent
236230
public // @testable
237231
func _stdlib_atomicLoadARCRef(
238232
object target: UnsafeMutablePointer<AnyObject?>
239233
) -> AnyObject? {
240-
let result = _swift_stdlib_atomicLoadPtrImpl(
241-
object: unsafeBitCast(target, to: UnsafeMutablePointer<OpaquePointer>.self))
242-
if let unwrapped = result {
243-
return Unmanaged<AnyObject>.fromOpaque(
244-
UnsafePointer(unwrapped)).takeUnretainedValue()
234+
let value = Builtin.atomicload_seqcst_Word(target._rawValue)
235+
if let unwrapped = UnsafeRawPointer(bitPattern: Int(value)) {
236+
return Unmanaged<AnyObject>.fromOpaque(unwrapped).takeUnretainedValue()
245237
}
246238
return nil
247239
}
@@ -251,17 +243,17 @@ func _stdlib_atomicLoadARCRef(
251243
public func _swift_stdlib_atomicFetch${operation}Int(
252244
object target: UnsafeMutablePointer<Int>,
253245
operand: Int) -> Int {
246+
let rawTarget = UnsafeMutableRawPointer(target)
254247
#if arch(i386) || arch(arm)
255-
return Int(Int32(bitPattern:
256-
_swift_stdlib_atomicFetch${operation}UInt32(
257-
object: unsafeBitCast(target, to: UnsafeMutablePointer<UInt32>.self),
258-
operand: UInt32(bitPattern: Int32(operand)))))
248+
let value = _swift_stdlib_atomicFetch${operation}Int32(
249+
object: rawTarget.assumingMemoryBound(to: Int32.self),
250+
operand: Int32(operand))
259251
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
260-
return Int(Int64(bitPattern:
261-
_swift_stdlib_atomicFetch${operation}UInt64(
262-
object: unsafeBitCast(target, to: UnsafeMutablePointer<UInt64>.self),
263-
operand: UInt64(bitPattern: Int64(operand)))))
252+
let value = _swift_stdlib_atomicFetch${operation}Int64(
253+
object: rawTarget.assumingMemoryBound(to: Int64.self),
254+
operand: Int64(operand))
264255
#endif
256+
return Int(value)
265257
}
266258
% end
267259

0 commit comments

Comments
 (0)