diff options
author | Simon Hausmann <simon.hausmann@qt.io> | 2016-05-24 15:44:05 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@qt.io> | 2016-05-26 11:32:56 +0000 |
commit | 899c1ef0f7574019f1b41a922b2ba10614df130f (patch) | |
tree | 13fa3754d40c84a42add0145e57943be311e87ba | |
parent | 2cb3466baae362abbafc9d79db7369edac2355ba (diff) |
Add a flag to CompiledData::Object record component boundaries
This allows simplifying some code and reducing the usage of the objectIndexToId
hash maps.
Change-Id: I1f08d4b224c4f9fa498d90471fa545ae4e4f2af4
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
-rw-r--r-- | src/qml/compiler/qqmlirbuilder.cpp | 2 | ||||
-rw-r--r-- | src/qml/compiler/qqmlirbuilder_p.h | 5 | ||||
-rw-r--r-- | src/qml/compiler/qqmltypecompiler.cpp | 22 | ||||
-rw-r--r-- | src/qml/compiler/qqmltypecompiler_p.h | 6 | ||||
-rw-r--r-- | src/qml/compiler/qv4compileddata_p.h | 8 | ||||
-rw-r--r-- | src/qml/qml/qqmlcompiler_p.h | 1 | ||||
-rw-r--r-- | src/qml/qml/qqmlobjectcreator.cpp | 2 |
7 files changed, 24 insertions, 22 deletions
diff --git a/src/qml/compiler/qqmlirbuilder.cpp b/src/qml/compiler/qqmlirbuilder.cpp index d796154bf3..f846a96ed6 100644 --- a/src/qml/compiler/qqmlirbuilder.cpp +++ b/src/qml/compiler/qqmlirbuilder.cpp @@ -82,6 +82,7 @@ void Object::init(QQmlJS::MemoryPool *pool, int typeNameIndex, int id, const QQm idIndex = id; indexOfDefaultPropertyOrAlias = -1; defaultPropertyIsAlias = false; + flags = QV4::CompiledData::Object::NoFlag; properties = pool->New<PoolList<Property> >(); aliases = pool->New<PoolList<Alias> >(); qmlSignals = pool->New<PoolList<Signal> >(); @@ -1419,6 +1420,7 @@ QV4::CompiledData::Unit *QmlUnitGenerator::generate(Document &output) objectToWrite->inheritedTypeNameIndex = o->inheritedTypeNameIndex; objectToWrite->indexOfDefaultPropertyOrAlias = o->indexOfDefaultPropertyOrAlias; objectToWrite->defaultPropertyIsAlias = o->defaultPropertyIsAlias; + objectToWrite->flags = o->flags; objectToWrite->idIndex = o->idIndex; objectToWrite->location = o->location; objectToWrite->locationOfIdProperty = o->locationOfIdProperty; diff --git a/src/qml/compiler/qqmlirbuilder_p.h b/src/qml/compiler/qqmlirbuilder_p.h index c46acc2481..1d9b4c807a 100644 --- a/src/qml/compiler/qqmlirbuilder_p.h +++ b/src/qml/compiler/qqmlirbuilder_p.h @@ -280,8 +280,9 @@ struct Q_QML_PRIVATE_EXPORT Object public: quint32 inheritedTypeNameIndex; quint32 idIndex; - int indexOfDefaultPropertyOrAlias : 31; - int defaultPropertyIsAlias : 1; + int indexOfDefaultPropertyOrAlias; + bool defaultPropertyIsAlias; + int flags; QV4::CompiledData::Location location; QV4::CompiledData::Location locationOfIdProperty; diff --git a/src/qml/compiler/qqmltypecompiler.cpp b/src/qml/compiler/qqmltypecompiler.cpp index 82e12c9a4f..837c66419d 100644 --- a/src/qml/compiler/qqmltypecompiler.cpp +++ b/src/qml/compiler/qqmltypecompiler.cpp @@ -1382,6 +1382,7 @@ void QQmlComponentAndAliasResolver::findAndRegisterImplicitComponents(const QmlI QmlIR::Object *syntheticComponent = pool->New<QmlIR::Object>(); syntheticComponent->init(pool, compiler->registerString(QString::fromUtf8(componentType->typeName())), compiler->registerString(QString())); syntheticComponent->location = binding->valueLocation; + syntheticComponent->flags |= QV4::CompiledData::Object::IsComponent; if (!resolvedTypes->contains(syntheticComponent->inheritedTypeNameIndex)) { QQmlCompiledData::TypeReference *typeRef = new QQmlCompiledData::TypeReference; @@ -1420,7 +1421,7 @@ bool QQmlComponentAndAliasResolver::resolve() // on the left hand side is of QQmlComponent type. const int objCountWithoutSynthesizedComponents = qmlObjects->count(); for (int i = 0; i < objCountWithoutSynthesizedComponents; ++i) { - const QmlIR::Object *obj = qmlObjects->at(i); + QmlIR::Object *obj = qmlObjects->at(i); QQmlPropertyCache *cache = propertyCaches.at(i).data(); if (obj->inheritedTypeNameIndex == 0 && !cache) continue; @@ -1439,6 +1440,7 @@ bool QQmlComponentAndAliasResolver::resolve() continue; } + obj->flags |= QV4::CompiledData::Object::IsComponent; componentRoots.append(i); if (obj->functionCount() > 0) @@ -1675,7 +1677,6 @@ QQmlPropertyValidator::QQmlPropertyValidator(QQmlTypeCompiler *typeCompiler) , resolvedTypes(*typeCompiler->resolvedTypes()) , customParsers(typeCompiler->customParserCache()) , propertyCaches(typeCompiler->propertyCaches()) - , objectIndexToIdPerComponent(*typeCompiler->objectIndexToIdPerComponent()) , customParserBindingsPerObject(typeCompiler->customParserBindings()) , _seenObjectWithId(false) { @@ -1720,7 +1721,7 @@ bool QQmlPropertyValidator::validateObject(int objectIndex, const QV4::CompiledD if (obj->idIndex != 0) _seenObjectWithId = true; - if (isComponent(objectIndex)) { + if (obj->flags & QV4::CompiledData::Object::IsComponent) { Q_ASSERT(obj->nBindings == 1); const QV4::CompiledData::Binding *componentBinding = obj->bindingTable(); Q_ASSERT(componentBinding->type == QV4::CompiledData::Binding::Type_Object); @@ -2328,7 +2329,7 @@ bool QQmlPropertyValidator::validateObjectBinding(QQmlPropertyData *property, co } } return true; - } else if (isComponent(binding->value.objectIndex)) { + } else if (qmlUnit->objectAt(binding->value.objectIndex)->flags & QV4::CompiledData::Object::IsComponent) { return true; } else if (binding->flags & QV4::CompiledData::Binding::IsSignalHandlerObject && property->isFunction()) { return true; @@ -2365,7 +2366,6 @@ bool QQmlPropertyValidator::validateObjectBinding(QQmlPropertyData *property, co QQmlJSCodeGenerator::QQmlJSCodeGenerator(QQmlTypeCompiler *typeCompiler, QmlIR::JSCodeGen *v4CodeGen) : QQmlCompilePass(typeCompiler) - , objectIndexToIdPerComponent(*typeCompiler->objectIndexToIdPerComponent()) , resolvedTypes(*typeCompiler->resolvedTypes()) , customParsers(typeCompiler->customParserCache()) , qmlObjects(*typeCompiler->qmlObjects()) @@ -2388,10 +2388,10 @@ bool QQmlJSCodeGenerator::generateCodeForComponents() bool QQmlJSCodeGenerator::compileComponent(int contextObject, const QHash<int, int> &objectIndexToId) { - if (isComponent(contextObject)) { - const QmlIR::Object *component = qmlObjects.at(contextObject); - Q_ASSERT(component->bindingCount() == 1); - const QV4::CompiledData::Binding *componentBinding = component->firstBinding(); + const QmlIR::Object *obj = qmlObjects.at(contextObject); + if (obj->flags & QV4::CompiledData::Object::IsComponent) { + Q_ASSERT(obj->bindingCount() == 1); + const QV4::CompiledData::Binding *componentBinding = obj->firstBinding(); Q_ASSERT(componentBinding->type == QV4::CompiledData::Binding::Type_Object); contextObject = componentBinding->value.objectIndex; } @@ -2427,10 +2427,10 @@ bool QQmlJSCodeGenerator::compileComponent(int contextObject, const QHash<int, i bool QQmlJSCodeGenerator::compileJavaScriptCodeInObjectsRecursively(int objectIndex, int scopeObjectIndex) { - if (isComponent(objectIndex)) + QmlIR::Object *object = qmlObjects.at(objectIndex); + if (object->flags & QV4::CompiledData::Object::IsComponent) return true; - QmlIR::Object *object = qmlObjects.at(objectIndex); if (object->functionsAndExpressions->count > 0) { QQmlPropertyCache *scopeObject = propertyCaches.at(scopeObjectIndex).data(); v4CodeGen->beginObjectScope(scopeObject); diff --git a/src/qml/compiler/qqmltypecompiler_p.h b/src/qml/compiler/qqmltypecompiler_p.h index 968902dae1..a22169f728 100644 --- a/src/qml/compiler/qqmltypecompiler_p.h +++ b/src/qml/compiler/qqmltypecompiler_p.h @@ -300,8 +300,6 @@ private: bool validateLiteralBinding(QQmlPropertyCache *propertyCache, QQmlPropertyData *property, const QV4::CompiledData::Binding *binding) const; bool validateObjectBinding(QQmlPropertyData *property, const QString &propertyName, const QV4::CompiledData::Binding *binding) const; - bool isComponent(int objectIndex) const { return objectIndexToIdPerComponent.contains(objectIndex); } - bool canCoerce(int to, QQmlPropertyCache *fromMo) const; QQmlEnginePrivate *enginePrivate; @@ -309,7 +307,6 @@ private: const QHash<int, QQmlCompiledData::TypeReference*> &resolvedTypes; const QHash<int, QQmlCustomParser*> &customParsers; const QQmlPropertyCacheVector &propertyCaches; - const QHash<int, QHash<int, int> > objectIndexToIdPerComponent; QHash<int, QBitArray> *customParserBindingsPerObject; // collected state variables, essentially write-only @@ -330,9 +327,6 @@ private: bool compileComponent(int componentRoot, const QHash<int, int> &objectIndexToId); bool compileJavaScriptCodeInObjectsRecursively(int objectIndex, int scopeObjectIndex); - bool isComponent(int objectIndex) const { return objectIndexToIdPerComponent.contains(objectIndex); } - - const QHash<int, QHash<int, int> > &objectIndexToIdPerComponent; const QHash<int, QQmlCompiledData::TypeReference*> &resolvedTypes; const QHash<int, QQmlCustomParser*> &customParsers; const QList<QmlIR::Object*> &qmlObjects; diff --git a/src/qml/compiler/qv4compileddata_p.h b/src/qml/compiler/qv4compileddata_p.h index 3c2d895bff..0d3bc0a043 100644 --- a/src/qml/compiler/qv4compileddata_p.h +++ b/src/qml/compiler/qv4compileddata_p.h @@ -391,13 +391,19 @@ struct Alias { struct Object { + enum Flags { + NoFlag = 0x0, + IsComponent = 0x1 // object was identified to be an explicit or implicit component boundary + }; + // Depending on the use, this may be the type name to instantiate before instantiating this // object. For grouped properties the type name will be empty and for attached properties // it will be the name of the attached type. quint32 inheritedTypeNameIndex; quint32 idIndex; - qint32 indexOfDefaultPropertyOrAlias : 31; // -1 means no default property declared in this object + qint32 flags : 31; quint32 defaultPropertyIsAlias : 1; + qint32 indexOfDefaultPropertyOrAlias; // -1 means no default property declared in this object quint32 nFunctions; quint32 offsetToFunctions; quint32 nProperties; diff --git a/src/qml/qml/qqmlcompiler_p.h b/src/qml/qml/qqmlcompiler_p.h index c2b244f5e3..a6856e60ed 100644 --- a/src/qml/qml/qqmlcompiler_p.h +++ b/src/qml/qml/qqmlcompiler_p.h @@ -141,7 +141,6 @@ public: int totalParserStatusCount; // Number of instantiated types that are QQmlParserStatus subclasses int totalObjectCount; // Number of objects explicitly instantiated - bool isComponent(int objectIndex) const { return objectIndexToIdPerComponent.contains(objectIndex); } bool isCompositeType() const { return propertyCaches.at(compilationUnit->data->indexOfRootObject).flag(); } bool isInitialized() const { return hasEngine(); } diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp index 86693af3d3..5cd6cb8685 100644 --- a/src/qml/qml/qqmlobjectcreator.cpp +++ b/src/qml/qml/qqmlobjectcreator.cpp @@ -1033,7 +1033,7 @@ QObject *QQmlObjectCreator::createInstance(int index, QObject *parent, bool isCo bool installPropertyCache = true; const QV4::CompiledData::Object *obj = qmlUnit->objectAt(index); - if (compiledData->isComponent(index)) { + if (obj->flags & QV4::CompiledData::Object::IsComponent) { isComponent = true; QQmlComponent *component = new QQmlComponent(engine, compiledData, index, parent); Q_QML_OC_PROFILE(sharedState->profiler, profiler.update( |