aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4stackframe_p.h
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-06-27 17:23:39 +0200
committerLars Knoll <lars.knoll@qt.io>2018-07-03 08:08:53 +0000
commitdeaa99f66ddedc2ea79e6902c665925b04665e68 (patch)
treeaf0cb554eb40d9138f9cf723f0aa982991205635 /src/qml/jsruntime/qv4stackframe_p.h
parent2666fe4a1440cc798b9db68fcc807450d46069c2 (diff)
Refactor initialization code for JS stack frames
Move code into qv4stackframe_p.h, so that it can be re-used from different places. Clean up VME::exec and the generatorfunctions using this. Change-Id: Ib4f7eceeb5f55d98dd6ccf2584d13a3b864caea1 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4stackframe_p.h')
-rw-r--r--src/qml/jsruntime/qv4stackframe_p.h52
1 files changed, 51 insertions, 1 deletions
diff --git a/src/qml/jsruntime/qv4stackframe_p.h b/src/qml/jsruntime/qv4stackframe_p.h
index 1735d020e0..68301eb097 100644
--- a/src/qml/jsruntime/qv4stackframe_p.h
+++ b/src/qml/jsruntime/qv4stackframe_p.h
@@ -40,6 +40,7 @@
#define QV4STACKFRAME_H
#include <private/qv4context_p.h>
+#include <private/qv4enginebase_p.h>
#ifndef V4_BOOTSTRAP
#include <private/qv4function_p.h>
#endif
@@ -90,6 +91,8 @@ Q_STATIC_ASSERT(offsetof(CallData, thisObject) == CallData::This*sizeof(Value));
Q_STATIC_ASSERT(offsetof(CallData, args) == 6*sizeof(Value));
struct Q_QML_EXPORT CppStackFrame {
+ EngineBase *engine;
+ Value *savedStackTop;
CppStackFrame *parent;
Function *v4Function;
CallData *jsFrame;
@@ -101,10 +104,57 @@ struct Q_QML_EXPORT CppStackFrame {
const char *unwindLabel;
int unwindLevel;
+ void init(EngineBase *engine, Function *v4Function, const Value *argv, int argc) {
+ this->engine = engine;
+
+ this->v4Function = v4Function;
+ originalArguments = argv;
+ originalArgumentsCount = argc;
+ instructionPointer = 0;
+ yield = nullptr;
+ unwindHandler = nullptr;
+ unwindLabel = nullptr;
+ unwindLevel = 0;
+ }
+
+ void push() {
+ parent = engine->currentStackFrame;
+ engine->currentStackFrame = this;
+ savedStackTop = engine->jsStackTop;
+ }
+
+ void pop() {
+ engine->currentStackFrame = parent;
+ engine->jsStackTop = savedStackTop;
+ }
+
#ifndef V4_BOOTSTRAP
- uint requiredJSStackFrameSize() {
+ static uint requiredJSStackFrameSize(Function *v4Function) {
return CallData::HeaderSize() + v4Function->compiledFunction->nRegisters;
}
+ uint requiredJSStackFrameSize() const {
+ return requiredJSStackFrameSize(v4Function);
+ }
+ void setupJSFrame(Value *stackSpace, const Value &function, const Heap::ExecutionContext *scope,
+ const Value &thisObject, const Value &newTarget = Primitive::undefinedValue())
+ {
+ jsFrame = reinterpret_cast<CallData *>(stackSpace);
+ jsFrame->function = function;
+ jsFrame->context = scope->asReturnedValue();
+ jsFrame->accumulator = Encode::undefined();
+ jsFrame->thisObject = thisObject;
+ jsFrame->newTarget = newTarget;
+
+ uint argc = uint(originalArgumentsCount);
+ if (argc > v4Function->nFormals)
+ argc = v4Function->nFormals;
+ jsFrame->setArgc(argc);
+
+ memcpy(jsFrame->args, originalArguments, argc*sizeof(Value));
+ const Value *end = jsFrame->args + v4Function->compiledFunction->nRegisters;
+ for (Value *v = jsFrame->args + argc; v < end; ++v)
+ *v = Encode::undefined();
+ }
#endif
QString source() const;