diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2011-03-05 22:00:28 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2011-03-05 22:00:28 +0000 |
commit | 88b0c6a59a54a2d7b3763dfabb595ce0e09e658a (patch) | |
tree | 8cfd5668bc175be6107a1e10d484c42f6df91634 /include/llvm/ADT/DenseMap.h | |
parent | 7cefa640de1d3ab8cdfe6062811190a6fd33e684 (diff) | |
download | llvm-88b0c6a59a54a2d7b3763dfabb595ce0e09e658a.tar.gz llvm-88b0c6a59a54a2d7b3763dfabb595ce0e09e658a.tar.bz2 llvm-88b0c6a59a54a2d7b3763dfabb595ce0e09e658a.tar.xz |
Avoid zero-sized allocations when copying a fresh DenseMap.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127110 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/ADT/DenseMap.h')
-rw-r--r-- | include/llvm/ADT/DenseMap.h | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/include/llvm/ADT/DenseMap.h b/include/llvm/ADT/DenseMap.h index 6b99b61138..dd341c6a75 100644 --- a/include/llvm/ADT/DenseMap.h +++ b/include/llvm/ADT/DenseMap.h @@ -255,19 +255,25 @@ private: #endif operator delete(Buckets); } - Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * - other.NumBuckets)); + + NumBuckets = other.NumBuckets; + + if (NumBuckets == 0) { + Buckets = 0; + return; + } + + Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets)); if (isPodLike<KeyInfoT>::value && isPodLike<ValueInfoT>::value) - memcpy(Buckets, other.Buckets, other.NumBuckets * sizeof(BucketT)); + memcpy(Buckets, other.Buckets, NumBuckets * sizeof(BucketT)); else - for (size_t i = 0; i < other.NumBuckets; ++i) { + for (size_t i = 0; i < NumBuckets; ++i) { new (&Buckets[i].first) KeyT(other.Buckets[i].first); if (!KeyInfoT::isEqual(Buckets[i].first, getEmptyKey()) && !KeyInfoT::isEqual(Buckets[i].first, getTombstoneKey())) new (&Buckets[i].second) ValueT(other.Buckets[i].second); } - NumBuckets = other.NumBuckets; } BucketT *InsertIntoBucket(const KeyT &Key, const ValueT &Value, |