diff options
author | Moonchild <mcwerewolf@gmail.com> | 2018-08-20 08:25:06 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-20 08:25:06 +0200 |
commit | 3499a2e4932e3054a229987aca80e7abd9c75c6c (patch) | |
tree | 1af747e97d275d0a47a0a8d75ce14e2b9f749fe0 /js/public/HashTable.h | |
parent | 29fbe8f27d58a0dfa64aadbbd1757dbbeff3a4fd (diff) | |
parent | b5e87d0644f634240bf3c67cca505f91f271cfa9 (diff) | |
download | UXP-3499a2e4932e3054a229987aca80e7abd9c75c6c.tar UXP-3499a2e4932e3054a229987aca80e7abd9c75c6c.tar.gz UXP-3499a2e4932e3054a229987aca80e7abd9c75c6c.tar.lz UXP-3499a2e4932e3054a229987aca80e7abd9c75c6c.tar.xz UXP-3499a2e4932e3054a229987aca80e7abd9c75c6c.zip |
Merge pull request #714 from trav90/class-memaccess-errors
Fix more -Wclass-memaccess warnings:
- Avoid using memset on a not-trivial types
- Avoid doing memset on non-POD structures
- Be more restrictive with memset on Array containers
Diffstat (limited to 'js/public/HashTable.h')
-rw-r--r-- | js/public/HashTable.h | 46 |
1 files changed, 33 insertions, 13 deletions
diff --git a/js/public/HashTable.h b/js/public/HashTable.h index 5d4c0665d..8a2493b55 100644 --- a/js/public/HashTable.h +++ b/js/public/HashTable.h @@ -12,6 +12,7 @@ #include "mozilla/Attributes.h" #include "mozilla/Casting.h" #include "mozilla/HashFunctions.h" +#include "mozilla/MemoryChecking.h" #include "mozilla/MemoryReporting.h" #include "mozilla/Move.h" #include "mozilla/Opaque.h" @@ -805,17 +806,22 @@ class HashTableEntry void operator=(const HashTableEntry&) = delete; ~HashTableEntry() = delete; + void destroyStoredT() { + mem.addr()->~T(); + MOZ_MAKE_MEM_UNDEFINED(mem.addr(), sizeof(*mem.addr())); + } + public: // NB: HashTableEntry is treated as a POD: no constructor or destructor calls. void destroyIfLive() { if (isLive()) - mem.addr()->~T(); + destroyStoredT(); } void destroy() { MOZ_ASSERT(isLive()); - mem.addr()->~T(); + destroyStoredT(); } void swap(HashTableEntry* other) { @@ -835,10 +841,28 @@ class HashTableEntry NonConstT& getMutable() { MOZ_ASSERT(isLive()); return *mem.addr(); } bool isFree() const { return keyHash == sFreeKey; } - void clearLive() { MOZ_ASSERT(isLive()); keyHash = sFreeKey; mem.addr()->~T(); } - void clear() { if (isLive()) mem.addr()->~T(); keyHash = sFreeKey; } + void clearLive() { + MOZ_ASSERT(isLive()); + keyHash = sFreeKey; + destroyStoredT(); + } + + void clear() { + if (isLive()) + destroyStoredT(); + + MOZ_MAKE_MEM_UNDEFINED(this, sizeof(*this)); + keyHash = sFreeKey; + } + bool isRemoved() const { return keyHash == sRemovedKey; } - void removeLive() { MOZ_ASSERT(isLive()); keyHash = sRemovedKey; mem.addr()->~T(); } + + void removeLive() { + MOZ_ASSERT(isLive()); + keyHash = sRemovedKey; + destroyStoredT(); + } + bool isLive() const { return isLiveHash(keyHash); } void setCollision() { MOZ_ASSERT(isLive()); keyHash |= sCollisionBit; } void unsetCollision() { keyHash &= ~sCollisionBit; } @@ -1654,14 +1678,10 @@ class HashTable : private AllocPolicy public: void clear() { - if (mozilla::IsPod<Entry>::value) { - memset(table, 0, sizeof(*table) * capacity()); - } else { - uint32_t tableCapacity = capacity(); - Entry* end = table + tableCapacity; - for (Entry* e = table; e < end; ++e) - e->clear(); - } + Entry* end = table + capacity(); + for (Entry* e = table; e < end; ++e) + e->clear(); + removedCount = 0; entryCount = 0; #ifdef JS_DEBUG |