You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by db...@apache.org on 2010/08/28 20:28:34 UTC

svn commit: r990403 - in /xalan/c/trunk/src/xalanc: XPath/XObjectFactory.hpp XPath/XObjectFactoryDefault.cpp XPath/XObjectFactoryDefault.hpp XalanExtensions/FunctionNodeSet.cpp

Author: dbertoni
Date: Sat Aug 28 18:28:34 2010
New Revision: 990403

URL: http://svn.apache.org/viewvc?rev=990403&view=rev
Log:
Fix for XALANC-705.

Modified:
    xalan/c/trunk/src/xalanc/XPath/XObjectFactory.hpp
    xalan/c/trunk/src/xalanc/XPath/XObjectFactoryDefault.cpp
    xalan/c/trunk/src/xalanc/XPath/XObjectFactoryDefault.hpp
    xalan/c/trunk/src/xalanc/XalanExtensions/FunctionNodeSet.cpp

Modified: xalan/c/trunk/src/xalanc/XPath/XObjectFactory.hpp
URL: http://svn.apache.org/viewvc/xalan/c/trunk/src/xalanc/XPath/XObjectFactory.hpp?rev=990403&r1=990402&r2=990403&view=diff
==============================================================================
--- xalan/c/trunk/src/xalanc/XPath/XObjectFactory.hpp (original)
+++ xalan/c/trunk/src/xalanc/XPath/XObjectFactory.hpp Sat Aug 28 18:28:34 2010
@@ -223,6 +223,17 @@ public:
     createUnknown(const XalanDOMString&     theValue) = 0;
 
     /**
+     * Hold a reference to an XObject instance until the
+     * factory is reset. This is needed in a very few cases
+     * when the object lifetime needs to extend after the
+     * execution of an XPath expression.
+     * 
+     * @param theValue  The XObjectPtr instance.
+     */
+    virtual void
+    holdReference(XObjectPtr    theValue) = 0;
+
+    /**
      *
      * A public functor for use with stl algorithms.
      *

Modified: xalan/c/trunk/src/xalanc/XPath/XObjectFactoryDefault.cpp
URL: http://svn.apache.org/viewvc/xalan/c/trunk/src/xalanc/XPath/XObjectFactoryDefault.cpp?rev=990403&r1=990402&r2=990403&view=diff
==============================================================================
--- xalan/c/trunk/src/xalanc/XPath/XObjectFactoryDefault.cpp (original)
+++ xalan/c/trunk/src/xalanc/XPath/XObjectFactoryDefault.cpp Sat Aug 28 18:28:34 2010
@@ -61,7 +61,8 @@ XObjectFactoryDefault::XObjectFactoryDef
     m_xnodesetCache(theManager),
     m_xstringCache(theManager),
     m_xbooleanFalse(false, theManager),
-    m_xbooleanTrue(true, theManager)
+    m_xbooleanTrue(true, theManager),
+    m_references(theManager)
 {
 }
 
@@ -470,8 +471,18 @@ XObjectFactoryDefault::createString(GetC
 
 
 void
+XObjectFactoryDefault::holdReference(XObjectPtr    theValue)
+{
+    m_references.push_back(theValue);
+}
+
+
+
+void
 XObjectFactoryDefault::reset()
 {
+    m_references.clear();
+
     m_xstringAdapterAllocator.reset();
 
     m_xstringAllocator.reset();

Modified: xalan/c/trunk/src/xalanc/XPath/XObjectFactoryDefault.hpp
URL: http://svn.apache.org/viewvc/xalan/c/trunk/src/xalanc/XPath/XObjectFactoryDefault.hpp?rev=990403&r1=990402&r2=990403&view=diff
==============================================================================
--- xalan/c/trunk/src/xalanc/XPath/XObjectFactoryDefault.hpp (original)
+++ xalan/c/trunk/src/xalanc/XPath/XObjectFactoryDefault.hpp Sat Aug 28 18:28:34 2010
@@ -154,6 +154,9 @@ public:
     virtual const XObjectPtr
     createUnknown(const XalanDOMString&     theValue);
 
+    virtual void
+    holdReference(XObjectPtr    theValue);
+
     typedef XalanVector<XObject*>       XObjectCollectionType;
     typedef XalanVector<XNumber*>       XNumberCacheType;
     typedef XalanVector<XNodeSet*>      XNodeSetCacheType;
@@ -211,6 +214,8 @@ private:
     XBoolean                        m_xbooleanFalse;
 
     XBoolean                        m_xbooleanTrue;
+
+    XalanVector<XObjectPtr>         m_references;
 };
 
 

Modified: xalan/c/trunk/src/xalanc/XalanExtensions/FunctionNodeSet.cpp
URL: http://svn.apache.org/viewvc/xalan/c/trunk/src/xalanc/XalanExtensions/FunctionNodeSet.cpp?rev=990403&r1=990402&r2=990403&view=diff
==============================================================================
--- xalan/c/trunk/src/xalanc/XalanExtensions/FunctionNodeSet.cpp (original)
+++ xalan/c/trunk/src/xalanc/XalanExtensions/FunctionNodeSet.cpp Sat Aug 28 18:28:34 2010
@@ -148,10 +148,13 @@ FunctionNodeSet::execute(
     if (theType == XObject::eTypeResultTreeFrag ||
         (theType == XObject::eTypeString && m_convertString == true))
     {
-        return XObjectPtr(
-                    XalanDocumentFragmentXNodeSetBaseProxy::create(
-                        executionContext,
-                        args[0]));
+        const XObjectPtr    theResult(
+                        XalanDocumentFragmentXNodeSetBaseProxy::create(
+                            executionContext,
+                            args[0]));
+        executionContext.getXObjectFactory().holdReference(theResult);
+
+        return theResult;
     }
     else
     {



---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org