WebJavaScriptCollector.cpp [plain text]
#include "config.h"
#include "WebKitDLL.h"
#include "WebJavaScriptCollector.h"
#include <JavaScriptCore/Heap.h>
#include <JavaScriptCore/VM.h>
#include <WebCore/GCController.h>
#include <WebCore/JSDOMWindow.h>
#include <runtime/JSLock.h>
using namespace JSC;
using namespace WebCore;
WebJavaScriptCollector::WebJavaScriptCollector()
: m_refCount(0)
{
gClassCount++;
gClassNameCount.add("WebJavaScriptCollector");
}
WebJavaScriptCollector::~WebJavaScriptCollector()
{
gClassCount--;
gClassNameCount.remove("WebJavaScriptCollector");
}
WebJavaScriptCollector* WebJavaScriptCollector::createInstance()
{
WebJavaScriptCollector* instance = new WebJavaScriptCollector();
instance->AddRef();
return instance;
}
HRESULT STDMETHODCALLTYPE WebJavaScriptCollector::QueryInterface(REFIID riid, void** ppvObject)
{
*ppvObject = 0;
if (IsEqualGUID(riid, IID_IUnknown))
*ppvObject = static_cast<IWebJavaScriptCollector*>(this);
else if (IsEqualGUID(riid, IID_IWebJavaScriptCollector))
*ppvObject = static_cast<IWebJavaScriptCollector*>(this);
else
return E_NOINTERFACE;
AddRef();
return S_OK;
}
ULONG STDMETHODCALLTYPE WebJavaScriptCollector::AddRef(void)
{
return ++m_refCount;
}
ULONG STDMETHODCALLTYPE WebJavaScriptCollector::Release(void)
{
ULONG newRef = --m_refCount;
if (!newRef)
delete(this);
return newRef;
}
HRESULT STDMETHODCALLTYPE WebJavaScriptCollector::collect()
{
gcController().garbageCollectNow();
return S_OK;
}
HRESULT STDMETHODCALLTYPE WebJavaScriptCollector::collectOnAlternateThread(
BOOL waitUntilDone)
{
gcController().garbageCollectOnAlternateThreadForDebugging(!!waitUntilDone);
return S_OK;
}
HRESULT STDMETHODCALLTYPE WebJavaScriptCollector::objectCount(
UINT* count)
{
if (!count) {
ASSERT_NOT_REACHED();
return E_POINTER;
}
JSLockHolder lock(JSDOMWindow::commonVM());
*count = (UINT)JSDOMWindow::commonVM()->heap.objectCount();
return S_OK;
}