Skip to content

Commit 94db778

Browse files
committed
[Runtime] Remove a few uses of operator new/delete.
Replace them with swift_cxx_newObject/swift_cxx_deleteObject to avoid calling overridden global operators. Overridden global operators can sometimes fail when called from places the authors didn't expect. The particular uses being changed here are: 1. Creation of new SingletonMetadataCacheEntry objects. 2. Allocation of the _globalIvarOffsets array in initGenericObjCClass. 3. Creation/destruction of SwiftTLSContext objects. rdar://106238547
1 parent 57128dd commit 94db778

File tree

2 files changed

+11
-9
lines changed

2 files changed

+11
-9
lines changed

stdlib/public/runtime/Metadata.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,7 +1024,8 @@ namespace {
10241024
// try to swap it in.
10251025
if (!existingEntry) {
10261026
auto allocatedEntry =
1027-
new SingletonMetadataCacheEntry(std::forward<ArgTys>(args)...);
1027+
swift_cxx_newObject<SingletonMetadataCacheEntry>(
1028+
std::forward<ArgTys>(args)...);
10281029
if (cache.Private.compare_exchange_strong(existingEntry,
10291030
allocatedEntry,
10301031
std::memory_order_acq_rel,
@@ -3303,12 +3304,13 @@ initGenericObjCClass(ClassMetadata *self, size_t numFields,
33033304
if (!_globalIvarOffsets) {
33043305
if (numFields <= NumInlineGlobalIvarOffsets) {
33053306
_globalIvarOffsets = _inlineGlobalIvarOffsets;
3307+
// Make sure all the entries start out null.
3308+
memset(_globalIvarOffsets, 0, sizeof(size_t *) * numFields);
33063309
} else {
3307-
_globalIvarOffsets = new size_t*[numFields];
3310+
_globalIvarOffsets = static_cast<size_t **>(
3311+
calloc(sizeof(size_t *), numFields));
33083312
}
33093313

3310-
// Make sure all the entries start out null.
3311-
memset(_globalIvarOffsets, 0, sizeof(size_t*) * numFields);
33123314
}
33133315
return _globalIvarOffsets;
33143316
};
@@ -3368,7 +3370,7 @@ initGenericObjCClass(ClassMetadata *self, size_t numFields,
33683370

33693371
// Free the out-of-line if we allocated one.
33703372
if (_globalIvarOffsets != _inlineGlobalIvarOffsets) {
3371-
delete [] _globalIvarOffsets;
3373+
free(_globalIvarOffsets);
33723374
}
33733375
}
33743376

stdlib/public/runtime/SwiftTLSContext.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ SwiftTLSContext &SwiftTLSContext::get() {
3030

3131
static swift::once_t token;
3232
swift::tls_init_once(token, swift::tls_key::runtime, [](void *pointer) {
33-
delete static_cast<SwiftTLSContext *>(pointer);
33+
swift_cxx_deleteObject(static_cast<SwiftTLSContext *>(pointer));
3434
});
3535

36-
ctx = new SwiftTLSContext();
36+
ctx = swift_cxx_newObject<SwiftTLSContext>();
3737
swift::tls_set(swift::tls_key::runtime, ctx);
3838
return *ctx;
3939

@@ -51,15 +51,15 @@ SwiftTLSContext &SwiftTLSContext::get() {
5151
static swift::once_t token;
5252

5353
swift::tls_alloc_once(token, runtimeKey, [](void *pointer) {
54-
delete static_cast<SwiftTLSContext *>(pointer);
54+
swift_cxx_deleteObject(static_cast<SwiftTLSContext *>(pointer));
5555
});
5656

5757
SwiftTLSContext *ctx =
5858
static_cast<SwiftTLSContext *>(swift::tls_get(runtimeKey));
5959
if (ctx)
6060
return *ctx;
6161

62-
ctx = new SwiftTLSContext();
62+
ctx = swift_cxx_newObject<SwiftTLSContext>();
6363
swift::tls_set(runtimeKey, ctx);
6464
return *ctx;
6565

0 commit comments

Comments
 (0)