@@ -63,6 +63,15 @@ protocol _CVarArgAligned: CVarArg {
63
63
var _cVarArgAlignment : Int { get }
64
64
}
65
65
66
+ /// Some pointers require an alternate object to be retained. The object
67
+ /// that is returned will be used with _cVarArgEncoding and held until
68
+ /// the closure is complete. This is required since autoreleased storage
69
+ /// is available on all platforms.
70
+ public protocol _CVarArgObject : CVarArg {
71
+ /// Returns the alternate object that should be encoded.
72
+ var _cVarArgObject : CVarArg { get }
73
+ }
74
+
66
75
#if arch(x86_64)
67
76
@usableFromInline
68
77
internal let _countGPRegisters = 6
@@ -462,6 +471,9 @@ final internal class __VaListBuilder {
462
471
@usableFromInline // c-abi
463
472
internal var storage : ContiguousArray < Int >
464
473
474
+ @usableFromInline // c-abi
475
+ internal var retainer = [ CVarArg] ( )
476
+
465
477
@inlinable // c-abi
466
478
internal init ( ) {
467
479
// prepare the register save area
@@ -473,6 +485,14 @@ final internal class __VaListBuilder {
473
485
474
486
@inlinable // c-abi
475
487
internal func append( _ arg: CVarArg ) {
488
+ var arg = arg
489
+
490
+ // We may need to retain an object that provides a pointer value.
491
+ if let obj = arg as? _CVarArgObject {
492
+ arg = obj. _cVarArgObject
493
+ retainer. append ( arg)
494
+ }
495
+
476
496
var encoded = arg. _cVarArgEncoding
477
497
478
498
#if arch(x86_64) || arch(arm64)
@@ -560,6 +580,14 @@ final internal class __VaListBuilder {
560
580
561
581
@inlinable // c-abi
562
582
internal func append( _ arg: CVarArg ) {
583
+ var arg = arg
584
+
585
+ // We may need to retain an object that provides a pointer value.
586
+ if let obj = arg as? _CVarArgObject {
587
+ arg = obj. _cVarArgObject
588
+ retainer. append ( arg)
589
+ }
590
+
563
591
// Write alignment padding if necessary.
564
592
// This is needed on architectures where the ABI alignment of some
565
593
// supported vararg type is greater than the alignment of Int, such
@@ -665,6 +693,9 @@ final internal class __VaListBuilder {
665
693
@usableFromInline // c-abi
666
694
internal var storage : UnsafeMutablePointer < Int > ?
667
695
696
+ @usableFromInline // c-abi
697
+ internal var retainer = [ CVarArg] ( )
698
+
668
699
internal static var alignedStorageForEmptyVaLists : Double = 0
669
700
}
670
701
0 commit comments