#ifndef CachedCall_h
#define CachedCall_h
#include "CallFrameClosure.h"
#include "ExceptionHelpers.h"
#include "JSFunction.h"
#include "JSGlobalObject.h"
#include "Interpreter.h"
#include "ProtoCallFrame.h"
#include "VMEntryScope.h"
namespace JSC {
class CachedCall {
WTF_MAKE_NONCOPYABLE(CachedCall); WTF_MAKE_FAST_ALLOCATED;
public:
CachedCall(CallFrame* callFrame, JSFunction* function, int argumentCount)
: m_valid(false)
, m_interpreter(callFrame->interpreter())
, m_entryScope(callFrame->vm(), function->scope()->globalObject())
{
ASSERT(!function->isHostFunctionNonInline());
if (callFrame->vm().isSafeToRecurse()) {
m_arguments.resize(argumentCount);
m_closure = m_interpreter->prepareForRepeatCall(function->jsExecutable(), callFrame, &m_protoCallFrame, function, argumentCount + 1, function->scope(), m_arguments.data());
} else
throwStackOverflowError(callFrame);
m_valid = !callFrame->hadException();
}
JSValue call()
{
ASSERT(m_valid);
return m_interpreter->execute(m_closure);
}
void setThis(JSValue v) { m_protoCallFrame.setThisValue(v); }
void setArgument(int n, JSValue v) { m_protoCallFrame.setArgument(n, v); }
private:
bool m_valid;
Interpreter* m_interpreter;
VMEntryScope m_entryScope;
ProtoCallFrame m_protoCallFrame;
Vector<JSValue> m_arguments;
CallFrameClosure m_closure;
};
}
#endif