diff options
Diffstat (limited to 'src/qml')
-rw-r--r-- | src/qml/compiler/qqmlcodegenerator.cpp | 10 | ||||
-rw-r--r-- | src/qml/compiler/qqmltypecompiler.cpp | 80 | ||||
-rw-r--r-- | src/qml/compiler/qqmltypecompiler_p.h | 8 | ||||
-rw-r--r-- | src/qml/qml/qqmlcompileddata.cpp | 12 | ||||
-rw-r--r-- | src/qml/qml/qqmlcompiler_p.h | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmlobjectcreator.cpp | 15 | ||||
-rw-r--r-- | src/qml/qml/qqmlobjectcreator_p.h | 2 |
7 files changed, 72 insertions, 57 deletions
diff --git a/src/qml/compiler/qqmlcodegenerator.cpp b/src/qml/compiler/qqmlcodegenerator.cpp index 22ae1228c7..46bb07f8bc 100644 --- a/src/qml/compiler/qqmlcodegenerator.cpp +++ b/src/qml/compiler/qqmlcodegenerator.cpp @@ -1639,8 +1639,8 @@ bool SignalHandlerConverter::convertSignalHandlerExpressionsToFunctionDeclaratio QString elementName = stringAt(obj->inheritedTypeNameIndex); if (elementName.isEmpty()) continue; - QQmlCompiledData::TypeReference &tr = unit->resolvedTypes[obj->inheritedTypeNameIndex]; - if (tr.type && tr.type->customParser()) + QQmlCompiledData::TypeReference *tr = unit->resolvedTypes.value(obj->inheritedTypeNameIndex); + if (tr && tr->type && tr->type->customParser()) continue; QQmlPropertyCache *cache = unit->propertyCaches.value(objectIndex); Q_ASSERT(cache); @@ -1660,7 +1660,8 @@ bool SignalHandlerConverter::convertSignalHandlerExpressionsToFunctionDeclaratio // Attached property? if (binding->type == QV4::CompiledData::Binding::Type_AttachedProperty) { QmlObject *attachedObj = parsedQML->objects[binding->value.objectIndex]; - QQmlType *type = unit->resolvedTypes.value(binding->propertyNameIndex).type; + QQmlCompiledData::TypeReference *typeRef = unit->resolvedTypes.value(binding->propertyNameIndex); + QQmlType *type = typeRef ? typeRef->type : 0; const QMetaObject *attachedType = type ? type->attachedPropertiesType() : 0; if (!attachedType) COMPILE_EXCEPTION(binding->location, tr("Non-existent attached object")); @@ -1703,7 +1704,8 @@ bool SignalHandlerConverter::convertSignalHandlerExpressionsToFunctionDeclaratio const QString &originalPropertyName = stringAt(binding->propertyNameIndex); - const QQmlType *type = unit->resolvedTypes.value(obj->inheritedTypeNameIndex).type; + QQmlCompiledData::TypeReference *typeRef = unit->resolvedTypes.value(obj->inheritedTypeNameIndex); + const QQmlType *type = typeRef ? typeRef->type : 0; if (type) { COMPILE_EXCEPTION(binding->location, tr("\"%1.%2\" is not available in %3 %4.%5.").arg(typeName).arg(originalPropertyName).arg(type->module()).arg(type->majorVersion()).arg(type->minorVersion())); } else { diff --git a/src/qml/compiler/qqmltypecompiler.cpp b/src/qml/compiler/qqmltypecompiler.cpp index 91f5535f9c..4fe3008003 100644 --- a/src/qml/compiler/qqmltypecompiler.cpp +++ b/src/qml/compiler/qqmltypecompiler.cpp @@ -80,16 +80,16 @@ bool QQmlTypeCompiler::compile() const QHash<int, QQmlTypeData::TypeReference> &resolvedTypes = typeData->resolvedTypeRefs(); for (QHash<int, QQmlTypeData::TypeReference>::ConstIterator resolvedType = resolvedTypes.constBegin(), end = resolvedTypes.constEnd(); resolvedType != end; ++resolvedType) { - QQmlCompiledData::TypeReference ref; + QQmlCompiledData::TypeReference *ref = new QQmlCompiledData::TypeReference; if (resolvedType->typeData) { - ref.component = resolvedType->typeData->compiledData(); - ref.component->addref(); + ref->component = resolvedType->typeData->compiledData(); + ref->component->addref(); } else { - ref.type = resolvedType->type; - Q_ASSERT(ref.type); + ref->type = resolvedType->type; + Q_ASSERT(ref->type); } - ref.majorVersion = resolvedType->majorVersion; - ref.minorVersion = resolvedType->minorVersion; + ref->majorVersion = resolvedType->majorVersion; + ref->minorVersion = resolvedType->minorVersion; compiledData->resolvedTypes.insert(resolvedType.key(), ref); } @@ -175,13 +175,14 @@ bool QQmlTypeCompiler::compile() engine->registerInternalCompositeType(compiledData); else { const QV4::CompiledData::Object *obj = qmlUnit->objectAt(qmlUnit->indexOfRootObject); - QQmlCompiledData::TypeReference typeRef = compiledData->resolvedTypes.value(obj->inheritedTypeNameIndex); - if (typeRef.component) { - compiledData->metaTypeId = typeRef.component->metaTypeId; - compiledData->listMetaTypeId = typeRef.component->listMetaTypeId; + QQmlCompiledData::TypeReference *typeRef = compiledData->resolvedTypes.value(obj->inheritedTypeNameIndex); + Q_ASSERT(typeRef); + if (typeRef->component) { + compiledData->metaTypeId = typeRef->component->metaTypeId; + compiledData->listMetaTypeId = typeRef->component->listMetaTypeId; } else { - compiledData->metaTypeId = typeRef.type->typeId(); - compiledData->listMetaTypeId = typeRef.type->qListTypeId(); + compiledData->metaTypeId = typeRef->type->typeId(); + compiledData->listMetaTypeId = typeRef->type->qListTypeId(); } } @@ -220,7 +221,7 @@ const QQmlImports *QQmlTypeCompiler::imports() const return &typeData->imports(); } -QHash<int, QQmlCompiledData::TypeReference> *QQmlTypeCompiler::resolvedTypes() +QHash<int, QQmlCompiledData::TypeReference*> *QQmlTypeCompiler::resolvedTypes() { return &compiledData->resolvedTypes; } @@ -241,6 +242,7 @@ void QQmlTypeCompiler::setPropertyCaches(const QVector<QQmlPropertyCache *> &cac compiledData->propertyCaches = caches; Q_ASSERT(caches.count() >= parsedQML->indexOfRootObject); compiledData->rootPropertyCache = caches.at(parsedQML->indexOfRootObject); + compiledData->rootPropertyCache->addref(); } const QVector<QQmlPropertyCache *> &QQmlTypeCompiler::propertyCaches() const @@ -369,8 +371,9 @@ bool QQmlPropertyCacheCreator::buildMetaObjectRecursively(int objectIndex, int r QString typeName = stringAt(obj->inheritedTypeNameIndex); if (!typeName.isEmpty()) { - QQmlCompiledData::TypeReference typeRef = resolvedTypes->value(obj->inheritedTypeNameIndex); - baseTypeCache = typeRef.createPropertyCache(QQmlEnginePrivate::get(enginePrivate)); + QQmlCompiledData::TypeReference *typeRef = resolvedTypes->value(obj->inheritedTypeNameIndex); + Q_ASSERT(typeRef); + baseTypeCache = typeRef->createPropertyCache(QQmlEnginePrivate::get(enginePrivate)); Q_ASSERT(baseTypeCache); } @@ -395,8 +398,9 @@ bool QQmlPropertyCacheCreator::ensureMetaObject(int objectIndex) if (!vmeMetaObjects.at(objectIndex).isEmpty()) return true; const QtQml::QmlObject *obj = qmlObjects.at(objectIndex); - QQmlCompiledData::TypeReference typeRef = resolvedTypes->value(obj->inheritedTypeNameIndex); - QQmlPropertyCache *baseTypeCache = typeRef.createPropertyCache(QQmlEnginePrivate::get(enginePrivate)); + QQmlCompiledData::TypeReference *typeRef = resolvedTypes->value(obj->inheritedTypeNameIndex); + Q_ASSERT(typeRef); + QQmlPropertyCache *baseTypeCache = typeRef->createPropertyCache(QQmlEnginePrivate::get(enginePrivate)); return createMetaObject(objectIndex, obj, baseTypeCache); } @@ -407,7 +411,6 @@ bool QQmlPropertyCacheCreator::createMetaObject(int objectIndex, const QtQml::Qm obj->functions->count + obj->properties->count + obj->qmlSignals->count, obj->qmlSignals->count + obj->properties->count); propertyCaches[objectIndex] = cache; - cache->addref(); struct TypeData { QV4::CompiledData::Property::Type dtype; @@ -776,7 +779,9 @@ void QQmlComponentAndAliasResolver::findAndRegisterImplicitComponents(const QtQm continue; const QtQml::QmlObject *targetObject = qmlObjects->at(binding->value.objectIndex); - QQmlType *targetType = resolvedTypes->value(targetObject->inheritedTypeNameIndex).type; + QQmlCompiledData::TypeReference *tr = resolvedTypes->value(targetObject->inheritedTypeNameIndex); + Q_ASSERT(tr); + QQmlType *targetType = tr->type; if (targetType && targetType->metaObject() == &QQmlComponent::staticMetaObject) continue; @@ -813,10 +818,10 @@ void QQmlComponentAndAliasResolver::findAndRegisterImplicitComponents(const QtQm syntheticComponent->init(pool, compiler->registerString(QString::fromUtf8(componentType->typeName())), compiler->registerString(QString())); if (!resolvedTypes->contains(syntheticComponent->inheritedTypeNameIndex)) { - QQmlCompiledData::TypeReference typeRef; - typeRef.type = componentType; - typeRef.majorVersion = componentType->majorVersion(); - typeRef.minorVersion = componentType->minorVersion(); + QQmlCompiledData::TypeReference *typeRef = new QQmlCompiledData::TypeReference; + typeRef->type = componentType; + typeRef->majorVersion = componentType->majorVersion(); + typeRef->minorVersion = componentType->minorVersion(); resolvedTypes->insert(syntheticComponent->inheritedTypeNameIndex, typeRef); } @@ -847,10 +852,11 @@ bool QQmlComponentAndAliasResolver::resolve() if (stringAt(obj->inheritedTypeNameIndex).isEmpty()) continue; - QQmlCompiledData::TypeReference tref = resolvedTypes->value(obj->inheritedTypeNameIndex); - if (!tref.type) + QQmlCompiledData::TypeReference *tref = resolvedTypes->value(obj->inheritedTypeNameIndex); + Q_ASSERT(tref); + if (!tref->type) continue; - if (tref.type->metaObject() != &QQmlComponent::staticMetaObject) { + if (tref->type->metaObject() != &QQmlComponent::staticMetaObject) { findAndRegisterImplicitComponents(obj, i); continue; } @@ -995,12 +1001,13 @@ bool QQmlComponentAndAliasResolver::resolveAliases() if (property.isEmpty()) { const QtQml::QmlObject *targetObject = qmlObjects->at(targetObjectIndex); - QQmlCompiledData::TypeReference typeRef = resolvedTypes->value(targetObject->inheritedTypeNameIndex); + QQmlCompiledData::TypeReference *typeRef = resolvedTypes->value(targetObject->inheritedTypeNameIndex); + Q_ASSERT(typeRef); - if (typeRef.type) - type = typeRef.type->typeId(); + if (typeRef->type) + type = typeRef->type->typeId(); else - type = typeRef.component->metaTypeId; + type = typeRef->component->metaTypeId; flags |= QML_ALIAS_FLAG_PTR; propertyFlags |= QQmlPropertyData::IsQObjectDerived; @@ -1125,9 +1132,10 @@ bool QQmlPropertyValidator::validateObject(int objectIndex) Q_ASSERT(propertyCache); QQmlCustomParser *customParser = 0; - QQmlCompiledData::TypeReference objectType = resolvedTypes.value(obj->inheritedTypeNameIndex); - if (objectType.type) - customParser = objectType.type->customParser(); + QQmlCompiledData::TypeReference *objectType = resolvedTypes.value(obj->inheritedTypeNameIndex); + Q_ASSERT(objectType); + if (objectType->type) + customParser = objectType->type->customParser(); QList<const QV4::CompiledData::Binding*> customBindings; PropertyResolver propertyResolver(propertyCache); @@ -1162,8 +1170,8 @@ bool QQmlPropertyValidator::validateObject(int objectIndex) if (notInRevision) { QString typeName = stringAt(obj->inheritedTypeNameIndex); - if (objectType.type) { - COMPILE_EXCEPTION(binding, tr("\"%1.%2\" is not available in %3 %4.%5.").arg(typeName).arg(name).arg(objectType.type->module()).arg(objectType.majorVersion).arg(objectType.minorVersion)); + if (objectType->type) { + COMPILE_EXCEPTION(binding, tr("\"%1.%2\" is not available in %3 %4.%5.").arg(typeName).arg(name).arg(objectType->type->module()).arg(objectType->majorVersion).arg(objectType->minorVersion)); } else { COMPILE_EXCEPTION(binding, tr("\"%1.%2\" is not available due to component versioning.").arg(typeName).arg(name)); } diff --git a/src/qml/compiler/qqmltypecompiler_p.h b/src/qml/compiler/qqmltypecompiler_p.h index 4fde8f58c2..e6a34fa376 100644 --- a/src/qml/compiler/qqmltypecompiler_p.h +++ b/src/qml/compiler/qqmltypecompiler_p.h @@ -81,7 +81,7 @@ struct QQmlTypeCompiler QQmlEnginePrivate *enginePrivate() const { return engine; } const QQmlImports *imports() const; - QHash<int, QQmlCompiledData::TypeReference> *resolvedTypes(); + QHash<int, QQmlCompiledData::TypeReference *> *resolvedTypes(); QList<QtQml::QmlObject*> *qmlObjects(); int rootObjectIndex() const; void setPropertyCaches(const QVector<QQmlPropertyCache *> &caches); @@ -130,7 +130,7 @@ protected: QQmlEnginePrivate *enginePrivate; const QList<QtQml::QmlObject*> &qmlObjects; const QQmlImports *imports; - QHash<int, QQmlCompiledData::TypeReference> *resolvedTypes; + QHash<int, QQmlCompiledData::TypeReference*> *resolvedTypes; QVector<QByteArray> vmeMetaObjects; QVector<QQmlPropertyCache*> propertyCaches; }; @@ -165,7 +165,7 @@ protected: QHash<int, int> *_objectIndexToIdInScope; QList<int> _objectsWithAliases; - QHash<int, QQmlCompiledData::TypeReference> *resolvedTypes; + QHash<int, QQmlCompiledData::TypeReference*> *resolvedTypes; const QVector<QQmlPropertyCache *> propertyCaches; QVector<QByteArray> *vmeMetaObjectData; QHash<int, int> *objectIndexToIdForRoot; @@ -190,7 +190,7 @@ private: bool isComponent(int objectIndex) const { return objectIndexToIdPerComponent.contains(objectIndex); } const QV4::CompiledData::QmlUnit *qmlUnit; - const QHash<int, QQmlCompiledData::TypeReference> &resolvedTypes; + const QHash<int, QQmlCompiledData::TypeReference*> &resolvedTypes; const QVector<QQmlPropertyCache *> &propertyCaches; const QHash<int, QHash<int, int> > objectIndexToIdPerComponent; QHash<int, QByteArray> *customParserData; diff --git a/src/qml/qml/qqmlcompileddata.cpp b/src/qml/qml/qqmlcompileddata.cpp index 76bf24fe6b..cc8fcdb6ba 100644 --- a/src/qml/qml/qqmlcompileddata.cpp +++ b/src/qml/qml/qqmlcompileddata.cpp @@ -117,13 +117,15 @@ QQmlCompiledData::~QQmlCompiledData() types.at(ii).typePropertyCache->release(); } - for (QHash<int, TypeReference>::Iterator resolvedType = resolvedTypes.begin(), end = resolvedTypes.end(); + for (QHash<int, TypeReference*>::Iterator resolvedType = resolvedTypes.begin(), end = resolvedTypes.end(); resolvedType != end; ++resolvedType) { - if (resolvedType->component) - resolvedType->component->release(); - if (resolvedType->typePropertyCache) - resolvedType->typePropertyCache->release(); + if ((*resolvedType)->component) + (*resolvedType)->component->release(); + if ((*resolvedType)->typePropertyCache) + (*resolvedType)->typePropertyCache->release(); } + qDeleteAll(resolvedTypes); + resolvedTypes.clear(); for (int ii = 0; ii < propertyCaches.count(); ++ii) if (propertyCaches.at(ii)) diff --git a/src/qml/qml/qqmlcompiler_p.h b/src/qml/qml/qqmlcompiler_p.h index 788def0288..58943b206a 100644 --- a/src/qml/qml/qqmlcompiler_p.h +++ b/src/qml/qml/qqmlcompiler_p.h @@ -129,7 +129,7 @@ public: QList<TypeReference> types; // --- new compiler: // map from name index - QHash<int, TypeReference> resolvedTypes; + QHash<int, TypeReference*> resolvedTypes; // --- struct V8Program { diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp index 963b8272f4..b1f4a8e1bf 100644 --- a/src/qml/qml/qqmlobjectcreator.cpp +++ b/src/qml/qml/qqmlobjectcreator.cpp @@ -642,7 +642,9 @@ bool QmlObjectCreator::setPropertyValue(QQmlPropertyData *property, int bindingI { if (binding->type == QV4::CompiledData::Binding::Type_AttachedProperty) { Q_ASSERT(stringAt(qmlUnit->objectAt(binding->value.objectIndex)->inheritedTypeNameIndex).isEmpty()); - QQmlType *attachedType = resolvedTypes.value(binding->propertyNameIndex).type; + QQmlCompiledData::TypeReference *tr = resolvedTypes.value(binding->propertyNameIndex); + Q_ASSERT(tr); + QQmlType *attachedType = tr->type; const int id = attachedType->attachedPropertiesId(); QObject *qmlObject = qmlAttachedPropertiesObjectById(id, _qobject); QQmlRefPointer<QQmlPropertyCache> cache = QQmlEnginePrivate::get(engine)->cache(qmlObject); @@ -931,8 +933,9 @@ QObject *QmlObjectCreator::createInstance(int index, QObject *parent) } else { const QV4::CompiledData::Object *obj = qmlUnit->objectAt(index); - QQmlCompiledData::TypeReference typeRef = resolvedTypes.value(obj->inheritedTypeNameIndex); - QQmlType *type = typeRef.type; + QQmlCompiledData::TypeReference *typeRef = resolvedTypes.value(obj->inheritedTypeNameIndex); + Q_ASSERT(typeRef); + QQmlType *type = typeRef->type; if (type) { instance = type->create(); if (!instance) { @@ -950,13 +953,13 @@ QObject *QmlObjectCreator::createInstance(int index, QObject *parent) customParser = type->customParser(); } else { - Q_ASSERT(typeRef.component); - if (typeRef.component->qmlUnit->isSingleton()) + Q_ASSERT(typeRef->component); + if (typeRef->component->qmlUnit->isSingleton()) { recordError(obj->location, tr("Composite Singleton Type %1 is not creatable").arg(stringAt(obj->inheritedTypeNameIndex))); return 0; } - QmlObjectCreator subCreator(context, typeRef.component); + QmlObjectCreator subCreator(context, typeRef->component); instance = subCreator.create(); if (!instance) { errors += subCreator.errors; diff --git a/src/qml/qml/qqmlobjectcreator_p.h b/src/qml/qml/qqmlobjectcreator_p.h index a198396467..951c3a2eed 100644 --- a/src/qml/qml/qqmlobjectcreator_p.h +++ b/src/qml/qml/qqmlobjectcreator_p.h @@ -86,7 +86,7 @@ private: const QV4::CompiledData::CompilationUnit *jsUnit; QQmlContextData *parentContext; QQmlContextData *context; - const QHash<int, QQmlCompiledData::TypeReference> resolvedTypes; + const QHash<int, QQmlCompiledData::TypeReference*> resolvedTypes; const QVector<QQmlPropertyCache *> propertyCaches; const QVector<QByteArray> vmeMetaObjectData; QHash<int, int> objectIndexToId; |