void NPRuntimeObjectMap::invalidate() { Vector<NPJSObject*> npJSObjects; copyValuesToVector(m_npJSObjects, npJSObjects); // Deallocate all the object wrappers so we won't leak any JavaScript objects. for (size_t i = 0; i < npJSObjects.size(); ++i) deallocateNPObject(npJSObjects[i]); // We shouldn't have any NPJSObjects left now. ASSERT(m_npJSObjects.isEmpty()); Vector<NPObject*> objects; for (HashMap<NPObject*, JSC::Weak<JSNPObject>>::iterator ptr = m_jsNPObjects.begin(), end = m_jsNPObjects.end(); ptr != end; ++ptr) { JSNPObject* jsNPObject = ptr->value.get(); if (!jsNPObject) // Skip zombies. continue; objects.append(jsNPObject->leakNPObject()); } m_jsNPObjects.clear(); for (size_t i = 0; i < objects.size(); ++i) releaseNPObject(objects[i]); // Deal with any objects that were scheduled for delayed destruction if (m_npObjectsToFinalize.isEmpty()) return; ASSERT(m_finalizationTimer.isActive()); m_finalizationTimer.stop(); invalidateQueuedObjects(); }
void NPRuntimeObjectMap::finalize(JSC::Handle<JSC::Unknown> handle, void* context) { JSNPObject* object = jsCast<JSNPObject*>(handle.get().asCell()); weakRemove(m_jsNPObjects, static_cast<NPObject*>(context), object); addToInvalidationQueue(object->leakNPObject()); }