JSMainThreadExecState.h [plain text]
#ifndef JSMainThreadExecState_h
#define JSMainThreadExecState_h
#include "JSDOMBinding.h"
#include <runtime/Completion.h>
#include <runtime/Microtask.h>
#include <wtf/MainThread.h>
#if PLATFORM(IOS)
#include "WebCoreThread.h"
#endif
namespace WebCore {
class InspectorInstrumentationCookie;
class ScriptExecutionContext;
class JSMainThreadExecState {
WTF_MAKE_NONCOPYABLE(JSMainThreadExecState);
friend class JSMainThreadNullState;
public:
static JSC::ExecState* currentState()
{
ASSERT(isMainThread());
return s_mainThreadState;
};
static JSC::JSValue call(JSC::ExecState* exec, JSC::JSValue functionObject, JSC::CallType callType, const JSC::CallData& callData, JSC::JSValue thisValue, const JSC::ArgList& args, NakedPtr<JSC::Exception>& returnedException)
{
JSMainThreadExecState currentState(exec);
return JSC::call(exec, functionObject, callType, callData, thisValue, args, returnedException);
};
static JSC::JSValue evaluate(JSC::ExecState* exec, const JSC::SourceCode& source, JSC::JSValue thisValue, NakedPtr<JSC::Exception>& returnedException)
{
JSMainThreadExecState currentState(exec);
return JSC::evaluate(exec, source, thisValue, returnedException);
};
static JSC::JSValue evaluate(JSC::ExecState* exec, const JSC::SourceCode& source, JSC::JSValue thisValue = JSC::JSValue())
{
NakedPtr<JSC::Exception> unused;
return evaluate(exec, source, thisValue, unused);
};
static void runTask(JSC::ExecState* exec, JSC::Microtask& task)
{
JSMainThreadExecState currentState(exec);
task.run(exec);
}
static InspectorInstrumentationCookie instrumentFunctionCall(ScriptExecutionContext*, JSC::CallType, const JSC::CallData&);
private:
explicit JSMainThreadExecState(JSC::ExecState* exec)
: m_previousState(s_mainThreadState)
, m_lock(exec)
{
ASSERT(isMainThread());
s_mainThreadState = exec;
};
~JSMainThreadExecState()
{
ASSERT(isMainThread());
ASSERT(!s_mainThreadState->hadException());
bool didExitJavaScript = s_mainThreadState && !m_previousState;
s_mainThreadState = m_previousState;
if (didExitJavaScript)
didLeaveScriptContext();
}
static JSC::ExecState* s_mainThreadState;
JSC::ExecState* m_previousState;
JSC::JSLockHolder m_lock;
static void didLeaveScriptContext();
};
class JSMainThreadNullState {
WTF_MAKE_NONCOPYABLE(JSMainThreadNullState);
public:
explicit JSMainThreadNullState()
: m_previousState(JSMainThreadExecState::s_mainThreadState)
{
ASSERT(isMainThread());
JSMainThreadExecState::s_mainThreadState = nullptr;
}
~JSMainThreadNullState()
{
ASSERT(isMainThread());
JSMainThreadExecState::s_mainThreadState = m_previousState;
}
private:
JSC::ExecState* m_previousState;
};
JSC::JSValue functionCallHandlerFromAnyThread(JSC::ExecState*, JSC::JSValue functionObject, JSC::CallType, const JSC::CallData&, JSC::JSValue thisValue, const JSC::ArgList& args, NakedPtr<JSC::Exception>& returnedException);
JSC::JSValue evaluateHandlerFromAnyThread(JSC::ExecState*, const JSC::SourceCode&, JSC::JSValue thisValue, NakedPtr<JSC::Exception>& returnedException);
}
#endif // JSMainThreadExecState_h