From 500474fcd985893da0b675e24298ac98c29f8a76 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Thu, 30 Apr 2009 15:22:33 +1000 Subject: Fix crash in QmlDomDocument::load() --- src/declarative/qml/qmlcompositetypemanager_p.h | 2 ++ src/declarative/qml/qmldom.cpp | 20 +++++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/declarative/qml/qmlcompositetypemanager_p.h b/src/declarative/qml/qmlcompositetypemanager_p.h index ffa4fda..bc86fcf 100644 --- a/src/declarative/qml/qmlcompositetypemanager_p.h +++ b/src/declarative/qml/qmlcompositetypemanager_p.h @@ -52,6 +52,7 @@ class QmlEngine; class QmlCompiledComponent; class QmlComponentPrivate; class QmlComponent; +class QmlDomDocument; struct QmlCompositeTypeData : public QmlRefCount { QmlCompositeTypeData(); @@ -98,6 +99,7 @@ struct QmlCompositeTypeData : public QmlRefCount private: friend class QmlCompositeTypeManager; friend class QmlCompiler; + friend class QmlDomDocument; QmlScriptParser data; QList waiters; diff --git a/src/declarative/qml/qmldom.cpp b/src/declarative/qml/qmldom.cpp index 72c1c76..4e8e1f7 100644 --- a/src/declarative/qml/qmldom.cpp +++ b/src/declarative/qml/qmldom.cpp @@ -42,6 +42,7 @@ #include "qmldom.h" #include "qmldom_p.h" #include "private/qmlcompiler_p.h" +#include "private/qmlengine_p.h" #include "qmlcompiledcomponent_p.h" #include #include @@ -159,15 +160,28 @@ bool QmlDomDocument::load(QmlEngine *engine, const QByteArray &data) QmlCompiledComponent component; QmlCompiler compiler; - // ### -// compiler.compile(engine, parser, &component); + + QmlCompositeTypeData *td = ((QmlEnginePrivate *)QmlEnginePrivate::get(engine))->typeManager.getImmediate(data, QUrl());; + + if(td->status == QmlCompositeTypeData::Error) { + d->error = td->errorDescription; + td->release(); + return false; + } else if(td->status == QmlCompositeTypeData::Waiting) { + d->error = QLatin1String("QmlDomDocument supports local types only"); + td->release(); + return false; + } + + compiler.compile(engine, td, &component); if (compiler.isError()) { d->error = compiler.errorDescription(); + td->release(); return false; } - if (parser.tree()) { + if (td->data.tree()) { component.dump(0, parser.tree()); d->root = parser.tree(); d->root->addref(); -- cgit v0.12