@@ -204,6 +204,10 @@ void swift_slowDealloc(void *ptr, size_t bytes, size_t alignMask)
204
204
// /
205
205
// / \param object - may be null, in which case this is a no-op
206
206
// /
207
+ // / \return object - we return the object because this enables tail call
208
+ // / optimization and the argument register to be live through the call on
209
+ // / architectures whose argument and return register is the same register.
210
+ // /
207
211
// / POSSIBILITIES: We may end up wanting a bunch of different variants:
208
212
// / - the general version which correctly handles null values, swift
209
213
// / objects, and ObjC objects
@@ -213,34 +217,35 @@ void swift_slowDealloc(void *ptr, size_t bytes, size_t alignMask)
213
217
// / It may also prove worthwhile to have this use a custom CC
214
218
// / which preserves a larger set of registers.
215
219
SWIFT_RT_ENTRY_VISIBILITY
216
- void swift_retain (HeapObject *object)
220
+ HeapObject * swift_retain (HeapObject *object)
217
221
SWIFT_CC(RegisterPreservingCC);
218
222
219
223
SWIFT_RUNTIME_EXPORT
220
- void (*SWIFT_CC (RegisterPreservingCC) _swift_retain)(HeapObject *object);
224
+ HeapObject * (*SWIFT_CC (RegisterPreservingCC) _swift_retain)(HeapObject *object);
221
225
222
226
SWIFT_RT_ENTRY_VISIBILITY
223
- void swift_retain_n (HeapObject *object, uint32_t n)
227
+ HeapObject * swift_retain_n (HeapObject *object, uint32_t n)
224
228
SWIFT_CC(RegisterPreservingCC);
225
229
226
230
SWIFT_RUNTIME_EXPORT
227
- void (*SWIFT_CC (RegisterPreservingCC) _swift_retain_n)(HeapObject *object,
228
- uint32_t n);
231
+ HeapObject * (*SWIFT_CC (RegisterPreservingCC)
232
+ _swift_retain_n)(HeapObject *object, uint32_t n);
229
233
230
234
SWIFT_RT_ENTRY_VISIBILITY
231
- void swift_nonatomic_retain (HeapObject *object)
235
+ HeapObject * swift_nonatomic_retain (HeapObject *object)
232
236
SWIFT_CC(RegisterPreservingCC);
233
237
234
238
SWIFT_RUNTIME_EXPORT
235
- void (*SWIFT_CC (RegisterPreservingCC) _swift_nonatomic_retain)(HeapObject *object);
239
+ HeapObject *(*SWIFT_CC (RegisterPreservingCC)
240
+ _swift_nonatomic_retain)(HeapObject *object);
236
241
237
242
SWIFT_RT_ENTRY_VISIBILITY
238
- void swift_nonatomic_retain_n (HeapObject *object, uint32_t n)
243
+ HeapObject* swift_nonatomic_retain_n (HeapObject *object, uint32_t n)
239
244
SWIFT_CC(RegisterPreservingCC);
240
245
241
246
SWIFT_RUNTIME_EXPORT
242
- void (*SWIFT_CC (RegisterPreservingCC) _swift_nonatomic_retain_n)(HeapObject *object,
243
- uint32_t n);
247
+ HeapObject * (*SWIFT_CC (RegisterPreservingCC)
248
+ _swift_nonatomic_retain_n)(HeapObject *object, uint32_t n);
244
249
245
250
// / Atomically increments the reference count of an object, unless it has
246
251
// / already been destroyed. Returns nil if the object is dead.
@@ -525,7 +530,7 @@ struct UnownedReference {
525
530
526
531
// / Increment the unowned retain count.
527
532
SWIFT_RT_ENTRY_VISIBILITY
528
- void swift_unownedRetain (HeapObject *value)
533
+ HeapObject * swift_unownedRetain (HeapObject *value)
529
534
SWIFT_CC(RegisterPreservingCC);
530
535
531
536
// / Decrement the unowned retain count.
@@ -535,7 +540,7 @@ void swift_unownedRelease(HeapObject *value)
535
540
536
541
// / Increment the unowned retain count.
537
542
SWIFT_RT_ENTRY_VISIBILITY
538
- void swift_nonatomic_unownedRetain (HeapObject *value)
543
+ void * swift_nonatomic_unownedRetain (HeapObject *value)
539
544
SWIFT_CC(RegisterPreservingCC);
540
545
541
546
// / Decrement the unowned retain count.
@@ -545,7 +550,7 @@ void swift_nonatomic_unownedRelease(HeapObject *value)
545
550
546
551
// / Increment the unowned retain count by n.
547
552
SWIFT_RT_ENTRY_VISIBILITY
548
- void swift_unownedRetain_n (HeapObject *value, int n)
553
+ HeapObject * swift_unownedRetain_n (HeapObject *value, int n)
549
554
SWIFT_CC(RegisterPreservingCC);
550
555
551
556
// / Decrement the unowned retain count by n.
@@ -555,7 +560,7 @@ void swift_unownedRelease_n(HeapObject *value, int n)
555
560
556
561
// / Increment the unowned retain count by n.
557
562
SWIFT_RT_ENTRY_VISIBILITY
558
- void swift_nonatomic_unownedRetain_n (HeapObject *value, int n)
563
+ HeapObject * swift_nonatomic_unownedRetain_n (HeapObject *value, int n)
559
564
SWIFT_CC(RegisterPreservingCC);
560
565
561
566
// / Decrement the unowned retain count by n.
@@ -566,13 +571,13 @@ void swift_nonatomic_unownedRelease_n(HeapObject *value, int n)
566
571
// / Increment the strong retain count of an object, aborting if it has
567
572
// / been deallocated.
568
573
SWIFT_RT_ENTRY_VISIBILITY
569
- void swift_unownedRetainStrong (HeapObject *value)
574
+ HeapObject * swift_unownedRetainStrong (HeapObject *value)
570
575
SWIFT_CC(RegisterPreservingCC);
571
576
572
577
// / Increment the strong retain count of an object, aborting if it has
573
578
// / been deallocated.
574
579
SWIFT_RT_ENTRY_VISIBILITY
575
- void swift_nonatomic_unownedRetainStrong (HeapObject *value)
580
+ HeapObject * swift_nonatomic_unownedRetainStrong (HeapObject *value)
576
581
SWIFT_CC(RegisterPreservingCC);
577
582
578
583
// / Increment the strong retain count of an object which may have been
@@ -770,46 +775,46 @@ void *swift_nonatomic_bridgeObjectRetain_n(void *value, int n)
770
775
// / Increment the strong retain count of an object which might not be a native
771
776
// / Swift object.
772
777
SWIFT_RUNTIME_EXPORT
773
- void swift_unknownRetain (void *value)
778
+ void * swift_unknownRetain (void *value)
774
779
SWIFT_CC(DefaultCC);
775
780
// / Increment the strong retain count of an object which might not be a native
776
781
// / Swift object by n.
777
782
SWIFT_RUNTIME_EXPORT
778
- void swift_unknownRetain_n (void *value, int n)
783
+ void * swift_unknownRetain_n (void *value, int n)
779
784
SWIFT_CC(DefaultCC);
780
785
781
786
// / Increment the strong retain count of an object which might not be a native
782
787
// / Swift object.
783
788
SWIFT_RUNTIME_EXPORT
784
- void swift_nonatomic_unknownRetain (void *value)
789
+ void * swift_nonatomic_unknownRetain (void *value)
785
790
SWIFT_CC(DefaultCC);
786
791
// / Increment the strong retain count of an object which might not be a native
787
792
// / Swift object by n.
788
793
SWIFT_RUNTIME_EXPORT
789
- void swift_nonatomic_unknownRetain_n (void *value, int n)
794
+ void * swift_nonatomic_unknownRetain_n (void *value, int n)
790
795
SWIFT_CC(DefaultCC);
791
796
792
797
793
798
#else
794
799
795
- static inline void swift_unknownRetain (void *value)
800
+ static inline void * swift_unknownRetain (void *value)
796
801
SWIFT_CC(DefaultCC) {
797
- swift_retain (static_cast <HeapObject *>(value));
802
+ return swift_retain (static_cast <HeapObject *>(value));
798
803
}
799
804
800
- static inline void swift_unknownRetain_n (void *value, int n)
805
+ static inline void * swift_unknownRetain_n (void *value, int n)
801
806
SWIFT_CC(DefaultCC) {
802
- swift_retain_n (static_cast <HeapObject *>(value), n);
807
+ return swift_retain_n (static_cast <HeapObject *>(value), n);
803
808
}
804
809
805
- static inline void swift_nonatomic_unknownRetain (void *value)
810
+ static inline void * swift_nonatomic_unknownRetain (void *value)
806
811
SWIFT_CC(DefaultCC) {
807
- swift_nonatomic_retain (static_cast <HeapObject *>(value));
812
+ return swift_nonatomic_retain (static_cast <HeapObject *>(value));
808
813
}
809
814
810
- static inline void swift_nonatomic_unknownRetain_n (void *value, int n)
815
+ static inline void * swift_nonatomic_unknownRetain_n (void *value, int n)
811
816
SWIFT_CC(DefaultCC) {
812
- swift_nonatomic_retain_n (static_cast <HeapObject *>(value), n);
817
+ return swift_nonatomic_retain_n (static_cast <HeapObject *>(value), n);
813
818
}
814
819
815
820
0 commit comments