mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 19:35:51 +00:00
Bug 1288909, part 4 - Use a strong reference to the set in ClassInfo2NativeSetMap. r=billm
Entries should end up getting cleared out from this table before the value dies, so let's just make the reference strong so that any mistakes will result in leaks and not use-after-frees. Using smart pointer classes with PLDHashtable is a little questionable, and I don't want to convert this one hash table to nsTHashtable, so I use manual addref and release. MozReview-Commit-ID: Kfg9veS6r11 --HG-- extra : rebase_source : 865ab48c2cf67546dd705cf79f8873efe695ac5c
This commit is contained in:
parent
946ffa2384
commit
51db16e7f5
@ -201,6 +201,33 @@ IID2NativeInterfaceMap::SizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf)
|
||||
/***************************************************************************/
|
||||
// implement ClassInfo2NativeSetMap...
|
||||
|
||||
// static
|
||||
bool ClassInfo2NativeSetMap::Entry::Match(const PLDHashEntryHdr* aEntry,
|
||||
const void* aKey)
|
||||
{
|
||||
return static_cast<const Entry*>(aEntry)->key == aKey;
|
||||
}
|
||||
|
||||
// static
|
||||
void ClassInfo2NativeSetMap::Entry::Clear(PLDHashTable* aTable,
|
||||
PLDHashEntryHdr* aEntry)
|
||||
{
|
||||
auto entry = static_cast<Entry*>(aEntry);
|
||||
NS_RELEASE(entry->value);
|
||||
|
||||
entry->key = nullptr;
|
||||
entry->value = nullptr;
|
||||
}
|
||||
|
||||
const PLDHashTableOps ClassInfo2NativeSetMap::Entry::sOps =
|
||||
{
|
||||
PLDHashTable::HashVoidPtrKeyStub,
|
||||
Match,
|
||||
PLDHashTable::MoveEntryStub,
|
||||
Clear,
|
||||
nullptr
|
||||
};
|
||||
|
||||
// static
|
||||
ClassInfo2NativeSetMap*
|
||||
ClassInfo2NativeSetMap::newMap(int length)
|
||||
@ -209,7 +236,7 @@ ClassInfo2NativeSetMap::newMap(int length)
|
||||
}
|
||||
|
||||
ClassInfo2NativeSetMap::ClassInfo2NativeSetMap(int length)
|
||||
: mTable(PLDHashTable::StubOps(), sizeof(Entry), length)
|
||||
: mTable(&ClassInfo2NativeSetMap::Entry::sOps, sizeof(Entry), length)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -278,7 +278,12 @@ public:
|
||||
struct Entry : public PLDHashEntryHdr
|
||||
{
|
||||
nsIClassInfo* key;
|
||||
XPCNativeSet* value;
|
||||
XPCNativeSet* value; // strong reference
|
||||
static const PLDHashTableOps sOps;
|
||||
|
||||
private:
|
||||
static bool Match(const PLDHashEntryHdr* aEntry, const void* aKey);
|
||||
static void Clear(PLDHashTable* aTable, PLDHashEntryHdr* aEntry);
|
||||
};
|
||||
|
||||
static ClassInfo2NativeSetMap* newMap(int length);
|
||||
@ -298,7 +303,7 @@ public:
|
||||
if (entry->key)
|
||||
return entry->value;
|
||||
entry->key = info;
|
||||
entry->value = set;
|
||||
NS_ADDREF(entry->value = set);
|
||||
return set;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user