Skip to content

Commit 1cb3d7c

Browse files
authored
Merge pull request #27542 from mikeash/retain-release-refactor
[Runtime] Refactor HeapObject override checks to use a macro.
2 parents efa3139 + 922b71f commit 1cb3d7c

File tree

1 file changed

+19
-18
lines changed

1 file changed

+19
-18
lines changed

stdlib/public/runtime/HeapObject.cpp

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,19 @@ static inline bool isValidPointerForNativeRetain(const void *p) {
7272
#endif
7373
}
7474

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+
7588
static HeapObject *_swift_allocObject_(HeapMetadata const *metadata,
7689
size_t requiredSize,
7790
size_t requiredAlignmentMask) {
@@ -95,9 +108,7 @@ static HeapObject *_swift_allocObject_(HeapMetadata const *metadata,
95108
HeapObject *swift::swift_allocObject(HeapMetadata const *metadata,
96109
size_t requiredSize,
97110
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));
101112
}
102113

103114
HeapObject *(*swift::_swift_allocObject)(HeapMetadata const *metadata,
@@ -305,9 +316,7 @@ static HeapObject *_swift_retain_(HeapObject *object) {
305316
}
306317

307318
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));
311320
}
312321

313322
HeapObject *(*swift::_swift_retain)(HeapObject *object) = _swift_retain_;
@@ -327,9 +336,7 @@ static HeapObject *_swift_retain_n_(HeapObject *object, uint32_t n) {
327336
}
328337

329338
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));
333340
}
334341

335342
HeapObject *(*swift::_swift_retain_n)(HeapObject *object, uint32_t n) =
@@ -349,9 +356,7 @@ static void _swift_release_(HeapObject *object) {
349356
}
350357

351358
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));
355360
}
356361

357362
void (*swift::_swift_release)(HeapObject *object) = _swift_release_;
@@ -369,9 +374,7 @@ static void _swift_release_n_(HeapObject *object, uint32_t n) {
369374
}
370375

371376
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));
375378
}
376379

377380
void (*swift::_swift_release_n)(HeapObject *object, uint32_t n) =
@@ -509,9 +512,7 @@ static HeapObject *_swift_tryRetain_(HeapObject *object) {
509512
}
510513

511514
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));
515516
}
516517

517518
HeapObject *(*swift::_swift_tryRetain)(HeapObject *object) = _swift_tryRetain_;

0 commit comments

Comments
 (0)