Fix XmlListModel memory leak
authorAri Koivisto <ari.koivisto@gmail.com>
Wed, 3 Oct 2012 16:29:33 +0000 (19:29 +0300)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Sun, 14 Oct 2012 20:58:42 +0000 (22:58 +0200)
This is a forward port of a memory leak fix committed to
Qt 4.8 (QTBUG-15191). The fix includes all changes except
changes to qitem_p.h which has changed in Qt 5.0. Additionally
fix qxmlquery autotest failure introduced in the original
Qt 4.8 patch.

Task-number: QTBUG-27357
Change-Id: Ia0e916d9d6bccea014d28920cef48d6e47e8f04f
Reviewed-by: Sergio Ahumada <sergio.ahumada@digia.com>
src/xmlpatterns/expr/qdynamiccontextstore.cpp
src/xmlpatterns/expr/qdynamiccontextstore_p.h
src/xmlpatterns/expr/qevaluationcache_p.h
src/xmlpatterns/expr/qevaluationcache_tpl_p.h
src/xmlpatterns/expr/qletclause.cpp
tests/auto/qxmlquery/tst_qxmlquery.cpp
tests/auto/xmlpatternsdiagnosticsts/xmlpatternsdiagnosticsts.pro
tests/auto/xmlpatternsschemats/xmlpatternsschemats.pro
tests/auto/xmlpatternsxqts/xmlpatternsxqts.pro

index 3879cd6..2089456 100644 (file)
@@ -51,24 +51,24 @@ using namespace QPatternist;
 
 DynamicContextStore::DynamicContextStore(const Expression::Ptr &operand,
                                          const DynamicContext::Ptr &context) : SingleContainer(operand),
-                                                                               m_context(context)
+                                                                               m_context(context.data())
 {
     Q_ASSERT(context);
 }
 
 bool DynamicContextStore::evaluateEBV(const DynamicContext::Ptr &) const
 {
-    return m_operand->evaluateEBV(m_context);
+    return m_operand->evaluateEBV(DynamicContext::Ptr(m_context));
 }
 
 Item::Iterator::Ptr DynamicContextStore::evaluateSequence(const DynamicContext::Ptr &) const
 {
-    return m_operand->evaluateSequence(m_context);
+    return m_operand->evaluateSequence(DynamicContext::Ptr(m_context));
 }
 
 Item DynamicContextStore::evaluateSingleton(const DynamicContext::Ptr &) const
 {
-    return m_operand->evaluateSingleton(m_context);
+    return m_operand->evaluateSingleton(DynamicContext::Ptr(m_context));
 }
 
 SequenceType::Ptr DynamicContextStore::staticType() const
index d76e130..ffd4e36 100644 (file)
@@ -86,7 +86,7 @@ namespace QPatternist
         virtual const SourceLocationReflection *actualReflection() const;
 
     private:
-        const DynamicContext::Ptr m_context;
+        DynamicContext *m_context;
     };
 }
 
index 6f49115..2dc8940 100644 (file)
@@ -124,7 +124,7 @@ namespace QPatternist
 
     private:
         static DynamicContext::Ptr topFocusContext(const DynamicContext::Ptr &context);
-        const VariableDeclaration::Ptr  m_declaration;
+        const VariableDeclaration*  m_declaration;
         /**
          * This variable must not be called m_slot. If it so, a compiler bug on
          * HP-UX-aCC-64 is triggered in the constructor initializor. See the
index 286c077..7aa0ae1 100644 (file)
@@ -49,7 +49,7 @@ template<bool IsForGlobal>
 EvaluationCache<IsForGlobal>::EvaluationCache(const Expression::Ptr &op,
                                               const VariableDeclaration::Ptr &varDecl,
                                               const VariableSlotID aSlot) : SingleContainer(op)
-                                                                          , m_declaration(varDecl)
+                                                                          , m_declaration(varDecl.constData())
                                                                           , m_varSlot(aSlot)
 {
     Q_ASSERT(m_declaration);
index 3b3ee07..0caa86e 100644 (file)
@@ -60,7 +60,7 @@ LetClause::LetClause(const Expression::Ptr &operand1,
 
 DynamicContext::Ptr LetClause::bindVariable(const DynamicContext::Ptr &context) const
 {
-    context->setExpressionVariable(m_varDecl->slot, Expression::Ptr(new DynamicContextStore(m_operand1, context)));
+    context->setExpressionVariable(m_varDecl->slot, m_operand1);
     return context;
 }
 
index 928d67b..23af7a2 100644 (file)
@@ -3305,7 +3305,7 @@ void tst_QXmlQuery::bindVariableQXmlQueryInvalidate() const
     QXmlQuery query2;
     query2.setQuery("'query2'");
 
-    query.bindVariable(QLatin1String("name"), query);
+    query.bindVariable(QLatin1String("name"), query2);
     QVERIFY(!query.isValid());
 }
 
index b534495..f8904cc 100644 (file)
@@ -24,4 +24,7 @@ wince* {
    catalog.path = .
    DEPLOYMENT += catalog
 }
+
 DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
+requires(contains(QT_CONFIG,private_tests))
+
index c9fe689..a1e7896 100644 (file)
@@ -21,4 +21,7 @@ QT += xml testlib
 INCLUDEPATH += \
     ../xmlpatternsxqts \
     ../xmlpatternssdk
+
 DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
+requires(contains(QT_CONFIG,private_tests))
+
index f6d492e..41e9c68 100644 (file)
@@ -17,3 +17,5 @@ INCLUDEPATH += $$(QTDIR)/include/QtXmlPatterns/private      \
 QT += xml testlib
 TARGET = tst_xmlpatternsxqts
 DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
+requires(contains(QT_CONFIG,private_tests))
+