From 77449db6e086e8ac6594c432fede027656be0da0 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Fri, 27 Jul 2018 11:36:43 +0200 Subject: Encapsulate access to CompiledData::Object and CompiledData::Import This will make it easier to move the data out of CompiledData::Unit and into a separate data structure. Change-Id: I32e6233a66f2279b44cc06ef7c3505db4a565f98 Reviewed-by: Lars Knoll --- src/qml/compiler/qqmlirbuilder.cpp | 6 +++--- src/qml/compiler/qqmlpropertyvalidator.cpp | 10 +++++----- src/qml/compiler/qqmltypecompiler.cpp | 2 +- src/qml/compiler/qv4compileddata.cpp | 8 ++++---- src/qml/compiler/qv4compileddata_p.h | 8 +++++--- src/qml/qml/qqmlcontext.cpp | 2 +- src/qml/qml/qqmlobjectcreator.cpp | 16 ++++++++-------- src/qml/qml/qqmltypeloader.cpp | 14 +++++++------- src/qml/qml/qqmlvmemetaobject.cpp | 2 +- src/qml/types/qqmllistmodel.cpp | 10 ++++------ src/qml/types/qqmllistmodel_p.h | 2 +- 11 files changed, 40 insertions(+), 40 deletions(-) (limited to 'src/qml') diff --git a/src/qml/compiler/qqmlirbuilder.cpp b/src/qml/compiler/qqmlirbuilder.cpp index bc877f51e1..e544559e03 100644 --- a/src/qml/compiler/qqmlirbuilder.cpp +++ b/src/qml/compiler/qqmlirbuilder.cpp @@ -1801,7 +1801,7 @@ void QmlUnitGenerator::generate(Document &output, const QV4::CompiledData::Depen qDebug() << " " << objectsSize << "for" << qmlUnit->nObjects << "objects"; quint32 totalBindingCount = 0; for (quint32 i = 0; i < qmlUnit->nObjects; ++i) - totalBindingCount += qmlUnit->objectAt(i)->nBindings; + totalBindingCount += qmlUnit->objectAtInternal(i)->nBindings; qDebug() << " " << totalBindingCount << "bindings"; quint32 totalCodeSize = 0; for (quint32 i = 0; i < qmlUnit->functionTableSize; ++i) @@ -2389,7 +2389,7 @@ void IRLoader::load() output->jsGenerator.stringTable.initializeFromBackingUnit(unit); for (quint32 i = 0; i < unit->nImports; ++i) - output->imports << unit->importAt(i); + output->imports << unit->importAtInternal(i); if (unit->flags & QV4::CompiledData::Unit::IsSingleton) { QmlIR::Pragma *p = New(); @@ -2399,7 +2399,7 @@ void IRLoader::load() } for (uint i = 0; i < unit->nObjects; ++i) { - const QV4::CompiledData::Object *serializedObject = unit->objectAt(i); + const QV4::CompiledData::Object *serializedObject = unit->objectAtInternal(i); QmlIR::Object *object = loadObject(serializedObject); output->objects.append(object); } diff --git a/src/qml/compiler/qqmlpropertyvalidator.cpp b/src/qml/compiler/qqmlpropertyvalidator.cpp index 99bd525d47..4cb922ca8d 100644 --- a/src/qml/compiler/qqmlpropertyvalidator.cpp +++ b/src/qml/compiler/qqmlpropertyvalidator.cpp @@ -54,7 +54,7 @@ QQmlPropertyValidator::QQmlPropertyValidator(QQmlEnginePrivate *enginePrivate, c , propertyCaches(compilationUnit->propertyCaches) , bindingPropertyDataPerObject(&compilationUnit->bindingPropertyDataPerObject) { - bindingPropertyDataPerObject->resize(qmlUnit->nObjects); + bindingPropertyDataPerObject->resize(compilationUnit->objectCount()); } QVector QQmlPropertyValidator::validate() @@ -82,7 +82,7 @@ struct BindingFinder QVector QQmlPropertyValidator::validateObject(int objectIndex, const QV4::CompiledData::Binding *instantiatingBinding, bool populatingValueTypeGroupProperty) const { - const QV4::CompiledData::Object *obj = qmlUnit->objectAt(objectIndex); + const QV4::CompiledData::Object *obj = compilationUnit->objectAt(objectIndex); if (obj->flags & QV4::CompiledData::Object::IsComponent) { Q_ASSERT(obj->nBindings == 1); @@ -628,7 +628,7 @@ QQmlCompileError QQmlPropertyValidator::validateObjectBinding(QQmlPropertyData * bool isValueSource = false; bool isPropertyInterceptor = false; - const QV4::CompiledData::Object *targetObject = qmlUnit->objectAt(binding->value.objectIndex); + const QV4::CompiledData::Object *targetObject = compilationUnit->objectAt(binding->value.objectIndex); if (auto *typeRef = resolvedTypes.value(targetObject->inheritedTypeNameIndex)) { QQmlRefPointer cache = typeRef->createPropertyCache(QQmlEnginePrivate::get(enginePrivate)); const QMetaObject *mo = cache->firstCppMetaObject(); @@ -666,7 +666,7 @@ QQmlCompileError QQmlPropertyValidator::validateObjectBinding(QQmlPropertyData * } } return noError; - } else if (qmlUnit->objectAt(binding->value.objectIndex)->flags & QV4::CompiledData::Object::IsComponent) { + } else if (compilationUnit->objectAt(binding->value.objectIndex)->flags & QV4::CompiledData::Object::IsComponent) { return noError; } else if (binding->flags & QV4::CompiledData::Binding::IsSignalHandlerObject && property->isFunction()) { return noError; @@ -694,7 +694,7 @@ QQmlCompileError QQmlPropertyValidator::validateObjectBinding(QQmlPropertyData * if (!isAssignable) { return QQmlCompileError(binding->valueLocation, tr("Cannot assign object of type \"%1\" to property of type \"%2\" as the former is neither the same as the latter nor a sub-class of it.") - .arg(stringAt(qmlUnit->objectAt(binding->value.objectIndex)->inheritedTypeNameIndex)).arg(QLatin1String(QMetaType::typeName(property->propType())))); + .arg(stringAt(compilationUnit->objectAt(binding->value.objectIndex)->inheritedTypeNameIndex)).arg(QLatin1String(QMetaType::typeName(property->propType())))); } } return noError; diff --git a/src/qml/compiler/qqmltypecompiler.cpp b/src/qml/compiler/qqmltypecompiler.cpp index c4a3d47f44..44ffc864a8 100644 --- a/src/qml/compiler/qqmltypecompiler.cpp +++ b/src/qml/compiler/qqmltypecompiler.cpp @@ -168,7 +168,7 @@ QQmlRefPointer QQmlTypeCompiler::compile() compilationUnit->typeNameCache = typeNameCache; compilationUnit->resolvedTypes = resolvedTypes; compilationUnit->propertyCaches = std::move(m_propertyCaches); - Q_ASSERT(compilationUnit->propertyCaches.count() == static_cast(compilationUnit->unitData()->nObjects)); + Q_ASSERT(compilationUnit->propertyCaches.count() == static_cast(compilationUnit->objectCount())); if (errors.isEmpty()) return compilationUnit; diff --git a/src/qml/compiler/qv4compileddata.cpp b/src/qml/compiler/qv4compileddata.cpp index af0cfedf5b..767e8dfeb3 100644 --- a/src/qml/compiler/qv4compileddata.cpp +++ b/src/qml/compiler/qv4compileddata.cpp @@ -270,10 +270,10 @@ void CompilationUnit::markObjects(QV4::MarkStack *markStack) IdentifierHash CompilationUnit::createNamedObjectsPerComponent(int componentObjectIndex) { IdentifierHash namedObjectCache(engine); - const CompiledData::Object *component = data->objectAt(componentObjectIndex); + const CompiledData::Object *component = objectAt(componentObjectIndex); const quint32_le *namedObjectIndexPtr = component->namedObjectsInComponentTable(); for (quint32 i = 0; i < component->nNamedObjectsInComponent; ++i, ++namedObjectIndexPtr) { - const CompiledData::Object *namedObject = data->objectAt(*namedObjectIndexPtr); + const CompiledData::Object *namedObject = objectAt(*namedObjectIndexPtr); namedObjectCache.add(runtimeStrings[namedObject->idNameIndex], namedObject->id); } return *namedObjectsPerComponentCache.insert(componentObjectIndex, namedObjectCache); @@ -304,8 +304,8 @@ void CompilationUnit::finalizeCompositeType(QQmlEnginePrivate *qmlEngine) int bindingCount = 0; int parserStatusCount = 0; int objectCount = 0; - for (quint32 i = 0; i < data->nObjects; ++i) { - const QV4::CompiledData::Object *obj = data->objectAt(i); + for (quint32 i = 0, count = this->objectCount(); i < count; ++i) { + const QV4::CompiledData::Object *obj = objectAt(i); bindingCount += obj->nBindings; if (auto *typeRef = resolvedTypes.value(obj->inheritedTypeNameIndex)) { if (typeRef->type.isValid()) { diff --git a/src/qml/compiler/qv4compileddata_p.h b/src/qml/compiler/qv4compileddata_p.h index dd0d92b0fa..54c7a242de 100644 --- a/src/qml/compiler/qv4compileddata_p.h +++ b/src/qml/compiler/qv4compileddata_p.h @@ -814,11 +814,11 @@ struct Unit bool verifyHeader(QDateTime expectedSourceTimeStamp, QString *errorString) const; - const Import *importAt(int idx) const { + const Import *importAtInternal(int idx) const { return reinterpret_cast((reinterpret_cast(this)) + offsetToImports + idx * sizeof(Import)); } - const Object *objectAt(int idx) const { + const Object *objectAtInternal(int idx) const { const quint32_le *offsetTable = reinterpret_cast((reinterpret_cast(this)) + offsetToObjects); const quint32_le offset = offsetTable[idx]; return reinterpret_cast(reinterpret_cast(this) + offset); @@ -1086,7 +1086,9 @@ public: // --- interface for QQmlPropertyCacheCreator typedef Object CompiledObject; int objectCount() const { return data->nObjects; } - const Object *objectAt(int index) const { return data->objectAt(index); } + const Object *objectAt(int index) const { return data->objectAtInternal(index); } + int importCount() const { return data->nImports; } + const Import *importAt(int index) const { return data->importAtInternal(index); } QString stringAt(int index) const { if (backingUnit) { diff --git a/src/qml/qml/qqmlcontext.cpp b/src/qml/qml/qqmlcontext.cpp index 2e37ed204d..cbf5a6e259 100644 --- a/src/qml/qml/qqmlcontext.cpp +++ b/src/qml/qml/qqmlcontext.cpp @@ -845,7 +845,7 @@ void QQmlContextData::initFromTypeCompilationUnit(const QQmlRefPointerunitData()->objectAt(componentObjectIndex)->nNamedObjectsInComponent; + idValueCount = typeCompilationUnit->objectAt(componentObjectIndex)->nNamedObjectsInComponent; idValues = new ContextGuard[idValueCount]; } diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp index 76f5d69c1a..7a55ce78e0 100644 --- a/src/qml/qml/qqmlobjectcreator.cpp +++ b/src/qml/qml/qqmlobjectcreator.cpp @@ -166,7 +166,7 @@ QObject *QQmlObjectCreator::create(int subComponentIndex, QObject *parent, QQmlI if (subComponentIndex == -1) { objectToCreate = /*root object*/0; } else { - const QV4::CompiledData::Object *compObj = qmlUnit->objectAt(subComponentIndex); + const QV4::CompiledData::Object *compObj = compilationUnit->objectAt(subComponentIndex); objectToCreate = compObj->bindingTable()->value.objectIndex; } @@ -262,7 +262,7 @@ bool QQmlObjectCreator::populateDeferredProperties(QObject *instance, QQmlData:: int objectIndex = deferredData->deferredIdx; qSwap(_compiledObjectIndex, objectIndex); - const QV4::CompiledData::Object *obj = qmlUnit->objectAt(_compiledObjectIndex); + const QV4::CompiledData::Object *obj = compilationUnit->objectAt(_compiledObjectIndex); qSwap(_compiledObject, obj); qSwap(_ddata, declarativeData); @@ -322,7 +322,7 @@ bool QQmlObjectCreator::populateDeferredBinding(const QQmlProperty &qmlProperty, int objectIndex = deferredData->deferredIdx; qSwap(_compiledObjectIndex, objectIndex); - const QV4::CompiledData::Object *obj = qmlUnit->objectAt(_compiledObjectIndex); + const QV4::CompiledData::Object *obj = compilationUnit->objectAt(_compiledObjectIndex); qSwap(_compiledObject, obj); qSwap(_ddata, declarativeData); @@ -784,7 +784,7 @@ void QQmlObjectCreator::setupBindings(bool applyDeferredBindings) bool QQmlObjectCreator::setPropertyBinding(const QQmlPropertyData *bindingProperty, const QV4::CompiledData::Binding *binding) { if (binding->type == QV4::CompiledData::Binding::Type_AttachedProperty) { - Q_ASSERT(stringAt(qmlUnit->objectAt(binding->value.objectIndex)->inheritedTypeNameIndex).isEmpty()); + Q_ASSERT(stringAt(compilationUnit->objectAt(binding->value.objectIndex)->inheritedTypeNameIndex).isEmpty()); QV4::CompiledData::ResolvedTypeReference *tr = resolvedTypes.value(binding->propertyNameIndex); Q_ASSERT(tr); QQmlType attachedType = tr->type; @@ -831,7 +831,7 @@ bool QQmlObjectCreator::setPropertyBinding(const QQmlPropertyData *bindingProper return true; if (binding->type == QV4::CompiledData::Binding::Type_GroupProperty) { - const QV4::CompiledData::Object *obj = qmlUnit->objectAt(binding->value.objectIndex); + const QV4::CompiledData::Object *obj = compilationUnit->objectAt(binding->value.objectIndex); if (stringAt(obj->inheritedTypeNameIndex).isEmpty()) { QObject *groupObject = nullptr; @@ -1130,7 +1130,7 @@ void QQmlObjectCreator::createQmlContext() QObject *QQmlObjectCreator::createInstance(int index, QObject *parent, bool isContextObject) { - const QV4::CompiledData::Object *obj = qmlUnit->objectAt(index); + const QV4::CompiledData::Object *obj = compilationUnit->objectAt(index); QQmlObjectCreationProfiler profiler(sharedState->profiler.profiler, obj); ActiveOCRestorer ocRestorer(this, QQmlEnginePrivate::get(engine)); @@ -1257,7 +1257,7 @@ QObject *QQmlObjectCreator::createInstance(int index, QObject *parent, bool isCo customParser->imports = compilationUnit->typeNameCache.data(); QList bindings; - const QV4::CompiledData::Object *obj = qmlUnit->objectAt(index); + const QV4::CompiledData::Object *obj = compilationUnit->objectAt(index); const QV4::CompiledData::Binding *binding = obj->bindingTable(); for (quint32 i = 0; i < obj->nBindings; ++i, ++binding) { if (binding->flags & QV4::CompiledData::Binding::IsCustomParserBinding) { @@ -1424,7 +1424,7 @@ bool QQmlObjectCreator::populateInstance(int index, QObject *instance, QObject * qSwap(_qobject, instance); qSwap(_valueTypeProperty, valueTypeProperty); qSwap(_compiledObjectIndex, index); - const QV4::CompiledData::Object *obj = qmlUnit->objectAt(_compiledObjectIndex); + const QV4::CompiledData::Object *obj = compilationUnit->objectAt(_compiledObjectIndex); qSwap(_compiledObject, obj); qSwap(_ddata, declarativeData); qSwap(_bindingTarget, bindingTarget); diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp index 92dd1a59c2..2aa64f350a 100644 --- a/src/qml/qml/qqmltypeloader.cpp +++ b/src/qml/qml/qqmltypeloader.cpp @@ -2132,8 +2132,8 @@ bool QQmlTypeData::tryLoadFromDiskCache() return false; // find the implicit import - for (quint32 i = 0; i < m_compiledData->unitData()->nImports; ++i) { - const QV4::CompiledData::Import *import = m_compiledData->unitData()->importAt(i); + for (quint32 i = 0, count = m_compiledData->importCount(); i < count; ++i) { + const QV4::CompiledData::Import *import = m_compiledData->importAt(i); if (m_compiledData->stringAt(import->uriIndex) == QLatin1String(".") && import->qualifierIndex == 0 && import->majorVersion == -1 @@ -2149,8 +2149,8 @@ bool QQmlTypeData::tryLoadFromDiskCache() } } - for (int i = 0, count = m_compiledData->unitData()->nImports; i < count; ++i) { - const QV4::CompiledData::Import *import = m_compiledData->unitData()->importAt(i); + for (int i = 0, count = m_compiledData->importCount(); i < count; ++i) { + const QV4::CompiledData::Import *import = m_compiledData->importAt(i); QList errors; if (!addImport(import, &errors)) { Q_ASSERT(errors.size()); @@ -3097,11 +3097,11 @@ void QQmlScriptBlob::initializeFromCompilationUnit(const QQmlRefPointerm_precompiledScript->unitData(); + QQmlRefPointer script = m_scriptData->m_precompiledScript; QList errors; - for (quint32 i = 0; i < qmlUnit->nImports; ++i) { - const QV4::CompiledData::Import *import = qmlUnit->importAt(i); + for (quint32 i = 0, count = script->importCount(); i < count; ++i) { + const QV4::CompiledData::Import *import = script->importAt(i); if (!addImport(import, &errors)) { Q_ASSERT(errors.size()); QQmlError error(errors.takeFirst()); diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp index 7ba5d6356f..d01e089054 100644 --- a/src/qml/qml/qqmlvmemetaobject.cpp +++ b/src/qml/qml/qqmlvmemetaobject.cpp @@ -326,7 +326,7 @@ QQmlVMEMetaObject::QQmlVMEMetaObject(QV4::ExecutionEngine *engine, QQmlData::get(obj)->hasVMEMetaObject = true; if (compilationUnit && qmlObjectId >= 0) { - compiledObject = compilationUnit->unitData()->objectAt(qmlObjectId); + compiledObject = compilationUnit->objectAt(qmlObjectId); if (compiledObject->nProperties || compiledObject->nFunctions) { uint size = compiledObject->nProperties + compiledObject->nFunctions; diff --git a/src/qml/types/qqmllistmodel.cpp b/src/qml/types/qqmllistmodel.cpp index df06a22eab..1b64a38bd6 100644 --- a/src/qml/types/qqmllistmodel.cpp +++ b/src/qml/types/qqmllistmodel.cpp @@ -2697,14 +2697,14 @@ bool QQmlListModelParser::verifyProperty(const QQmlRefPointer &compilationUnit, const QV4::CompiledData::Unit *qmlUnit, const QV4::CompiledData::Binding *binding, ListModel *model, int outterElementIndex) +bool QQmlListModelParser::applyProperty(const QQmlRefPointer &compilationUnit, const QV4::CompiledData::Binding *binding, ListModel *model, int outterElementIndex) { const QString elementName = compilationUnit->stringAt(binding->propertyNameIndex); bool roleSet = false; if (binding->type >= QV4::CompiledData::Binding::Type_Object) { const quint32 targetObjectIndex = binding->value.objectIndex; - const QV4::CompiledData::Object *target = qmlUnit->objectAt(targetObjectIndex); + const QV4::CompiledData::Object *target = compilationUnit->objectAt(targetObjectIndex); ListModel *subModel = nullptr; if (outterElementIndex == -1) { @@ -2725,7 +2725,7 @@ bool QQmlListModelParser::applyProperty(const QQmlRefPointerbindingTable(); for (quint32 i = 0; i < target->nBindings; ++i, ++subBinding) { - roleSet |= applyProperty(compilationUnit, qmlUnit, subBinding, subModel, elementIndex); + roleSet |= applyProperty(compilationUnit, subBinding, subModel, elementIndex); } } else { @@ -2797,14 +2797,12 @@ void QQmlListModelParser::applyBindings(QObject *obj, const QQmlRefPointerm_engine = qmlEngine(rv)->handle(); rv->m_compilationUnit = compilationUnit; - const QV4::CompiledData::Unit *qmlUnit = compilationUnit->unitData(); - bool setRoles = false; for (const QV4::CompiledData::Binding *binding : bindings) { if (binding->type != QV4::CompiledData::Binding::Type_Object) continue; - setRoles |= applyProperty(compilationUnit, qmlUnit, binding, rv->m_listModel, /*outter element index*/-1); + setRoles |= applyProperty(compilationUnit, binding, rv->m_listModel, /*outter element index*/-1); } if (setRoles == false) diff --git a/src/qml/types/qqmllistmodel_p.h b/src/qml/types/qqmllistmodel_p.h index 54e5f53fcf..95b797c898 100644 --- a/src/qml/types/qqmllistmodel_p.h +++ b/src/qml/types/qqmllistmodel_p.h @@ -193,7 +193,7 @@ public: private: bool verifyProperty(const QQmlRefPointer &compilationUnit, const QV4::CompiledData::Binding *binding); // returns true if a role was set - bool applyProperty(const QQmlRefPointer &compilationUnit, const QV4::CompiledData::Unit *qmlUnit, const QV4::CompiledData::Binding *binding, ListModel *model, int outterElementIndex); + bool applyProperty(const QQmlRefPointer &compilationUnit, const QV4::CompiledData::Binding *binding, ListModel *model, int outterElementIndex); static bool definesEmptyList(const QString &); -- cgit v1.2.3