summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/interpreter/CachedCall.h
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@qt.io>2017-05-30 12:48:17 +0200
committerOswald Buddenhagen <oswald.buddenhagen@qt.io>2017-05-30 12:48:17 +0200
commit881da28418d380042aa95a97f0cbd42560a64f7c (patch)
treea794dff3274695e99c651902dde93d934ea7a5af /Source/JavaScriptCore/interpreter/CachedCall.h
parent7e104c57a70fdf551bb3d22a5d637cdcbc69dbea (diff)
parent0fcedcd17cc00d3dd44c718b3cb36c1033319671 (diff)
downloadqtwebkit-881da28418d380042aa95a97f0cbd42560a64f7c.tar.gz
Merge 'wip/next' into dev
Change-Id: Iff9ee5e23bb326c4371ec8ed81d56f2f05d680e9
Diffstat (limited to 'Source/JavaScriptCore/interpreter/CachedCall.h')
-rw-r--r--Source/JavaScriptCore/interpreter/CachedCall.h36
1 files changed, 16 insertions, 20 deletions
diff --git a/Source/JavaScriptCore/interpreter/CachedCall.h b/Source/JavaScriptCore/interpreter/CachedCall.h
index ddf9a40ad..30cad2a14 100644
--- a/Source/JavaScriptCore/interpreter/CachedCall.h
+++ b/Source/JavaScriptCore/interpreter/CachedCall.h
@@ -1,5 +1,5 @@
/*
- * 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
@@ -27,9 +27,12 @@
#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 {
@@ -38,10 +41,14 @@ namespace JSC {
CachedCall(CallFrame* callFrame, JSFunction* function, int argumentCount)
: m_valid(false)
, m_interpreter(callFrame->interpreter())
- , m_globalObjectScope(callFrame->vm(), function->scope()->globalObject())
+ , m_entryScope(callFrame->vm(), function->scope()->globalObject())
{
- ASSERT(!function->isHostFunction());
- m_closure = m_interpreter->prepareForRepeatCall(function->jsExecutable(), callFrame, function, argumentCount + 1, 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();
}
@@ -50,26 +57,15 @@ namespace JSC {
ASSERT(m_valid);
return m_interpreter->execute(m_closure);
}
- void setThis(JSValue v) { m_closure.setThis(v); }
- void setArgument(int n, JSValue v) { m_closure.setArgument(n, 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->setScope(exec->scope());
- 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;
};
}