Commit 1a9c69dd authored by Christian Kamm's avatar Christian Kamm
Browse files

QmlJS: Fix crash when opening JS files.

Now that Contexts are cached, it needs to be copyable. However, the
ScopeChain has a QmlComponentChain member that owns resources and didn't
have a correct copy constructor or copy assignment operator.

I've made QmlComponentChain non-copyable and store a shared pointer to
an instance instead, as it will generally not change for a given
context.

Reviewed-by: Lasse Holmstedt
parent a14fa23c
......@@ -1392,15 +1392,17 @@ void ScopeChain::update()
// the root scope in js files doesn't see instantiating components
if (jsScopes.count() != 1 || !qmlScopeObjects.isEmpty()) {
foreach (QmlComponentChain *parent, qmlComponentScope.instantiatingComponents)
parent->add(&_all);
if (qmlComponentScope) {
foreach (QmlComponentChain *parent, qmlComponentScope->instantiatingComponents)
parent->add(&_all);
}
}
ObjectValue *root = 0;
ObjectValue *ids = 0;
if (qmlComponentScope.document) {
root = qmlComponentScope.document->bind()->rootObjectValue();
ids = qmlComponentScope.document->bind()->idEnvironment();
if (qmlComponentScope && qmlComponentScope->document) {
root = qmlComponentScope->document->bind()->rootObjectValue();
ids = qmlComponentScope->document->bind()->idEnvironment();
}
if (root && !qmlScopeObjects.contains(root))
......
......@@ -242,8 +242,10 @@ class QMLJS_EXPORT ScopeChain
public:
ScopeChain();
struct QmlComponentChain
class QmlComponentChain
{
Q_DISABLE_COPY(QmlComponentChain)
public:
QmlComponentChain();
~QmlComponentChain();
......@@ -255,7 +257,7 @@ public:
};
const ObjectValue *globalScope;
QmlComponentChain qmlComponentScope;
QSharedPointer<QmlComponentChain> qmlComponentScope;
QList<const ObjectValue *> qmlScopeObjects;
const ObjectValue *qmlTypes;
QList<const ObjectValue *> jsScopes;
......
......@@ -83,10 +83,10 @@ void Link::initializeScopeChain()
Bind *bind = _doc->bind();
QHash<Document *, ScopeChain::QmlComponentChain *> componentScopes;
scopeChain.qmlComponentScope = QSharedPointer<ScopeChain::QmlComponentChain>(new ScopeChain::QmlComponentChain());
if (_doc->qmlProgram()) {
scopeChain.qmlComponentScope.clear();
componentScopes.insert(_doc.data(), &scopeChain.qmlComponentScope);
makeComponentChain(_doc, &scopeChain.qmlComponentScope, &componentScopes);
componentScopes.insert(_doc.data(), scopeChain.qmlComponentScope.data());
makeComponentChain(_doc, scopeChain.qmlComponentScope.data(), &componentScopes);
if (const ObjectValue *typeEnvironment = _context->typeEnvironment(_doc.data()))
scopeChain.qmlTypes = typeEnvironment;
......@@ -97,7 +97,7 @@ void Link::initializeScopeChain()
if (_doc->fileName() == fileImport.name) {
ScopeChain::QmlComponentChain *component = new ScopeChain::QmlComponentChain;
componentScopes.insert(otherDoc.data(), component);
scopeChain.qmlComponentScope.instantiatingComponents += component;
scopeChain.qmlComponentScope->instantiatingComponents += component;
makeComponentChain(otherDoc, component, &componentScopes);
}
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment