/*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2009, 2013 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
#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 argCount)
+ CachedCall(CallFrame* callFrame, JSFunction* function, int argumentCount)
: m_valid(false)
, m_interpreter(callFrame->interpreter())
- , m_globalObjectScope(callFrame->globalData(), function->scope()->globalObject.get())
+ , m_entryScope(callFrame->vm(), function->scope()->globalObject())
{
- ASSERT(!function->isHostFunction());
- m_closure = m_interpreter->prepareForRepeatCall(function->jsExecutable(), callFrame, function, argCount, function->scope());
+ 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();
}
ASSERT(m_valid);
return m_interpreter->execute(m_closure);
}
- void setThis(JSValue v) { m_closure.setArgument(0, v); }
- void setArgument(int n, JSValue v) { m_closure.setArgument(n + 1, v); }
+ void setThis(JSValue v) { m_protoCallFrame.setThisValue(v); }
+ void setArgument(int n, JSValue v) { m_protoCallFrame.setArgument(n, v); }
- CallFrame* newCallFrame(ExecState* exec)
- {
- CallFrame* callFrame = m_closure.newCallFrame;
- callFrame->setScopeChain(exec->scopeChain());
- return callFrame;
- }
-
- ~CachedCall()
- {
- if (m_valid)
- m_interpreter->endRepeatCall(m_closure);
- }
-
private:
bool m_valid;
Interpreter* m_interpreter;
- DynamicGlobalObjectScope m_globalObjectScope;
+ VMEntryScope m_entryScope;
+ ProtoCallFrame m_protoCallFrame;
+ Vector<JSValue> m_arguments;
CallFrameClosure m_closure;
};
}