aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/qml/qqmlobjectcreator.cpp44
-rw-r--r--src/qml/qml/qqmlobjectcreator_p.h6
2 files changed, 22 insertions, 28 deletions
diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp
index 4746188a8f..7455a486db 100644
--- a/src/qml/qml/qqmlobjectcreator.cpp
+++ b/src/qml/qml/qqmlobjectcreator.cpp
@@ -1462,7 +1462,7 @@ QQmlComponentAndAliasResolver::QQmlComponentAndAliasResolver(const QUrl &url, co
bool QQmlComponentAndAliasResolver::resolve()
{
- Q_ASSERT(componentRoots.isEmpty());
+ QVector<int> componentRoots;
// Find objects that are Components. This is missing an extra pass
// that finds implicitly defined components, i.e.
@@ -1482,30 +1482,29 @@ bool QQmlComponentAndAliasResolver::resolve()
continue;
componentRoots.append(i);
- // Sanity checks: There can be only an (optional) id property and
- // a default property, that defines the component tree.
- }
- std::sort(componentRoots.begin(), componentRoots.end());
+ if (obj->nFunctions > 0)
+ COMPILE_EXCEPTION(obj, tr("Component objects cannot declare new functions."));
+ if (obj->nProperties > 0)
+ COMPILE_EXCEPTION(obj, tr("Component objects cannot declare new properties."));
+ if (obj->nSignals > 0)
+ COMPILE_EXCEPTION(obj, tr("Component objects cannot declare new signals."));
- // For each component's tree, remember to which component the children
- // belong to
- for (int i = 0; i < componentRoots.count(); ++i) {
- const QV4::CompiledData::Object *component = qmlUnit->objectAt(componentRoots.at(i));
+ if (obj->nBindings == 0)
+ COMPILE_EXCEPTION(obj, tr("Cannot create empty component specification"));
+
+ const QV4::CompiledData::Binding *rootBinding = obj->bindingTable();
+ if (obj->nBindings > 1 || rootBinding->type != QV4::CompiledData::Binding::Type_Object)
+ COMPILE_EXCEPTION(rootBinding, tr("Component elements may not contain properties other than id"));
- if (component->nFunctions > 0)
- COMPILE_EXCEPTION(component, tr("Component objects cannot declare new functions."));
- if (component->nProperties > 0)
- COMPILE_EXCEPTION(component, tr("Component objects cannot declare new properties."));
- if (component->nSignals > 0)
- COMPILE_EXCEPTION(component, tr("Component objects cannot declare new signals."));
+ componentBoundaries.append(rootBinding->value.objectIndex);
+ }
- if (component->nBindings == 0)
- COMPILE_EXCEPTION(component, tr("Cannot create empty component specification"));
+ std::sort(componentBoundaries.begin(), componentBoundaries.end());
+ for (int i = 0; i < componentRoots.count(); ++i) {
+ const QV4::CompiledData::Object *component = qmlUnit->objectAt(componentRoots.at(i));
const QV4::CompiledData::Binding *rootBinding = component->bindingTable();
- if (component->nBindings > 1 || rootBinding->type != QV4::CompiledData::Binding::Type_Object)
- COMPILE_EXCEPTION(rootBinding, tr("Component elements may not contain properties other than id"));
_componentIndex = i;
_idToObjectIndex.clear();
@@ -1538,11 +1537,6 @@ bool QQmlComponentAndAliasResolver::collectIdsAndAliases(int objectIndex)
{
const QV4::CompiledData::Object *obj = qmlUnit->objectAt(objectIndex);
- // Only include creatable types. Everything else is synthetic, such as group property
- // objects.
- if (_componentIndex != -1 && !stringAt(obj->inheritedTypeNameIndex).isEmpty())
- objectIndexToComponentIndex.insert(objectIndex, _componentIndex);
-
QString id = stringAt(obj->idIndex);
if (!id.isEmpty()) {
if (_idToObjectIndex.contains(obj->idIndex)) {
@@ -1568,7 +1562,7 @@ bool QQmlComponentAndAliasResolver::collectIdsAndAliases(int objectIndex)
continue;
// Stop at Component boundary
- if (std::binary_search(componentRoots.constBegin(), componentRoots.constEnd(), binding->value.objectIndex))
+ if (std::binary_search(componentBoundaries.constBegin(), componentBoundaries.constEnd(), binding->value.objectIndex))
continue;
if (!collectIdsAndAliases(binding->value.objectIndex))
diff --git a/src/qml/qml/qqmlobjectcreator_p.h b/src/qml/qml/qqmlobjectcreator_p.h
index 900749a476..799329d8de 100644
--- a/src/qml/qml/qqmlobjectcreator_p.h
+++ b/src/qml/qml/qqmlobjectcreator_p.h
@@ -93,9 +93,6 @@ public:
bool resolve();
- QVector<int> componentRoots;
- QHash<int, int> objectIndexToComponentIndex;
-
protected:
bool collectIdsAndAliases(int objectIndex);
bool resolveAliases();
@@ -103,6 +100,9 @@ protected:
bool isComponentType(int typeNameIndex) const
{ return resolvedTypes.value(typeNameIndex).type == 0; }
+ // indices of objects that are of type QQmlComponent
+ QVector<int> componentBoundaries;
+
int _componentIndex;
QHash<int, int> _idToObjectIndex;
QHash<int, int> *_objectIndexToIdInScope;