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>
69 using CppStackFrameBase::instructionPointer;
70 using CppStackFrameBase::v4Function;
73 this->v4Function = v4Function;
74 originalArgumentsCount = argc;
75 instructionPointer = 0;
84 int lineNumber()
const;
85 int statementNumber()
const;
87 int missingLineNumber()
const;
92 int argc()
const {
return originalArgumentsCount; }
104 Q_ASSERT(kind == Kind::JS || kind == Kind::Meta);
106 engine->currentStackFrame =
this;
116 while (
ctx->type != Heap::ExecutionContext::Type_CallContext)
118 return static_cast<Heap::CallContext *
>(
ctx);
124 using CppStackFrame::push;
125 using CppStackFrame::pop;
128 void **returnAndArgs,
const QMetaType *metaTypes,
int argc)
130 CppStackFrame::init(v4Function, argc, Kind::Meta);
131 CppStackFrameBase::thisObject = thisObject;
132 CppStackFrameBase::context =
context;
133 CppStackFrameBase::metaTypes = metaTypes;
134 CppStackFrameBase::returnAndArgs = returnAndArgs;
135 CppStackFrameBase::returnValueIsUndefined =
false;
145 void **
argv()
const {
return returnAndArgs + 1; }
154 return CppStackFrame::callContext(CppStackFrameBase::context->
d());
160 using CppStackFrame::jsFrame;
163 using CppStackFrame::unwindHandler;
164 using CppStackFrame::unwindLabel;
165 using CppStackFrame::unwindLevel;
168 bool callerCanHandleTailCall =
false)
170 CppStackFrame::init(v4Function, argc, Kind::JS);
171 CppStackFrame::originalArguments = argv;
172 CppStackFrame::yield =
nullptr;
173 CppStackFrame::unwindHandler =
nullptr;
174 CppStackFrame::yieldIsIterator =
false;
175 CppStackFrame::callerCanHandleTailCall = callerCanHandleTailCall;
176 CppStackFrame::pendingTailCall =
false;
177 CppStackFrame::isTailCalling =
false;
178 CppStackFrame::unwindLabel =
nullptr;
179 CppStackFrame::unwindLevel = 0;
185 return CallData::HeaderSize() + nRegisters;
191 return requiredJSStackFrameSize(v4Function);
195 const Value &thisObject,
const Value &newTarget = Value::undefinedValue()) {
196 setupJSFrame(stackSpace,
function, scope, thisObject, newTarget,
197 v4Function->compiledFunction->nFormals,
198 v4Function->compiledFunction->nRegisters);
202 Value *stackSpace,
const Value &function,
const Heap::ExecutionContext *scope,
205 jsFrame =
reinterpret_cast<CallData *
>(stackSpace);
207 jsFrame->context = scope->asReturnedValue();
208 jsFrame->accumulator = Encode::undefined();
209 jsFrame->thisObject = thisObject;
210 jsFrame->newTarget = newTarget;
212 uint argc =
uint(originalArgumentsCount);
215 jsFrame->setArgc(argc);
218 if (originalArguments)
219 memcpy(jsFrame->args, originalArguments, argc *
sizeof(
Value));
221 memset(jsFrame->args + argc, 0, (nRegisters - argc) *
sizeof(
Value));
223 if (v4Function && v4Function->compiledFunction) {
224 const int firstDeadZoneRegister
225 = v4Function->compiledFunction->firstTemporalDeadZoneRegister;
226 const int registerDeadZoneSize
227 = v4Function->compiledFunction->sizeOfRegisterTemporalDeadZone;
229 const Value * tdzEnd = stackSpace + firstDeadZoneRegister + registerDeadZoneSize;
230 for (
Value *
v = stackSpace + firstDeadZoneRegister;
v < tdzEnd; ++
v)
247 return CppStackFrame::callContext(
static_cast<ExecutionContext &
>(jsFrame->context).d());
251 void setTailCalling(
bool tailCalling) { CppStackFrame::isTailCalling = tailCalling; }
256 const char *
yield()
const {
return CppStackFrame::yield; }
257 void setYield(
const char *yield) { CppStackFrame::yield = yield; }
266 return jsFrame->thisObject.asReturnedValue();
272 CppStackFrame::push(
engine);
273 savedStackTop =
engine->jsStackTop;
277 CppStackFrame::pop(
engine);
278 engine->jsStackTop = savedStackTop;
294 : engine(scope.engine)
297 frame.
init(currentFrame->v4Function,
nullptr,
context,
nullptr,
nullptr, 0);
300 frame.
init(
nullptr,
nullptr,
context,
nullptr,
nullptr, 0);
\macro QT_RESTRICTED_CAST_FROM_ASCII
Combined button and popup list for selecting options.
\qmltype Particle \inqmlmodule QtQuick.Particles
#define Q_STATIC_ASSERT(Condition)
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
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent