JSCallbackData.cpp [plain text]
#include "config.h"
#include "JSCallbackData.h"
#include "Document.h"
#include "JSDOMBinding.h"
#include "JSMainThreadExecState.h"
#include "JSMainThreadExecStateInstrumentation.h"
using namespace JSC;
namespace WebCore {
void JSCallbackData::deleteData(void* context)
{
delete static_cast<JSCallbackData*>(context);
}
JSValue JSCallbackData::invokeCallback(MarkedArgumentBuffer& args, bool* raisedException)
{
ASSERT(callback());
return invokeCallback(callback(), args, raisedException);
}
JSValue JSCallbackData::invokeCallback(JSValue thisValue, MarkedArgumentBuffer& args, bool* raisedException)
{
ASSERT(callback());
ASSERT(globalObject());
ExecState* exec = globalObject()->globalExec();
JSValue function = callback();
CallData callData;
CallType callType = callback()->methodTable()->getCallData(callback(), callData);
if (callType == CallTypeNone) {
function = callback()->get(exec, Identifier(exec, "handleEvent"));
callType = getCallData(function, callData);
if (callType == CallTypeNone)
return JSValue();
}
ScriptExecutionContext* context = globalObject()->scriptExecutionContext();
if (!context)
return JSValue();
InspectorInstrumentationCookie cookie = JSMainThreadExecState::instrumentFunctionCall(context, callType, callData);
JSValue exception;
JSValue result = context->isDocument()
? JSMainThreadExecState::call(exec, function, callType, callData, thisValue, args, &exception)
: JSC::call(exec, function, callType, callData, thisValue, args, &exception);
InspectorInstrumentation::didCallFunction(cookie, context);
if (exception) {
reportException(exec, exception);
if (raisedException)
*raisedException = true;
return result;
}
return result;
}
}