diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-06-27 17:23:39 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-07-03 08:08:53 +0000 |
commit | deaa99f66ddedc2ea79e6902c665925b04665e68 (patch) | |
tree | af0cb554eb40d9138f9cf723f0aa982991205635 /src/qml/jsruntime/qv4stackframe_p.h | |
parent | 2666fe4a1440cc798b9db68fcc807450d46069c2 (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.h | 52 |
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; |