@@ -72,6 +72,19 @@ static inline bool isValidPointerForNativeRetain(const void *p) {
72
72
#endif
73
73
}
74
74
75
+ // Call the appropriate implementation of the `name` function, passing `args`
76
+ // to the call. This checks for an override in the function pointer. If an
77
+ // override is present, it calls that override. Otherwise it directly calls
78
+ // the default implementation. This allows the compiler to inline the default
79
+ // implementation and avoid the performance penalty of indirecting through
80
+ // the function pointer in the common case.
81
+ #define CALL_IMPL (name, args ) do { \
82
+ if (SWIFT_UNLIKELY (_ ## name != _ ## name ## _)) \
83
+ return _ ## name args; \
84
+ return _ ## name ## _ args; \
85
+ } while (0 )
86
+
87
+
75
88
static HeapObject *_swift_allocObject_ (HeapMetadata const *metadata,
76
89
size_t requiredSize,
77
90
size_t requiredAlignmentMask) {
@@ -95,9 +108,7 @@ static HeapObject *_swift_allocObject_(HeapMetadata const *metadata,
95
108
HeapObject *swift::swift_allocObject (HeapMetadata const *metadata,
96
109
size_t requiredSize,
97
110
size_t requiredAlignmentMask) {
98
- if (SWIFT_UNLIKELY (_swift_allocObject != _swift_allocObject_))
99
- return _swift_allocObject (metadata, requiredSize, requiredAlignmentMask);
100
- return _swift_allocObject_ (metadata, requiredSize, requiredAlignmentMask);
111
+ CALL_IMPL (swift_allocObject, (metadata, requiredSize, requiredAlignmentMask));
101
112
}
102
113
103
114
HeapObject *(*swift::_swift_allocObject)(HeapMetadata const *metadata,
@@ -305,9 +316,7 @@ static HeapObject *_swift_retain_(HeapObject *object) {
305
316
}
306
317
307
318
HeapObject *swift::swift_retain (HeapObject *object) {
308
- if (SWIFT_UNLIKELY (_swift_retain != _swift_retain_))
309
- return _swift_retain (object);
310
- return _swift_retain_ (object);
319
+ CALL_IMPL (swift_retain, (object));
311
320
}
312
321
313
322
HeapObject *(*swift::_swift_retain)(HeapObject *object) = _swift_retain_;
@@ -327,9 +336,7 @@ static HeapObject *_swift_retain_n_(HeapObject *object, uint32_t n) {
327
336
}
328
337
329
338
HeapObject *swift::swift_retain_n (HeapObject *object, uint32_t n) {
330
- if (SWIFT_UNLIKELY (_swift_retain_n != _swift_retain_n_))
331
- return _swift_retain_n (object, n);
332
- return _swift_retain_n_ (object, n);
339
+ CALL_IMPL (swift_retain_n, (object, n));
333
340
}
334
341
335
342
HeapObject *(*swift::_swift_retain_n)(HeapObject *object, uint32_t n) =
@@ -349,9 +356,7 @@ static void _swift_release_(HeapObject *object) {
349
356
}
350
357
351
358
void swift::swift_release (HeapObject *object) {
352
- if (SWIFT_UNLIKELY (_swift_release != _swift_release_))
353
- _swift_release (object);
354
- _swift_release_ (object);
359
+ CALL_IMPL (swift_release, (object));
355
360
}
356
361
357
362
void (*swift::_swift_release)(HeapObject *object) = _swift_release_;
@@ -369,9 +374,7 @@ static void _swift_release_n_(HeapObject *object, uint32_t n) {
369
374
}
370
375
371
376
void swift::swift_release_n (HeapObject *object, uint32_t n) {
372
- if (SWIFT_UNLIKELY (_swift_release_n != _swift_release_n_))
373
- return _swift_release_n (object, n);
374
- return _swift_release_n_ (object, n);
377
+ CALL_IMPL (swift_release_n, (object, n));
375
378
}
376
379
377
380
void (*swift::_swift_release_n)(HeapObject *object, uint32_t n) =
@@ -509,9 +512,7 @@ static HeapObject *_swift_tryRetain_(HeapObject *object) {
509
512
}
510
513
511
514
HeapObject *swift::swift_tryRetain (HeapObject *object) {
512
- if (SWIFT_UNLIKELY (_swift_tryRetain != _swift_tryRetain_))
513
- return _swift_tryRetain (object);
514
- return _swift_tryRetain_ (object);
515
+ CALL_IMPL (swift_tryRetain, (object));
515
516
}
516
517
517
518
HeapObject *(*swift::_swift_tryRetain)(HeapObject *object) = _swift_tryRetain_;
0 commit comments