Fix performance regression from KT54659 fix
diff --git a/kotlin-native/runtime/src/mm/cpp/ObjectFactory.hpp b/kotlin-native/runtime/src/mm/cpp/ObjectFactory.hpp
index 51d3106..48474b7 100644
--- a/kotlin-native/runtime/src/mm/cpp/ObjectFactory.hpp
+++ b/kotlin-native/runtime/src/mm/cpp/ObjectFactory.hpp
@@ -542,8 +542,10 @@
// multiplication checked in the previous call, but any of the
// subsequent additions overflowed, then the overflowed value will
// be small compared to the number of entries in the array.
- if (Storage::Node::GetSizeForDataSize(allocSize) < count) {
- ThrowOutOfMemoryError();
+ if constexpr (sizeof(size_t) == sizeof(uint32_t)) {
+ if (Storage::Node::GetSizeForDataSize(allocSize) < count) {
+ ThrowOutOfMemoryError();
+ }
}
auto& node = producer_.Insert(allocSize);
auto* heapArray = new (node.Data()) HeapArrayHeader();
@@ -569,8 +571,12 @@
static size_t ArrayAllocatedDataSize(const TypeInfo* typeInfo, uint32_t count) noexcept {
size_t membersSize;
- if (__builtin_mul_overflow(static_cast<size_t>(-typeInfo->instanceSize_), count, &membersSize)) {
- ThrowOutOfMemoryError();
+ if constexpr (sizeof(size_t) == sizeof(uint32_t)) {
+ if (__builtin_mul_overflow(static_cast<size_t>(-typeInfo->instanceSize_), count, &membersSize)) {
+ ThrowOutOfMemoryError();
+ }
+ } else {
+ membersSize = static_cast<size_t>(-typeInfo->instanceSize_) * count;
}
// Note: array body is aligned, but for size computation it is enough to align the sum.
return AlignUp(sizeof(HeapArrayHeader) + membersSize, kObjectAlignment);