summaryrefslogtreecommitdiffstats
path: root/js/public/HashTable.h
diff options
context:
space:
mode:
authorMoonchild <mcwerewolf@gmail.com>2018-08-20 08:25:06 +0200
committerGitHub <noreply@github.com>2018-08-20 08:25:06 +0200
commit3499a2e4932e3054a229987aca80e7abd9c75c6c (patch)
tree1af747e97d275d0a47a0a8d75ce14e2b9f749fe0 /js/public/HashTable.h
parent29fbe8f27d58a0dfa64aadbbd1757dbbeff3a4fd (diff)
parentb5e87d0644f634240bf3c67cca505f91f271cfa9 (diff)
downloadUXP-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.h46
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