aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2017-10-23 10:10:28 +0200
committerLars Knoll <lars.knoll@qt.io>2017-11-13 08:56:04 +0000
commita2142203ad6cdb54ec063e259b40171e13c5d4bd (patch)
tree5da2bc88d9015b5f938e7dcd118bd9c5a93c3e5c /src/qml/jsruntime
parent4d2763e425828ac35c2a03c0e675b83fa8dad668 (diff)
Finally get rid of the QV4::Function pointer in the context
Change-Id: Iad6018f67faa956d385087865fca9d73419e363e Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jsruntime')
-rw-r--r--src/qml/jsruntime/qv4argumentsobject.cpp13
-rw-r--r--src/qml/jsruntime/qv4argumentsobject_p.h5
-rw-r--r--src/qml/jsruntime/qv4context.cpp35
-rw-r--r--src/qml/jsruntime/qv4context_p.h9
-rw-r--r--src/qml/jsruntime/qv4function_p.h8
-rw-r--r--src/qml/jsruntime/qv4globalobject.cpp9
-rw-r--r--src/qml/jsruntime/qv4qmlcontext.cpp1
-rw-r--r--src/qml/jsruntime/qv4runtime.cpp6
-rw-r--r--src/qml/jsruntime/qv4script.cpp3
-rw-r--r--src/qml/jsruntime/qv4script_p.h24
10 files changed, 22 insertions, 91 deletions
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)