aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@theqtcompany.com>2015-04-10 15:17:36 +0200
committerSimon Hausmann <simon.hausmann@theqtcompany.com>2015-04-16 17:14:20 +0000
commit61f218b4e772c1d97e32ef8031de0043473ebbef (patch)
tree3e3cb0fb11c338bef3595de027a31eb95a73f545
parent496ddbfd1fe27bdddf5c15cd0ea70df452a3ec04 (diff)
Speed up object creation
Avoid copying url and file name twice into the context every time we instantiate an object. Change-Id: I1c76b80b9c44f95512af5899d760151f6dcd7bb5 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
-rw-r--r--src/qml/debugger/qqmldebugservice.cpp2
-rw-r--r--src/qml/debugger/qqmlenginedebugservice.cpp4
-rw-r--r--src/qml/qml/qqmlbinding.cpp4
-rw-r--r--src/qml/qml/qqmlcontext.cpp26
-rw-r--r--src/qml/qml/qqmlcontext_p.h8
-rw-r--r--src/qml/qml/qqmlcontextwrapper.cpp3
-rw-r--r--src/qml/qml/qqmlexpression.cpp4
-rw-r--r--src/qml/qml/qqmlinfo.cpp2
-rw-r--r--src/qml/qml/qqmlobjectcreator.cpp8
-rw-r--r--src/qml/qml/qqmltypeloader.cpp4
-rw-r--r--src/qml/qml/v8/qqmlbuiltinfunctions.cpp2
-rw-r--r--src/quick/items/qquickwindowmodule.cpp4
-rw-r--r--src/quick/util/qquickpropertychanges.cpp4
13 files changed, 45 insertions, 30 deletions
diff --git a/src/qml/debugger/qqmldebugservice.cpp b/src/qml/debugger/qqmldebugservice.cpp
index f3ba20538d..b37a7335a0 100644
--- a/src/qml/debugger/qqmldebugservice.cpp
+++ b/src/qml/debugger/qqmldebugservice.cpp
@@ -215,7 +215,7 @@ QList<QObject*> QQmlDebugService::objectForLocationInfo(const QString &filename,
} else {
QQmlData *ddata = QQmlData::get(iter.value());
if (ddata && ddata->outerContext) {
- if (QFileInfo(ddata->outerContext->urlString).fileName() == filename &&
+ if (QFileInfo(ddata->outerContext->urlString()).fileName() == filename &&
ddata->lineNumber == lineNumber &&
ddata->columnNumber >= columnNumber) {
objects << *iter;
diff --git a/src/qml/debugger/qqmlenginedebugservice.cpp b/src/qml/debugger/qqmlenginedebugservice.cpp
index b0c0995a44..da01d00f17 100644
--- a/src/qml/debugger/qqmlenginedebugservice.cpp
+++ b/src/qml/debugger/qqmlenginedebugservice.cpp
@@ -391,7 +391,7 @@ QQmlEngineDebugService::objectData(QObject *object)
QQmlData *ddata = QQmlData::get(object);
QQmlObjectData rv;
if (ddata && ddata->outerContext) {
- rv.url = ddata->outerContext->url;
+ rv.url = ddata->outerContext->url();
rv.lineNumber = ddata->lineNumber;
rv.columnNumber = ddata->columnNumber;
} else {
@@ -762,7 +762,7 @@ bool QQmlEngineDebugService::setMethodBody(int objectId, const QString &method,
int lineNumber = vmeMetaObject->vmeMethodLineNumber(prop->coreIndex);
QV4::ExecutionEngine *v4 = QV8Engine::getV4(qmlEngine(object)->handle());
QV4::Scope scope(v4);
- QV4::ScopedValue v(scope, QQmlExpressionPrivate::evalFunction(contextData, object, jsfunction, contextData->url.toString(), lineNumber));
+ QV4::ScopedValue v(scope, QQmlExpressionPrivate::evalFunction(contextData, object, jsfunction, contextData->urlString(), lineNumber));
vmeMetaObject->setVmeMethod(prop->coreIndex, v);
return true;
}
diff --git a/src/qml/qml/qqmlbinding.cpp b/src/qml/qml/qqmlbinding.cpp
index 0db696394c..f223d099e4 100644
--- a/src/qml/qml/qqmlbinding.cpp
+++ b/src/qml/qml/qqmlbinding.cpp
@@ -93,8 +93,8 @@ QQmlBinding::QQmlBinding(const QQmlScriptString &script, QObject *obj, QQmlConte
QQmlContextData *ctxtdata = QQmlContextData::get(scriptPrivate->context);
QQmlEnginePrivate *engine = QQmlEnginePrivate::get(scriptPrivate->context->engine());
- if (engine && ctxtdata && !ctxtdata->url.isEmpty() && ctxtdata->typeCompilationUnit) {
- url = ctxtdata->url.toString();
+ if (engine && ctxtdata && !ctxtdata->urlString().isEmpty() && ctxtdata->typeCompilationUnit) {
+ url = ctxtdata->urlString();
if (scriptPrivate->bindingId != QQmlBinding::Invalid)
runtimeFunction = ctxtdata->typeCompilationUnit->runtimeFunctions.at(scriptPrivate->bindingId);
}
diff --git a/src/qml/qml/qqmlcontext.cpp b/src/qml/qml/qqmlcontext.cpp
index e641226b90..3e6ca6667e 100644
--- a/src/qml/qml/qqmlcontext.cpp
+++ b/src/qml/qml/qqmlcontext.cpp
@@ -426,14 +426,14 @@ QUrl QQmlContextData::resolvedUrl(const QUrl &src)
if (src.isRelative() && !src.isEmpty()) {
if (ctxt) {
while(ctxt) {
- if(ctxt->url.isValid())
+ if (ctxt->url().isValid())
break;
else
ctxt = ctxt->parent;
}
if (ctxt)
- resolved = ctxt->url.resolved(src);
+ resolved = ctxt->url().resolved(src);
else if (engine)
resolved = engine->baseUrl().resolved(src);
}
@@ -462,8 +462,8 @@ void QQmlContext::setBaseUrl(const QUrl &baseUrl)
{
Q_D(QQmlContext);
- d->data->url = baseUrl;
- d->data->urlString = baseUrl.toString();
+ d->data->baseUrl = baseUrl;
+ d->data->baseUrlString = baseUrl.toString();
}
/*!
@@ -474,11 +474,11 @@ QUrl QQmlContext::baseUrl() const
{
Q_D(const QQmlContext);
const QQmlContextData* data = d->data;
- while (data && data->url.isEmpty())
+ while (data && data->url().isEmpty())
data = data->parent;
if (data)
- return data->url;
+ return data->url();
else
return QUrl();
}
@@ -816,4 +816,18 @@ QV4::IdentifierHash<int> &QQmlContextData::propertyNames() const
return propertyNameCache;
}
+QUrl QQmlContextData::url() const
+{
+ if (typeCompilationUnit)
+ return typeCompilationUnit->url();
+ return baseUrl;
+}
+
+QString QQmlContextData::urlString() const
+{
+ if (typeCompilationUnit)
+ return typeCompilationUnit->fileName();
+ return baseUrlString;
+}
+
QT_END_NAMESPACE
diff --git a/src/qml/qml/qqmlcontext_p.h b/src/qml/qml/qqmlcontext_p.h
index ddf7d5de75..40bd310cb7 100644
--- a/src/qml/qml/qqmlcontext_p.h
+++ b/src/qml/qml/qqmlcontext_p.h
@@ -162,9 +162,11 @@ public:
// Any script blocks that exist on this context
QV4::PersistentValue importedScripts; // This is a JS Array
- // Context base url
- QUrl url;
- QString urlString;
+ QUrl baseUrl;
+ QString baseUrlString;
+
+ QUrl url() const;
+ QString urlString() const;
// List of imports that apply to this context
QQmlTypeNameCache *imports;
diff --git a/src/qml/qml/qqmlcontextwrapper.cpp b/src/qml/qml/qqmlcontextwrapper.cpp
index 7aca9ad6c2..b2d03bc188 100644
--- a/src/qml/qml/qqmlcontextwrapper.cpp
+++ b/src/qml/qml/qqmlcontextwrapper.cpp
@@ -82,7 +82,8 @@ ReturnedValue QmlContextWrapper::urlScope(ExecutionEngine *v4, const QUrl &url)
Scope scope(v4);
QQmlContextData *context = new QQmlContextData;
- context->url = url;
+ context->baseUrl = url;
+ context->baseUrlString = url.toString();
context->isInternal = true;
context->isJSContext = true;
diff --git a/src/qml/qml/qqmlexpression.cpp b/src/qml/qml/qqmlexpression.cpp
index 18f882e1e0..35e0bc8c64 100644
--- a/src/qml/qml/qqmlexpression.cpp
+++ b/src/qml/qml/qqmlexpression.cpp
@@ -149,8 +149,8 @@ QQmlExpression::QQmlExpression(const QQmlScriptString &script, QQmlContext *ctxt
if (scriptPrivate->context) {
QQmlContextData *ctxtdata = QQmlContextData::get(scriptPrivate->context);
QQmlEnginePrivate *engine = QQmlEnginePrivate::get(scriptPrivate->context->engine());
- if (engine && ctxtdata && !ctxtdata->url.isEmpty() && ctxtdata->typeCompilationUnit) {
- d->url = ctxtdata->url.toString();
+ if (engine && ctxtdata && !ctxtdata->urlString().isEmpty() && ctxtdata->typeCompilationUnit) {
+ d->url = ctxtdata->urlString();
d->line = scriptPrivate->lineNumber;
d->column = scriptPrivate->columnNumber;
diff --git a/src/qml/qml/qqmlinfo.cpp b/src/qml/qml/qqmlinfo.cpp
index 85979b8dc0..b9f96a724c 100644
--- a/src/qml/qml/qqmlinfo.cpp
+++ b/src/qml/qml/qqmlinfo.cpp
@@ -140,7 +140,7 @@ QQmlInfo::~QQmlInfo()
QQmlData *ddata = QQmlData::get(object, false);
if (ddata && ddata->outerContext) {
- error.setUrl(ddata->outerContext->url);
+ error.setUrl(ddata->outerContext->url());
error.setLine(ddata->lineNumber);
error.setColumn(ddata->columnNumber);
}
diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp
index 6b815677a3..e7a08773f4 100644
--- a/src/qml/qml/qqmlobjectcreator.cpp
+++ b/src/qml/qml/qqmlobjectcreator.cpp
@@ -175,8 +175,6 @@ QObject *QQmlObjectCreator::create(int subComponentIndex, QObject *parent, QQmlI
context = new QQmlContextData;
context->isInternal = true;
- context->url = compiledData->url();
- context->urlString = compiledData->fileName();
context->imports = compiledData->importCache;
context->imports->addref();
context->typeCompilationUnit = compiledData->compilationUnit;
@@ -1050,7 +1048,7 @@ QObject *QQmlObjectCreator::createInstance(int index, QObject *parent, bool isCo
isComponent = true;
QQmlComponent *component = new QQmlComponent(engine, compiledData, index, parent);
Q_QML_OC_PROFILE(sharedState->profiler, profiler.update(QStringLiteral("<component>"),
- context->url, obj->location.line, obj->location.column));
+ context->url(), obj->location.line, obj->location.column));
QQmlComponentPrivate::get(component)->creationContext = context;
instance = component;
ddata = QQmlData::get(instance, /*create*/true);
@@ -1061,7 +1059,7 @@ QObject *QQmlObjectCreator::createInstance(int index, QObject *parent, bool isCo
QQmlType *type = typeRef->type;
if (type) {
Q_QML_OC_PROFILE(sharedState->profiler, profiler.update(type->qmlTypeName(),
- context->url, obj->location.line, obj->location.column));
+ context->url(), obj->location.line, obj->location.column));
instance = type->create();
if (!instance) {
recordError(obj->location, tr("Unable to create object of type %1").arg(stringAt(obj->inheritedTypeNameIndex)));
@@ -1084,7 +1082,7 @@ QObject *QQmlObjectCreator::createInstance(int index, QObject *parent, bool isCo
} else {
Q_ASSERT(typeRef->component);
Q_QML_OC_PROFILE(sharedState->profiler, profiler.update(typeRef->component->fileName(),
- context->url, obj->location.line, obj->location.column));
+ context->url(), obj->location.line, obj->location.column));
if (typeRef->component->compilationUnit->data->isSingleton())
{
recordError(obj->location, tr("Composite Singleton Type %1 is not creatable").arg(stringAt(obj->inheritedTypeNameIndex)));
diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp
index 0bf8043cdb..d713e9ee03 100644
--- a/src/qml/qml/qqmltypeloader.cpp
+++ b/src/qml/qml/qqmltypeloader.cpp
@@ -2478,8 +2478,8 @@ QV4::PersistentValue QQmlScriptData::scriptValueForContext(QQmlContextData *pare
ctxt->isPragmaLibraryContext = true;
else
ctxt->isPragmaLibraryContext = parentCtxt->isPragmaLibraryContext;
- ctxt->url = url;
- ctxt->urlString = urlString;
+ ctxt->baseUrl = url;
+ ctxt->baseUrlString = urlString;
// For backward compatibility, if there are no imports, we need to use the
// imports from the parent context. See QTBUG-17518.
diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp
index 0522e4c0ed..58542e4479 100644
--- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp
+++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp
@@ -1722,7 +1722,7 @@ ReturnedValue GlobalExtensions::method_qsTr(CallContext *ctx)
QV8Engine *v8engine = ctx->d()->engine->v8Engine;
QString context;
if (QQmlContextData *ctxt = v8engine->callingContext()) {
- QString path = ctxt->url.toString();
+ QString path = ctxt->urlString();
int lastSlash = path.lastIndexOf(QLatin1Char('/'));
int lastDot = path.lastIndexOf(QLatin1Char('.'));
int length = lastDot - (lastSlash + 1);
diff --git a/src/quick/items/qquickwindowmodule.cpp b/src/quick/items/qquickwindowmodule.cpp
index 414f068285..5c66a2ef84 100644
--- a/src/quick/items/qquickwindowmodule.cpp
+++ b/src/quick/items/qquickwindowmodule.cpp
@@ -143,9 +143,9 @@ void QQuickWindowQmlImpl::setWindowVisibility()
error.setObject(this);
const QQmlContextData* urlContext = data->context;
- while (urlContext && urlContext->url.isEmpty())
+ while (urlContext && urlContext->url().isEmpty())
urlContext = urlContext->parent;
- error.setUrl(urlContext ? urlContext->url : QUrl());
+ error.setUrl(urlContext ? urlContext->url() : QUrl());
QString objectId = data->context->findObjectId(this);
if (!objectId.isEmpty())
diff --git a/src/quick/util/qquickpropertychanges.cpp b/src/quick/util/qquickpropertychanges.cpp
index 4e96d90fde..6c333c6b13 100644
--- a/src/quick/util/qquickpropertychanges.cpp
+++ b/src/quick/util/qquickpropertychanges.cpp
@@ -295,8 +295,8 @@ void QQuickPropertyChangesPrivate::decodeBinding(const QString &propertyPrefix,
int column = -1;
QQmlData *ddata = QQmlData::get(q);
- if (ddata && ddata->outerContext && !ddata->outerContext->url.isEmpty()) {
- url = ddata->outerContext->url;
+ if (ddata && ddata->outerContext && !ddata->outerContext->url().isEmpty()) {
+ url = ddata->outerContext->url();
line = ddata->lineNumber;
column = ddata->columnNumber;
}