diff options
-rw-r--r-- | src/plugins/qmltooling/qmldbg_nativedebugger/qqmlnativedebugservice.cpp | 5 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4argumentsobject.cpp | 13 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4argumentsobject_p.h | 5 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4context.cpp | 35 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4context_p.h | 9 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4function_p.h | 8 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4globalobject.cpp | 9 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4qmlcontext.cpp | 1 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4script.cpp | 3 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4script_p.h | 24 |
11 files changed, 24 insertions, 94 deletions
diff --git a/src/plugins/qmltooling/qmldbg_nativedebugger/qqmlnativedebugservice.cpp b/src/plugins/qmltooling/qmldbg_nativedebugger/qqmlnativedebugservice.cpp index b6ae20a02e..eeedb59ce6 100644 --- a/src/plugins/qmltooling/qmldbg_nativedebugger/qqmlnativedebugservice.cpp +++ b/src/plugins/qmltooling/qmldbg_nativedebugger/qqmlnativedebugservice.cpp @@ -656,9 +656,8 @@ void NativeDebugger::aboutToThrow() QV4::Function *NativeDebugger::getFunction() const { - QV4::ExecutionContext *context = m_engine->currentContext(); - if (QV4::Function *function = context->getFunction()) - return function; + if (m_engine->currentStackFrame) + return m_engine->currentStackFrame->v4Function; else return m_engine->globalCode; } diff --git a/src/qml/jsruntime/qv4argumentsobject.cpp b/src/qml/jsruntime/qv4argumentsobject.cpp index 5833e39561..4d34099c73 100644 --- a/src/qml/jsruntime/qv4argumentsobject.cpp +++ b/src/qml/jsruntime/qv4argumentsobject.cpp @@ -47,13 +47,14 @@ using namespace QV4; DEFINE_OBJECT_VTABLE(ArgumentsObject); -void Heap::ArgumentsObject::init(QV4::CallContext *context, bool strict) +void Heap::ArgumentsObject::init(QV4::CallContext *context, int nFormals, bool strict) { ExecutionEngine *v4 = internalClass->engine; Object::init(); fullyCreated = false; isStrict = strict; + this->nFormals = nFormals; this->context.set(v4, context->d()); Q_ASSERT(vtable() == QV4::ArgumentsObject::staticVTable()); @@ -86,8 +87,8 @@ void ArgumentsObject::fullyCreate() Scope scope(engine()); - uint argCount = context()->argc(); - uint numAccessors = qMin(context()->formalParameterCount(), argCount); + int argCount = context()->argc(); + uint numAccessors = qMin(d()->nFormals, argCount); ArrayData::realloc(this, Heap::ArrayData::Sparse, argCount, true); scope.engine->requireArgumentsAccessors(numAccessors); @@ -100,7 +101,7 @@ void ArgumentsObject::fullyCreate() } } arrayPut(numAccessors, context()->args() + numAccessors, argCount - numAccessors); - for (uint i = numAccessors; i < argCount; ++i) + for (int i = int(numAccessors); i < argCount; ++i) setArrayAttributes(i, Attr_Data); d()->fullyCreated = true; @@ -113,7 +114,7 @@ bool ArgumentsObject::defineOwnProperty(ExecutionEngine *engine, uint index, con Scope scope(engine); ScopedProperty map(scope); PropertyAttributes mapAttrs; - uint numAccessors = qMin(context()->formalParameterCount(), static_cast<uint>(context()->argc())); + uint numAccessors = qMin(d()->nFormals, context()->argc()); bool isMapped = false; if (arrayData() && index < numAccessors && arrayData()->attributes(index).isAccessor() && @@ -196,7 +197,7 @@ PropertyAttributes ArgumentsObject::queryIndexed(const Managed *m, uint index) if (args->fullyCreated()) return Object::queryIndexed(m, index); - uint numAccessors = qMin((int)args->context()->formalParameterCount(), args->context()->argc()); + uint numAccessors = qMin(args->d()->nFormals, args->context()->argc()); uint argCount = args->context()->argc(); if (index >= argCount) return PropertyAttributes(); diff --git a/src/qml/jsruntime/qv4argumentsobject_p.h b/src/qml/jsruntime/qv4argumentsobject_p.h index cd270e8b47..a7a85743fc 100644 --- a/src/qml/jsruntime/qv4argumentsobject_p.h +++ b/src/qml/jsruntime/qv4argumentsobject_p.h @@ -79,7 +79,8 @@ DECLARE_HEAP_OBJECT(ArgumentsSetterFunction, FunctionObject) { Member(class, Pointer, CallContext *, context) \ Member(class, Pointer, MemberData *, mappedArguments) \ Member(class, NoMark, bool, fullyCreated) \ - Member(class, NoMark, bool, isStrict) + Member(class, NoMark, bool, isStrict) \ + Member(class, NoMark, int, nFormals) DECLARE_HEAP_OBJECT(ArgumentsObject, Object) { DECLARE_MARK_TABLE(ArgumentsObject); @@ -88,7 +89,7 @@ DECLARE_HEAP_OBJECT(ArgumentsObject, Object) { CalleePropertyIndex = 1, CallerPropertyIndex = 3 }; - void init(QV4::CallContext *context, bool strict); + void init(QV4::CallContext *context, int nFormals, bool strict); }; } diff --git a/src/qml/jsruntime/qv4context.cpp b/src/qml/jsruntime/qv4context.cpp index 9d7cafabc8..86b1f0eb2c 100644 --- a/src/qml/jsruntime/qv4context.cpp +++ b/src/qml/jsruntime/qv4context.cpp @@ -65,8 +65,6 @@ Heap::CallContext *ExecutionContext::newCallContext(Heap::ExecutionContext *oute Heap::CallContext *c = v4->memoryManager->allocManaged<CallContext>(requiredMemory, function->internalClass); c->init(); - c->v4Function = function; - c->outer.set(v4, outer); c->function.set(v4, static_cast<Heap::FunctionObject *>(callData->function.m())); @@ -89,8 +87,6 @@ Heap::ExecutionContext *ExecutionContext::newWithContext(Heap::Object *with) c->outer.set(engine(), d()); c->activation.set(engine(), with); - c->v4Function = d()->v4Function; - return c; } @@ -149,7 +145,6 @@ void Heap::CatchContext::init(ExecutionContext *outerContext, String *exceptionV { Heap::ExecutionContext::init(Heap::ExecutionContext::Type_CatchContext); outer.set(internalClass->engine, outerContext); - v4Function = outer->v4Function; this->exceptionVarName.set(internalClass->engine, exceptionVarName); this->exceptionValue.set(internalClass->engine, exceptionValue); @@ -193,7 +188,7 @@ bool ExecutionContext::deleteProperty(String *name) } } - return !d()->v4Function->isStrict(); + return !engine()->currentStackFrame->v4Function->isStrict(); } ExecutionContext::Error ExecutionContext::setProperty(String *name, const Value &value) @@ -226,12 +221,10 @@ ExecutionContext::Error ExecutionContext::setProperty(String *name, const Value } case Heap::ExecutionContext::Type_CallContext: { Heap::CallContext *c = static_cast<Heap::CallContext *>(ctx); - if (c->v4Function) { - uint index = c->internalClass->find(id); - if (index < UINT_MAX) { - static_cast<Heap::CallContext *>(c)->locals.set(v4, index, value); - return NoError; - } + uint index = c->internalClass->find(id); + if (index < UINT_MAX) { + static_cast<Heap::CallContext *>(c)->locals.set(v4, index, value); + return NoError; } } Q_FALLTHROUGH(); @@ -353,24 +346,6 @@ ReturnedValue ExecutionContext::getPropertyAndBase(String *name, Value *base) return engine()->throwReferenceError(*name); } -Function *ExecutionContext::getFunction() const -{ - Scope scope(engine()); - ScopedContext it(scope, this->d()); - for (; it; it = it->d()->outer) { - if (const CallContext *callCtx = it->asCallContext()) - return callCtx->d()->v4Function; - else if (it->d()->type == Heap::ExecutionContext::Type_CatchContext || - it->d()->type == Heap::ExecutionContext::Type_WithContext) - continue; // look in the parent context for a FunctionObject - else - break; - } - - return 0; -} - - void Heap::CallContext::setArg(uint index, Value v) { locals.set(internalClass->engine, locals.size + index, v); diff --git a/src/qml/jsruntime/qv4context_p.h b/src/qml/jsruntime/qv4context_p.h index 7ed3320f8a..34a406e8e0 100644 --- a/src/qml/jsruntime/qv4context_p.h +++ b/src/qml/jsruntime/qv4context_p.h @@ -117,8 +117,7 @@ struct QmlContext; #define ExecutionContextMembers(class, Member) \ Member(class, Pointer, ExecutionContext *, outer) \ - Member(class, Pointer, Object *, activation) \ - Member(class, NoMark, QV4::Function *, v4Function) \ + Member(class, Pointer, Object *, activation) DECLARE_HEAP_OBJECT(ExecutionContext, Base) { DECLARE_MARK_TABLE(ExecutionContext); @@ -150,7 +149,6 @@ Q_STATIC_ASSERT(sizeof(ExecutionContext) == sizeof(Base) + sizeof(ExecutionConte Q_STATIC_ASSERT(std::is_standard_layout<ExecutionContextData>::value); Q_STATIC_ASSERT(offsetof(ExecutionContextData, outer) == 0); Q_STATIC_ASSERT(offsetof(ExecutionContextData, activation) == offsetof(ExecutionContextData, outer) + QT_POINTER_SIZE); -Q_STATIC_ASSERT(offsetof(ExecutionContextData, v4Function) == offsetof(ExecutionContextData, activation) + QT_POINTER_SIZE); #define CallContextMembers(class, Member) \ Member(class, Pointer, FunctionObject *, function) \ @@ -171,8 +169,6 @@ DECLARE_HEAP_OBJECT(CallContext, ExecutionContext) { return locals.data() + locals.size; } void setArg(uint index, Value v); - - inline unsigned int formalParameterCount() const; }; V4_ASSERT_IS_TRIVIAL(CallContext) Q_STATIC_ASSERT(std::is_standard_layout<CallContextData>::value); @@ -228,9 +224,6 @@ struct Q_QML_EXPORT ExecutionContext : public Managed inline CallContext *asCallContext(); inline const CallContext *asCallContext() const; - - Function *getFunction() const; - }; struct Q_QML_EXPORT CallContext : public ExecutionContext diff --git a/src/qml/jsruntime/qv4function_p.h b/src/qml/jsruntime/qv4function_p.h index 5ecbd0a359..03529407ab 100644 --- a/src/qml/jsruntime/qv4function_p.h +++ b/src/qml/jsruntime/qv4function_p.h @@ -97,14 +97,6 @@ struct Q_QML_EXPORT Function { } }; - -inline unsigned int Heap::CallContext::formalParameterCount() const -{ - Q_ASSERT(v4Function); - return v4Function->nFormals; -} - - } QT_END_NAMESPACE diff --git a/src/qml/jsruntime/qv4globalobject.cpp b/src/qml/jsruntime/qv4globalobject.cpp index a015461c47..9ba65b2ce1 100644 --- a/src/qml/jsruntime/qv4globalobject.cpp +++ b/src/qml/jsruntime/qv4globalobject.cpp @@ -359,7 +359,7 @@ ReturnedValue EvalFunction::evalCall(const Value *, const Value *argv, int argc, return argv[0].asReturnedValue(); const QString code = scode->toQString(); - bool inheritContext = !ctx->d()->v4Function->isStrict(); + bool inheritContext = !isStrict; Script script(ctx, QV4::Compiler::EvalCode, code, QStringLiteral("eval code")); script.strictMode = (directCall && isStrict); @@ -372,7 +372,7 @@ ReturnedValue EvalFunction::evalCall(const Value *, const Value *argv, int argc, if (!function) return Encode::undefined(); - if (function->isStrict() || (ctx->d()->v4Function->isStrict())) { + if (function->isStrict() || isStrict) { ScopedFunctionObject e(scope, FunctionObject::createScriptFunction(ctx, function)); JSCallData jsCallData(scope, 0); if (directCall) @@ -382,11 +382,6 @@ ReturnedValue EvalFunction::evalCall(const Value *, const Value *argv, int argc, return e->call(jsCallData); } - ContextStateSaver stateSaver(scope, ctx); - - // set the correct v4 function for the context - ctx->d()->v4Function = function; - JSCallData jsCallData(scope); *jsCallData->thisObject = scope.engine->currentStackFrame->thisObject(); CallData *cData = jsCallData.callData(); diff --git a/src/qml/jsruntime/qv4qmlcontext.cpp b/src/qml/jsruntime/qv4qmlcontext.cpp index ce0c89be57..5a165b2309 100644 --- a/src/qml/jsruntime/qv4qmlcontext.cpp +++ b/src/qml/jsruntime/qv4qmlcontext.cpp @@ -296,7 +296,6 @@ void Heap::QmlContext::init(QV4::ExecutionContext *outerContext, QV4::QQmlContex { Heap::ExecutionContext::init(Heap::ExecutionContext::Type_QmlContext); outer.set(internalClass->engine, outerContext->d()); - v4Function = outer->v4Function; this->activation.set(internalClass->engine, qml->d()); } diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index f6a8f9426c..9728f5454c 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -1222,7 +1222,8 @@ QV4::ReturnedValue Runtime::method_createMappedArgumentsObject(ExecutionEngine * Q_ASSERT(engine->currentContext()->d()->type == Heap::ExecutionContext::Type_CallContext); QV4::CallContext *c = static_cast<QV4::CallContext *>(&engine->currentStackFrame->jsFrame->context); QV4::InternalClass *ic = engine->internalClasses[EngineBase::Class_ArgumentsObject]; - return engine->memoryManager->allocObject<ArgumentsObject>(ic, engine->objectPrototype(), c, false)->asReturnedValue(); + int nFormals = engine->currentStackFrame->v4Function->nFormals; + return engine->memoryManager->allocObject<ArgumentsObject>(ic, engine->objectPrototype(), c, nFormals, false)->asReturnedValue(); } QV4::ReturnedValue Runtime::method_createUnmappedArgumentsObject(ExecutionEngine *engine) @@ -1230,7 +1231,8 @@ QV4::ReturnedValue Runtime::method_createUnmappedArgumentsObject(ExecutionEngine Q_ASSERT(engine->currentContext()->d()->type == Heap::ExecutionContext::Type_CallContext); QV4::CallContext *c = static_cast<QV4::CallContext *>(&engine->currentStackFrame->jsFrame->context); QV4::InternalClass *ic = engine->internalClasses[EngineBase::Class_StrictArgumentsObject]; - return engine->memoryManager->allocObject<ArgumentsObject>(ic, engine->objectPrototype(), c, true)->asReturnedValue(); + int nFormals = engine->currentStackFrame->v4Function->nFormals; + return engine->memoryManager->allocObject<ArgumentsObject>(ic, engine->objectPrototype(), c, nFormals, true)->asReturnedValue(); } ReturnedValue Runtime::method_loadQmlContext(NoThrowEngine *engine) diff --git a/src/qml/jsruntime/qv4script.cpp b/src/qml/jsruntime/qv4script.cpp index c3b19ac77c..7ac46bf594 100644 --- a/src/qml/jsruntime/qv4script.cpp +++ b/src/qml/jsruntime/qv4script.cpp @@ -149,9 +149,6 @@ ReturnedValue Script::run() if (qmlContext.isUndefined()) { TemporaryAssignment<Function*> savedGlobalCode(engine->globalCode, vmFunction); - ContextStateSaver stateSaver(valueScope, context); - context->d()->v4Function = vmFunction; - QV4::JSCallData jsCall(valueScope); jsCall->thisObject = engine->globalObject; QV4::CallData *cData = jsCall.callData(); diff --git a/src/qml/jsruntime/qv4script_p.h b/src/qml/jsruntime/qv4script_p.h index f3a4853fa3..158d21c69d 100644 --- a/src/qml/jsruntime/qv4script_p.h +++ b/src/qml/jsruntime/qv4script_p.h @@ -64,30 +64,6 @@ class QQmlContextData; namespace QV4 { -struct ContextStateSaver { - Value *savedContext; - QV4::Function *v4Function; - - ContextStateSaver(const Scope &scope, ExecutionContext *context) - : savedContext(scope.alloc(1)) - , v4Function(context->d()->v4Function) - { - savedContext->setM(context->d()); - } - ContextStateSaver(const Scope &scope, Heap::ExecutionContext *context) - : savedContext(scope.alloc(1)) - , v4Function(context->v4Function) - { - savedContext->setM(context); - } - - ~ContextStateSaver() - { - Heap::ExecutionContext *ctx = static_cast<Heap::ExecutionContext *>(savedContext->m()); - ctx->v4Function = v4Function; - } -}; - struct Q_QML_EXPORT Script { Script(ExecutionContext *scope, QV4::Compiler::CompilationMode mode, const QString &sourceCode, const QString &source = QString(), int line = 1, int column = 0) : sourceFile(source), line(line), column(column), sourceCode(sourceCode) |