@@ -107,6 +107,9 @@ static void _swift_release_n_(HeapObject *object, uint32_t n)
107
107
asm(" __swift_release_n_" );
108
108
static HeapObject *_swift_tryRetain_ (HeapObject *object)
109
109
asm(" __swift_tryRetain_" );
110
+
111
+ #ifdef SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE
112
+
110
113
#define CALL_IMPL (name, args ) do { \
111
114
void *fptr; \
112
115
memcpy (&fptr, (void *)&_ ## name, sizeof (fptr)); \
@@ -117,6 +120,14 @@ static HeapObject *_swift_tryRetain_(HeapObject *object)
117
120
return _ ## name ## _ args; \
118
121
} while (0 )
119
122
123
+ #else
124
+
125
+ // If retain/release etc. aren't overridable, just call the real implementation.
126
+ #define CALL_IMPL (name, args ) \
127
+ return _ ## name ## _ args;
128
+
129
+ #endif
130
+
120
131
#if SWIFT_STDLIB_HAS_MALLOC_TYPE
121
132
static malloc_type_summary_t
122
133
computeMallocTypeSummary (const HeapMetadata *heapMetadata) {
@@ -212,6 +223,35 @@ static malloc_type_id_t getMallocTypeId(const HeapMetadata *heapMetadata) {
212
223
}
213
224
#endif // SWIFT_STDLIB_HAS_MALLOC_TYPE
214
225
226
+ #ifdef SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE
227
+
228
+ SWIFT_RUNTIME_EXPORT
229
+ HeapObject *(*SWIFT_RT_DECLARE_ENTRY _swift_allocObject)(
230
+ HeapMetadata const *metadata, size_t requiredSize,
231
+ size_t requiredAlignmentMask) = _swift_allocObject_;
232
+
233
+ SWIFT_RUNTIME_EXPORT
234
+ HeapObject *(*SWIFT_RT_DECLARE_ENTRY _swift_retain)(HeapObject *object) =
235
+ _swift_retain_;
236
+
237
+ SWIFT_RUNTIME_EXPORT
238
+ HeapObject *(*SWIFT_RT_DECLARE_ENTRY _swift_retain_n)(
239
+ HeapObject *object, uint32_t n) = _swift_retain_n_;
240
+
241
+ SWIFT_RUNTIME_EXPORT
242
+ void (*SWIFT_RT_DECLARE_ENTRY _swift_release)(HeapObject *object) =
243
+ _swift_release_;
244
+
245
+ SWIFT_RUNTIME_EXPORT
246
+ void (*SWIFT_RT_DECLARE_ENTRY _swift_release_n)(HeapObject *object,
247
+ uint32_t n) = _swift_release_n_;
248
+
249
+ SWIFT_RUNTIME_EXPORT
250
+ HeapObject *(*SWIFT_RT_DECLARE_ENTRY _swift_tryRetain)(HeapObject *object) =
251
+ _swift_tryRetain_;
252
+
253
+ #endif // SWIFT_STDLIB_OVERRIDABLE_RETAIN_RELEASE
254
+
215
255
static HeapObject *_swift_allocObject_ (HeapMetadata const *metadata,
216
256
size_t requiredSize,
217
257
size_t requiredAlignmentMask) {
@@ -243,11 +283,6 @@ HeapObject *swift::swift_allocObject(HeapMetadata const *metadata,
243
283
CALL_IMPL (swift_allocObject, (metadata, requiredSize, requiredAlignmentMask));
244
284
}
245
285
246
- SWIFT_RUNTIME_EXPORT
247
- HeapObject *(*SWIFT_RT_DECLARE_ENTRY _swift_allocObject)(
248
- HeapMetadata const *metadata, size_t requiredSize,
249
- size_t requiredAlignmentMask) = _swift_allocObject_;
250
-
251
286
HeapObject *
252
287
swift::swift_initStackObject (HeapMetadata const *metadata,
253
288
HeapObject *object) {
@@ -465,10 +500,6 @@ HeapObject *swift::swift_retain(HeapObject *object) {
465
500
466
501
CUSTOM_RR_ENTRYPOINTS_DEFINE_ENTRYPOINTS (swift_retain)
467
502
468
- SWIFT_RUNTIME_EXPORT
469
- HeapObject *(*SWIFT_RT_DECLARE_ENTRY _swift_retain)(HeapObject *object) =
470
- _swift_retain_;
471
-
472
503
HeapObject *swift::swift_nonatomic_retain(HeapObject *object) {
473
504
SWIFT_RT_TRACK_INVOCATION (object, swift_nonatomic_retain);
474
505
if (isValidPointerForNativeRetain (object))
@@ -492,10 +523,6 @@ HeapObject *swift::swift_retain_n(HeapObject *object, uint32_t n) {
492
523
#endif
493
524
}
494
525
495
- SWIFT_RUNTIME_EXPORT
496
- HeapObject *(*SWIFT_RT_DECLARE_ENTRY _swift_retain_n)(
497
- HeapObject *object, uint32_t n) = _swift_retain_n_;
498
-
499
526
HeapObject *swift::swift_nonatomic_retain_n (HeapObject *object, uint32_t n) {
500
527
SWIFT_RT_TRACK_INVOCATION (object, swift_nonatomic_retain_n);
501
528
if (isValidPointerForNativeRetain (object))
@@ -520,10 +547,6 @@ void swift::swift_release(HeapObject *object) {
520
547
521
548
CUSTOM_RR_ENTRYPOINTS_DEFINE_ENTRYPOINTS (swift_release)
522
549
523
- SWIFT_RUNTIME_EXPORT
524
- void (*SWIFT_RT_DECLARE_ENTRY _swift_release)(HeapObject *object) =
525
- _swift_release_;
526
-
527
550
void swift::swift_nonatomic_release(HeapObject *object) {
528
551
SWIFT_RT_TRACK_INVOCATION (object, swift_nonatomic_release);
529
552
if (isValidPointerForNativeRetain (object))
@@ -545,10 +568,6 @@ void swift::swift_release_n(HeapObject *object, uint32_t n) {
545
568
#endif
546
569
}
547
570
548
- SWIFT_RUNTIME_EXPORT
549
- void (*SWIFT_RT_DECLARE_ENTRY _swift_release_n)(HeapObject *object,
550
- uint32_t n) = _swift_release_n_;
551
-
552
571
void swift::swift_nonatomic_release_n (HeapObject *object, uint32_t n) {
553
572
SWIFT_RT_TRACK_INVOCATION (object, swift_nonatomic_release_n);
554
573
if (isValidPointerForNativeRetain (object))
@@ -706,10 +725,6 @@ HeapObject *swift::swift_tryRetain(HeapObject *object) {
706
725
CALL_IMPL (swift_tryRetain, (object));
707
726
}
708
727
709
- SWIFT_RUNTIME_EXPORT
710
- HeapObject *(*SWIFT_RT_DECLARE_ENTRY _swift_tryRetain)(HeapObject *object) =
711
- _swift_tryRetain_;
712
-
713
728
bool swift::swift_isDeallocating (HeapObject *object) {
714
729
if (!isValidPointerForNativeRetain (object))
715
730
return false ;
0 commit comments