2010-02-04 Stephen White <senorblanco@chromium.org>

        Unreviewed, build fix for Chromium.

        Revert r54341 ("[v8] Remove clear method from DOM object maps"),
        since it causes the worker tests to fail on Chromium.

        * bindings/v8/DOMData.h:
        (WebCore::DOMData::removeObjectsFromWrapperMap):
        * bindings/v8/DOMDataStore.h:
        (WebCore::ChunkedTable::clear):
        (WebCore::ChunkedTable::clearEntries):
        (WebCore::DOMDataStore::IntrusiveDOMWrapperMap::clear):
        (WebCore::DOMDataStore::IntrusiveDOMWrapperMap::ChunkedTableTraits::clear):
        * bindings/v8/V8DOMMap.cpp:
        (WebCore::removeAllDOMObjectsInCurrentThreadHelper):
        (WebCore::removeAllDOMObjectsInCurrentThread):
        * bindings/v8/V8DOMMap.h:
        (WebCore::WeakReferenceMap::clear):
        * bindings/v8/WorkerScriptController.cpp:
        (WebCore::WorkerScriptController::~WorkerScriptController):


git-svn-id: svn://svn.chromium.org/blink/trunk@54361 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 39e712d4
2010-02-04 Stephen White <senorblanco@chromium.org>
Unreviewed, build fix for Chromium.
Revert r54341 ("[v8] Remove clear method from DOM object maps"),
since it causes the worker tests to fail on Chromium.
* bindings/v8/DOMData.h:
(WebCore::DOMData::removeObjectsFromWrapperMap):
* bindings/v8/DOMDataStore.h:
(WebCore::ChunkedTable::clear):
(WebCore::ChunkedTable::clearEntries):
(WebCore::DOMDataStore::IntrusiveDOMWrapperMap::clear):
(WebCore::DOMDataStore::IntrusiveDOMWrapperMap::ChunkedTableTraits::clear):
* bindings/v8/V8DOMMap.cpp:
(WebCore::removeAllDOMObjectsInCurrentThreadHelper):
(WebCore::removeAllDOMObjectsInCurrentThread):
* bindings/v8/V8DOMMap.h:
(WebCore::WeakReferenceMap::clear):
* bindings/v8/WorkerScriptController.cpp:
(WebCore::WorkerScriptController::~WorkerScriptController):
2010-02-04 Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk>
Reviewed by Xan Lopez.
......
......@@ -112,6 +112,14 @@ namespace WebCore {
}
}
template<typename T>
void DOMData::removeObjectsFromWrapperMap(AbstractWeakReferenceMap<T, v8::Object>& domMap)
{
WrapperMapObjectRemover<T> remover;
domMap.visit(&remover);
domMap.clear();
}
} // namespace WebCore
#endif // DOMData_h
......@@ -84,6 +84,27 @@ namespace WebCore {
ASSERT(!m_chunks || ((m_chunks->m_entries < m_current) && (m_current <= m_last)));
}
void clear()
{
if (!m_chunks)
return;
clearEntries(m_chunks->m_entries, m_current);
Chunk* last = m_chunks;
while (true) {
Chunk* previous = last->m_previous;
if (!previous)
break;
delete last;
clearEntries(previous->m_entries, previous->m_entries + CHUNK_SIZE);
last = previous;
}
m_chunks = last;
m_current = m_chunks->m_entries;
m_last = m_current + CHUNK_SIZE;
}
void visit(typename Traits::Visitor* visitor)
{
if (!m_chunks)
......@@ -101,6 +122,12 @@ namespace WebCore {
T m_entries[CHUNK_SIZE];
};
static void clearEntries(T* first, T* last)
{
for (T* entry = first; entry < last; entry++)
Traits::clear(entry);
}
static void visitEntries(T* first, T* last, typename Traits::Visitor* visitor)
{
for (T* entry = first; entry < last; entry++)
......@@ -181,6 +208,11 @@ namespace WebCore {
virtual bool removeIfPresent(Node* key, v8::Persistent<v8::Data> value);
virtual void clear()
{
m_table.clear();
}
private:
static int const numberOfEntries = (1 << 10) - 1;
......@@ -195,6 +227,15 @@ namespace WebCore {
node->setWrapper(target);
}
static void clear(v8::Persistent<v8::Object>* entry)
{
Node* node = V8Node::toNative(*entry);
ASSERT(node->wrapper() == entry);
node->clearWrapper();
entry->Dispose();
}
static void visit(v8::Persistent<v8::Object>* entry, Visitor* visitor)
{
Node* node = V8Node::toNative(*entry);
......
......@@ -95,6 +95,45 @@ DOMWrapperMap<void>& getDOMSVGObjectWithContextMap()
#endif // ENABLE(SVG)
static void removeAllDOMObjectsInCurrentThreadHelper()
{
v8::HandleScope scope;
// Deref all objects in the delayed queue.
DOMData::getCurrent()->derefDelayedObjects();
// The DOM objects with the following types only exist on the main thread.
if (WTF::isMainThread()) {
// Remove all DOM nodes.
DOMData::removeObjectsFromWrapperMap<Node>(getDOMNodeMap());
#if ENABLE(SVG)
// Remove all SVG element instances in the wrapper map.
DOMData::removeObjectsFromWrapperMap<SVGElementInstance>(getDOMSVGElementInstanceMap());
// Remove all SVG objects with context in the wrapper map.
DOMData::removeObjectsFromWrapperMap<void>(getDOMSVGObjectWithContextMap());
#endif
}
// Remove all DOM objects in the wrapper map.
DOMData::removeObjectsFromWrapperMap<void>(getDOMObjectMap());
// Remove all active DOM objects in the wrapper map.
DOMData::removeObjectsFromWrapperMap<void>(getActiveDOMObjectMap());
}
void removeAllDOMObjectsInCurrentThread()
{
// Use the locker only if it has already been invoked before, as by worker thread.
if (v8::Locker::IsActive()) {
v8::Locker locker;
removeAllDOMObjectsInCurrentThreadHelper();
} else
removeAllDOMObjectsInCurrentThreadHelper();
}
void visitDOMNodesInCurrentThread(DOMWrapperMap<Node>::Visitor* visitor)
{
v8::HandleScope scope;
......
......@@ -58,6 +58,7 @@ namespace WebCore {
virtual bool contains(KeyType* obj) = 0;
virtual void visit(Visitor* visitor) = 0;
virtual bool removeIfPresent(KeyType* key, v8::Persistent<v8::Data> value) = 0;
virtual void clear() = 0;
v8::WeakReferenceCallback weakReferenceCallback() { return m_weakReferenceCallback; }
private:
......@@ -118,6 +119,11 @@ namespace WebCore {
return true;
}
void clear()
{
m_map.clear();
}
bool contains(KeyType* obj) { return m_map.contains(obj); }
virtual void visit(typename Parent::Visitor* visitor)
......@@ -164,6 +170,9 @@ namespace WebCore {
DOMWrapperMap<void>& getActiveDOMObjectMap();
void visitActiveDOMObjectsInCurrentThread(DOMWrapperMap<void>::Visitor*);
// This should be called to remove all DOM objects associated with the current thread when it is tearing down.
void removeAllDOMObjectsInCurrentThread();
#if ENABLE(SVG)
// A map for SVGElementInstances to its JS wrapper.
DOMWrapperMap<SVGElementInstance>& getDOMSVGElementInstanceMap();
......
......@@ -57,6 +57,7 @@ WorkerScriptController::WorkerScriptController(WorkerContext* workerContext)
WorkerScriptController::~WorkerScriptController()
{
removeAllDOMObjectsInCurrentThread();
}
ScriptValue WorkerScriptController::evaluate(const ScriptSourceCode& sourceCode)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment