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 looking up an existing entry. Note that the // return result is NOT addreffed static nsISupports* LookupObject(PLDHashTable& table, nsIContent* aKey) { if (aKey && aKey->HasFlag(NODE_MAY_BE_IN_BINDING_MNGR)) { ObjectEntry *entry = static_cast<ObjectEntry*> (PL_DHashTableOperate(&table, aKey, PL_DHASH_LOOKUP)); if (PL_DHASH_ENTRY_IS_BUSY(entry)) return entry->GetValue(); } return nullptr; }