@@ -63,6 +63,17 @@ protocol _CVarArgAligned: CVarArg {
63
63
var _cVarArgAlignment : Int { get }
64
64
}
65
65
66
+ #if !_runtime(_ObjC)
67
+ /// Some pointers require an alternate object to be retained. The object
68
+ /// that is returned will be used with _cVarArgEncoding and held until
69
+ /// the closure is complete. This is required since autoreleased storage
70
+ /// is not available on all platforms.
71
+ public protocol _CVarArgObject : CVarArg {
72
+ /// Returns the alternate object that should be encoded.
73
+ var _cVarArgObject : CVarArg { get }
74
+ }
75
+ #endif
76
+
66
77
#if arch(x86_64)
67
78
@usableFromInline
68
79
internal let _countGPRegisters = 6
@@ -462,6 +473,11 @@ final internal class __VaListBuilder {
462
473
@usableFromInline // c-abi
463
474
internal var storage : ContiguousArray < Int >
464
475
476
+ #if !_runtime(_ObjC)
477
+ @usableFromInline // c-abi
478
+ internal var retainer = [ CVarArg] ( )
479
+ #endif
480
+
465
481
@inlinable // c-abi
466
482
internal init ( ) {
467
483
// prepare the register save area
@@ -473,6 +489,16 @@ final internal class __VaListBuilder {
473
489
474
490
@inlinable // c-abi
475
491
internal func append( _ arg: CVarArg ) {
492
+ #if !_runtime(_ObjC)
493
+ var arg = arg
494
+
495
+ // We may need to retain an object that provides a pointer value.
496
+ if let obj = arg as? _CVarArgObject {
497
+ arg = obj. _cVarArgObject
498
+ retainer. append ( arg)
499
+ }
500
+ #endif
501
+
476
502
var encoded = arg. _cVarArgEncoding
477
503
478
504
#if arch(x86_64) || arch(arm64)
@@ -560,6 +586,16 @@ final internal class __VaListBuilder {
560
586
561
587
@inlinable // c-abi
562
588
internal func append( _ arg: CVarArg ) {
589
+ #if !_runtime(_ObjC)
590
+ var arg = arg
591
+
592
+ // We may need to retain an object that provides a pointer value.
593
+ if let obj = arg as? _CVarArgObject {
594
+ arg = obj. _cVarArgObject
595
+ retainer. append ( arg)
596
+ }
597
+ #endif
598
+
563
599
// Write alignment padding if necessary.
564
600
// This is needed on architectures where the ABI alignment of some
565
601
// supported vararg type is greater than the alignment of Int, such
@@ -665,6 +701,11 @@ final internal class __VaListBuilder {
665
701
@usableFromInline // c-abi
666
702
internal var storage : UnsafeMutablePointer < Int > ?
667
703
704
+ #if !_runtime(_ObjC)
705
+ @usableFromInline // c-abi
706
+ internal var retainer = [ CVarArg] ( )
707
+ #endif
708
+
668
709
internal static var alignedStorageForEmptyVaLists : Double = 0
669
710
}
670
711
0 commit comments