forked from qt-creator/qt-creator
		
	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
This commit is contained in:
		| @@ -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); | ||||
|                 } | ||||
|             } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user