Skip to content

Commit 69d0905

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 69d0905

File tree

2 files changed

+11
-11
lines changed

2 files changed

+11
-11
lines changed

stdlib/public/runtime/Metadata.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,8 +1023,8 @@ namespace {
10231023
// If there isn't one there, optimistically create an entry and
10241024
// try to swap it in.
10251025
if (!existingEntry) {
1026-
auto allocatedEntry =
1027-
new SingletonMetadataCacheEntry(std::forward<ArgTys>(args)...);
1026+
auto allocatedEntry = swift_cxx_newObject<SingletonMetadataCacheEntry>(
1027+
std::forward<ArgTys>(args)...);
10281028
if (cache.Private.compare_exchange_strong(existingEntry,
10291029
allocatedEntry,
10301030
std::memory_order_acq_rel,
@@ -3303,12 +3303,12 @@ initGenericObjCClass(ClassMetadata *self, size_t numFields,
33033303
if (!_globalIvarOffsets) {
33043304
if (numFields <= NumInlineGlobalIvarOffsets) {
33053305
_globalIvarOffsets = _inlineGlobalIvarOffsets;
3306+
// Make sure all the entries start out null.
3307+
memset(_globalIvarOffsets, 0, sizeof(size_t *) * numFields);
33063308
} else {
3307-
_globalIvarOffsets = new size_t*[numFields];
3309+
_globalIvarOffsets =
3310+
static_cast<size_t **>(calloc(sizeof(size_t *), numFields));
33083311
}
3309-
3310-
// Make sure all the entries start out null.
3311-
memset(_globalIvarOffsets, 0, sizeof(size_t*) * numFields);
33123312
}
33133313
return _globalIvarOffsets;
33143314
};
@@ -3368,7 +3368,7 @@ initGenericObjCClass(ClassMetadata *self, size_t numFields,
33683368

33693369
// Free the out-of-line if we allocated one.
33703370
if (_globalIvarOffsets != _inlineGlobalIvarOffsets) {
3371-
delete [] _globalIvarOffsets;
3371+
free(_globalIvarOffsets);
33723372
}
33733373
}
33743374

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)