static nsresult SetOrRemoveObject(PLDHashTable& table, nsIContent* aKey, nsISupports* aValue) { if (aValue) { // lazily create the table, but only when adding elements if (!table.ops && !PL_DHashTableInit(&table, &ObjectTableOps, nullptr, sizeof(ObjectEntry), 16)) { table.ops = nullptr; return NS_ERROR_OUT_OF_MEMORY; } aKey->SetFlags(NODE_MAY_BE_IN_BINDING_MNGR); return AddObjectEntry(table, aKey, aValue); } // no value, so remove the key from the table if (table.ops) { ObjectEntry* entry = static_cast<ObjectEntry*> (PL_DHashTableOperate(&table, aKey, PL_DHASH_LOOKUP)); if (entry && PL_DHASH_ENTRY_IS_BUSY(entry)) { // Keep key and value alive while removing the entry. nsCOMPtr<nsISupports> key = entry->GetKey(); nsCOMPtr<nsISupports> value = entry->GetValue(); RemoveObjectEntry(table, aKey); } } return NS_OK; }
// helper routine for adding a new entry static nsresult AddObjectEntry(PLDHashTable& table, nsISupports* aKey, nsISupports* aValue) { NS_ASSERTION(aKey, "key must be non-null"); if (!aKey) return NS_ERROR_INVALID_ARG; ObjectEntry *entry = static_cast<ObjectEntry*> (PL_DHashTableOperate(&table, aKey, PL_DHASH_ADD)); if (!entry) return NS_ERROR_OUT_OF_MEMORY; // only add the key if the entry is new if (!entry->GetKey()) entry->SetKey(aKey); // now attach the new entry - note that entry->mValue could possibly // have a value already, this will release that. entry->SetValue(aValue); return NS_OK; }