@@ -263,7 +263,7 @@ public func swift_allocEmptyBox() -> Builtin.RawPointer {
263263
264264
265265@_silgen_name ( " swift_allocBox " )
266- public func swift_allocBox( metadata: Builtin . RawPointer ) -> ( Builtin . RawPointer , Builtin . RawPointer ) {
266+ public func swift_allocBox( _ metadata: Builtin . RawPointer ) -> ( Builtin . RawPointer , Builtin . RawPointer ) {
267267 let alignMask = Int( unsafe _swift_embedded_metadata_get_align_mask( UnsafeMutableRawPointer ( metadata) ) )
268268 let size = Int( unsafe _swift_embedded_metadata_get_size( UnsafeMutableRawPointer ( metadata) ) )
269269 let headerSize = unsafe MemoryLayout< Int > . size + MemoryLayout < UnsafeRawPointer > . size
@@ -283,12 +283,29 @@ public func swift_allocBox(metadata: Builtin.RawPointer) -> (Builtin.RawPointer,
283283 return ( object. _rawValue, boxedValueAddr. _rawValue)
284284}
285285
286- @_cdecl ( " swift_deallocBox " )
287- public func swift_deallocBox( object: Builtin . RawPointer ) {
286+ @c
287+ public func swift_deallocBox( _ object: Builtin . RawPointer ) {
288288 unsafe free( UnsafeMutableRawPointer ( object) )
289289}
290290
291-
291+ @_silgen_name ( " swift_makeBoxUnique " )
292+ public func swifft_makeBoxUnique( buffer: Builtin . RawPointer , metadata: Builtin . RawPointer , alignMask: Int ) -> ( Builtin . RawPointer , Builtin . RawPointer ) {
293+ let addrOfHeapObjectPtr = unsafe UnsafeMutablePointer< Builtin . RawPointer > ( buffer)
294+ let box = unsafe addrOfHeapObjectPtr. pointee
295+ let headerSize = unsafe MemoryLayout< Int > . size + MemoryLayout < UnsafeRawPointer > . size
296+ let startOfBoxedValue = ( ( headerSize + alignMask) & ~ alignMask)
297+ let oldObjectAddr = unsafe UnsafeMutableRawPointer( box) + startOfBoxedValue
298+
299+ if !swift_isUniquelyReferenced_native( object: box) {
300+ let refAndObjectAddr = swift_allocBox ( metadata)
301+ unsafe _swift_embedded_initialize_box ( UnsafeMutableRawPointer ( metadata) , UnsafeMutableRawPointer ( refAndObjectAddr. 1 ) , oldObjectAddr)
302+ swift_releaseBox ( box)
303+ unsafe addrOfHeapObjectPtr. pointee = refAndObjectAddr. 0
304+ return refAndObjectAddr
305+ } else {
306+ return ( box, oldObjectAddr. _rawValue)
307+ }
308+ }
292309
293310/// Refcounting
294311
@@ -416,7 +433,7 @@ public func swift_release_n(object: Builtin.RawPointer, n: UInt32) {
416433 unsafe swift_release_n_( object: o, n: n)
417434}
418435
419- func swift_release_n_( object: UnsafeMutablePointer < HeapObject > ? , n: UInt32 ) {
436+ func swift_release_n_( object: UnsafeMutablePointer < HeapObject > ? , n: UInt32 , isBoxRelease : Bool = false ) {
420437 guard let object = unsafe object else {
421438 return
422439 }
@@ -441,12 +458,25 @@ func swift_release_n_(object: UnsafeMutablePointer<HeapObject>?, n: UInt32) {
441458 let doNotFree = unsafe ( loadedRefcount & HeapObject . doNotFreeBit) != 0
442459 unsafe storeRelaxed( refcount, newValue: HeapObject . immortalRefCount | ( doNotFree ? HeapObject . doNotFreeBit : 0 ) )
443460
444- unsafe _swift_embedded_invoke_heap_object_destroy( object)
461+ if isBoxRelease {
462+ unsafe _swift_embedded_invoke_box_destroy( object)
463+ } else {
464+ unsafe _swift_embedded_invoke_heap_object_destroy( object)
465+ }
445466 } else if resultingRefcount < 0 {
446467 fatalError ( " negative refcount " )
447468 }
448469}
449470
471+ @c
472+ public func swift_releaseBox( _ object: Builtin . RawPointer ) {
473+ if !isValidPointerForNativeRetain( object: object) {
474+ fatalError ( " not a valid pointer for releaseBox " )
475+ }
476+ let o = unsafe UnsafeMutablePointer< HeapObject > ( object)
477+ unsafe swift_release_n_( object: o, n: 1 , isBoxRelease: true )
478+ }
479+
450480@c
451481public func swift_bridgeObjectRelease( object: Builtin . RawPointer ) {
452482 swift_bridgeObjectRelease_n ( object: object, n: 1 )
0 commit comments