diff options
author | Niklas Kurkisuo <ext-niklas.kurkisuo@nokia.com> | 2010-12-03 11:50:36 (GMT) |
---|---|---|
committer | David Boddie <david.boddie@nokia.com> | 2011-05-13 13:56:29 (GMT) |
commit | 23267553627ac3c4cbcd918283bee8e665deeff9 (patch) | |
tree | 9301d656c9cd80c81192538231f0731c0b3c7850 /src/xmlpatterns/parser | |
parent | 3d27a19ca009836b812b59c3359db1369d391181 (diff) | |
download | Qt-23267553627ac3c4cbcd918283bee8e665deeff9.zip Qt-23267553627ac3c4cbcd918283bee8e665deeff9.tar.gz Qt-23267553627ac3c4cbcd918283bee8e665deeff9.tar.bz2 |
Fix memory leak in QXmlQuery::setQuery.
There is a circular reference dependency between VariableDeclaration
and the classes EvaluationCache, ExpressionVariableReference and
TemplateParameterReference. By removing the explicitly shared pointer
of VariableDeclaration in these classes the circle is broken and memory
is freed correctly.
Task-number: QT-4106
Integrated-by: David Boddie
Diffstat (limited to 'src/xmlpatterns/parser')
-rw-r--r-- | src/xmlpatterns/parser/qquerytransformparser.cpp | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/src/xmlpatterns/parser/qquerytransformparser.cpp b/src/xmlpatterns/parser/qquerytransformparser.cpp index 4858e11..f937904 100644 --- a/src/xmlpatterns/parser/qquerytransformparser.cpp +++ b/src/xmlpatterns/parser/qquerytransformparser.cpp @@ -988,9 +988,9 @@ static Expression::Ptr pushVariable(const QXmlName name, * In some cases the EvaluationCache instance isn't necessary, but in those cases EvaluationCache * optimizes itself away. */ if(type == VariableDeclaration::ExpressionVariable) - checked = create(new EvaluationCache<false>(checked, var, parseInfo->allocateCacheSlot()), sourceLocator, parseInfo); + checked = create(new EvaluationCache<false>(checked, var.data(), parseInfo->allocateCacheSlot()), sourceLocator, parseInfo); else if(type == VariableDeclaration::GlobalVariable) - checked = create(new EvaluationCache<true>(checked, var, parseInfo->allocateCacheSlot()), sourceLocator, parseInfo); + checked = create(new EvaluationCache<true>(checked, var.data(), parseInfo->allocateCacheSlot()), sourceLocator, parseInfo); var->setExpression(checked); @@ -1042,7 +1042,7 @@ static Expression::Ptr resolveVariable(const QXmlName &name, * mechanism must. */ case VariableDeclaration::ExpressionVariable: { - retval = create(new ExpressionVariableReference(var->slot, var), sourceLocator, parseInfo); + retval = create(new ExpressionVariableReference(var->slot, var.data()), sourceLocator, parseInfo); break; } case VariableDeclaration::FunctionArgument: @@ -1057,7 +1057,7 @@ static Expression::Ptr resolveVariable(const QXmlName &name, } case VariableDeclaration::TemplateParameter: { - retval = create(new TemplateParameterReference(var), sourceLocator, parseInfo); + retval = create(new TemplateParameterReference(var.data()), sourceLocator, parseInfo); break; } case VariableDeclaration::ExternalVariable: |