17#include <private/qv4scopedvalue_p.h>
18#include <private/qv4context_p.h>
19#include <private/qv4enginebase_p.h>
20#include <private/qv4calldata_p.h>
21#include <private/qv4function_p.h>
72 using CppStackFrameBase::instructionPointer;
73 using CppStackFrameBase::v4Function;
76 this->v4Function = v4Function;
77 originalArgumentsCount = argc;
78 instructionPointer = 0;
87 int lineNumber()
const;
88 int statementNumber()
const;
90 int missingLineNumber()
const;
95 int argc()
const {
return originalArgumentsCount; }
107 Q_ASSERT(kind == Kind::JS || kind == Kind::Meta);
108 parent =
engine->currentStackFrame;
109 engine->currentStackFrame =
this;
114 engine->currentStackFrame = parent;
119 while (
ctx->type != Heap::ExecutionContext::Type_CallContext)
121 return static_cast<Heap::CallContext *
>(
ctx);
127 using CppStackFrame::push;
128 using CppStackFrame::pop;
131 void **returnAndArgs,
const QMetaType *metaTypes,
int argc)
133 CppStackFrame::init(v4Function, argc, Kind::Meta);
134 CppStackFrameBase::thisObject = thisObject;
135 CppStackFrameBase::context =
context;
136 CppStackFrameBase::metaTypes = metaTypes;
137 CppStackFrameBase::returnAndArgs = returnAndArgs;
138 CppStackFrameBase::returnValueIsUndefined =
false;
148 void **
argv()
const {
return returnAndArgs + 1; }
160 return CppStackFrame::callContext(CppStackFrameBase::context->
d());
166 using CppStackFrame::jsFrame;
169 using CppStackFrame::unwindHandler;
170 using CppStackFrame::unwindLabel;
171 using CppStackFrame::unwindLevel;
174 bool callerCanHandleTailCall =
false)
176 CppStackFrame::init(v4Function, argc, Kind::JS);
177 CppStackFrame::originalArguments = argv;
178 CppStackFrame::yield =
nullptr;
179 CppStackFrame::unwindHandler =
nullptr;
180 CppStackFrame::yieldIsIterator =
false;
181 CppStackFrame::callerCanHandleTailCall = callerCanHandleTailCall;
182 CppStackFrame::pendingTailCall =
false;
183 CppStackFrame::isTailCalling =
false;
184 CppStackFrame::unwindLabel =
nullptr;
185 CppStackFrame::unwindLevel = 0;
191 return CallData::HeaderSize() + nRegisters;
197 return requiredJSStackFrameSize(v4Function);
201 const Value &thisObject,
const Value &newTarget = Value::undefinedValue()) {
202 setupJSFrame(stackSpace, function, scope, thisObject, newTarget,
203 v4Function->compiledFunction->nFormals,
204 v4Function->compiledFunction->nRegisters);
208 Value *stackSpace,
const Value &function,
const Heap::ExecutionContext *scope,
211 jsFrame =
reinterpret_cast<CallData *
>(stackSpace);
213 jsFrame->context = scope->asReturnedValue();
214 jsFrame->accumulator = Encode::undefined();
215 jsFrame->thisObject = thisObject;
216 jsFrame->newTarget = newTarget;
218 uint argc =
uint(originalArgumentsCount);
221 jsFrame->setArgc(argc);
224 if (originalArguments)
225 memcpy(jsFrame->args, originalArguments, argc *
sizeof(
Value));
227 memset(jsFrame->args + argc, 0, (nRegisters - argc) *
sizeof(
Value));
229 if (v4Function && v4Function->compiledFunction) {
230 const int firstDeadZoneRegister
231 = v4Function->compiledFunction->firstTemporalDeadZoneRegister;
232 const int registerDeadZoneSize
233 = v4Function->compiledFunction->sizeOfRegisterTemporalDeadZone;
235 const Value * tdzEnd = stackSpace + firstDeadZoneRegister + registerDeadZoneSize;
236 for (
Value *
v = stackSpace + firstDeadZoneRegister;
v < tdzEnd; ++
v)
253 return CppStackFrame::callContext(
static_cast<ExecutionContext &
>(jsFrame->context).d());
257 void setTailCalling(
bool tailCalling) { CppStackFrame::isTailCalling = tailCalling; }
262 const char *
yield()
const {
return CppStackFrame::yield; }
263 void setYield(
const char *yield) { CppStackFrame::yield = yield; }
272 return jsFrame->thisObject.asReturnedValue();
278 CppStackFrame::push(
engine);
279 savedStackTop =
engine->jsStackTop;
283 CppStackFrame::pop(
engine);
284 engine->jsStackTop = savedStackTop;
300 : engine(scope.engine)
303 frame.
init(currentFrame->v4Function,
nullptr,
context,
nullptr,
nullptr, 0);
306 frame.
init(
nullptr,
nullptr,
context,
nullptr,
nullptr, 0);
\macro QT_RESTRICTED_CAST_FROM_ASCII
Combined button and popup list for selecting options.
#define Q_STATIC_ASSERT(Condition)
#define QT_WARNING_DISABLE_MSVC(number)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction function
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage return DBusPendingCall * pending
GLsizei const GLfloat * v
[13]
GLsizei GLsizei GLchar * source
const char * unwindHandler
bool callerCanHandleTailCall
int originalArgumentsCount
bool returnValueIsUndefined
const Value * originalArguments
ExecutionContext * context
const QMetaType * metaTypes
bool isJSTypesFrame() const
void setParentFrame(CppStackFrame *parentFrame)
Heap::CallContext * callContext(Heap::ExecutionContext *ctx) const
void init(Function *v4Function, int argc, Kind kind)
void pop(EngineBase *engine)
ExecutionContext * context() const
void push(EngineBase *engine)
Heap::CallContext * callContext() const
CppStackFrame * parentFrame() const
bool isMetaTypesFrame() const
CppStackFrame * currentStackFrame
const CompiledData::Function * compiledFunction
Heap::CallContext * callContext() const
void setYield(const char *yield)
bool yieldIsIterator() const
static uint requiredJSStackFrameSize(Function *v4Function)
ReturnedValue thisObject() const
void setYieldIsIterator(bool isIter)
void setContext(ExecutionContext *context)
static uint requiredJSStackFrameSize(uint nRegisters)
const Value * argv() const
bool callerCanHandleTailCall() const
void setupJSFrame(Value *stackSpace, const Value &function, const Heap::ExecutionContext *scope, const Value &thisObject, const Value &newTarget=Value::undefinedValue())
ExecutionContext * context() const
bool isTailCalling() const
const char * yield() const
void setTailCalling(bool tailCalling)
void push(EngineBase *engine)
uint requiredJSStackFrameSize() const
void init(Function *v4Function, const Value *argv, int argc, bool callerCanHandleTailCall=false)
Value * framePointer() const
bool pendingTailCall() const
void setPendingTailCall(bool pending)
void pop(EngineBase *engine)
void setupJSFrame(Value *stackSpace, const Value &function, const Heap::ExecutionContext *scope, const Value &thisObject, const Value &newTarget, uint nFormals, uint nRegisters)
ScopedStackFrame(const Scope &scope, ExecutionContext *context)
constexpr ReturnedValue asReturnedValue() const