dbertoni    00/07/28 15:02:05

  Modified:    c/src/XPath FunctionID.hpp MutableNodeRefList.cpp
                        MutableNodeRefList.hpp NodeRefList.cpp
                        NodeRefList.hpp NodeRefListBase.hpp
                        SimpleNodeLocator.cpp XBoolean.cpp XBoolean.hpp
                        XNodeSet.cpp XNodeSet.hpp XNull.cpp XNull.hpp
                        XNumber.cpp XNumber.hpp XObject.hpp
                        XObjectFactory.hpp XObjectFactoryDefault.cpp
                        XObjectFactoryDefault.hpp XPath.cpp
                        XPathExecutionContext.hpp
                        XPathExecutionContextDefault.cpp
                        XPathExecutionContextDefault.hpp
                        XResultTreeFrag.cpp XResultTreeFrag.hpp XSpan.cpp
                        XSpan.hpp XString.cpp XString.hpp XUnknown.cpp
                        XUnknown.hpp
  Log:
  Changes for reducing dynamic allocations.
  
  Revision  Changes    Path
  1.9       +7 -3      xml-xalan/c/src/XPath/FunctionID.hpp
  
  Index: FunctionID.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/FunctionID.hpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- FunctionID.hpp    2000/05/05 15:12:17     1.8
  +++ FunctionID.hpp    2000/07/28 22:01:51     1.9
  @@ -146,7 +146,11 @@
                assert(theDocContext != 0);
   
                // This list will hold the nodes we find.
  -             MutableNodeRefList      
theNodeList(executionContext.createMutableNodeRefList());
  +#if !defined(XALAN_NO_NAMESPACES)
  +             using std::auto_ptr;
  +#endif
  +
  +             auto_ptr<MutableNodeRefList>    
theNodeList(executionContext.createMutableNodeRefList());
   
                // If there is no context, we cannot continue.
                if(0 == theDocContext)
  @@ -188,14 +192,14 @@
   
                                                if (theNode != 0)
                                                {
  -                                                     
theNodeList.addNodeInDocOrder(theNode, true);
  +                                                     
theNodeList->addNodeInDocOrder(theNode, true);
                                                }
                                        }
                                }
                        }
                }
   
  -             return 
executionContext.getXObjectFactory().createNodeSet(theNodeList);
  +             return 
executionContext.getXObjectFactory().createNodeSet(theNodeList.release());
        }
   
   #if defined(XALAN_NO_COVARIANT_RETURN_TYPE)
  
  
  
  1.14      +25 -0     xml-xalan/c/src/XPath/MutableNodeRefList.cpp
  
  Index: MutableNodeRefList.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/MutableNodeRefList.cpp,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- MutableNodeRefList.cpp    2000/07/27 20:31:29     1.13
  +++ MutableNodeRefList.cpp    2000/07/28 22:01:51     1.14
  @@ -369,10 +369,19 @@
   void
   MutableNodeRefList::clearNulls()
   {
  +#if 1
   #if !defined(XALAN_NO_NAMESPACES)
        using std::remove;
   #endif
   
  +     m_nodeList.erase(
  +             remove(
  +                     m_nodeList.begin(),
  +                     m_nodeList.end(), 
  +                     NodeListVectorType::value_type(0)),
  +             m_nodeList.end());
  +
  +#else
        NodeListVectorType::iterator    i =
                m_nodeList.begin();
   
  @@ -394,6 +403,7 @@
                        ++i;
                }
        }
  +#endif
   
        assert(checkForDuplicates() == false);
   }
  @@ -405,3 +415,18 @@
   {
        return m_support;
   }
  +
  +
  +
  +#if defined(XALAN_NO_COVARIANT_RETURN_TYPE)
  +NodeRefListBase*
  +#else
  +MutableNodeRefList*
  +#endif
  +MutableNodeRefList::clone() const
  +{
  +     return new MutableNodeRefList(*this);
  +}
  +
  +
  +
  
  
  
  1.10      +7 -0      xml-xalan/c/src/XPath/MutableNodeRefList.hpp
  
  Index: MutableNodeRefList.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/MutableNodeRefList.hpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- MutableNodeRefList.hpp    2000/07/27 20:31:29     1.9
  +++ MutableNodeRefList.hpp    2000/07/28 22:01:51     1.10
  @@ -224,6 +224,13 @@
        virtual XPathSupport*
        getSupport() const;
   
  +#if defined(XALAN_NO_COVARIANT_RETURN_TYPE)
  +     virtual NodeRefListBase*
  +#else
  +     virtual MutableNodeRefList*
  +#endif
  +     clone() const;
  +
   private:
   
        XPathSupport*   m_support;
  
  
  
  1.8       +12 -0     xml-xalan/c/src/XPath/NodeRefList.cpp
  
  Index: NodeRefList.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/NodeRefList.cpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- NodeRefList.cpp   2000/07/21 19:50:02     1.7
  +++ NodeRefList.cpp   2000/07/28 22:01:52     1.8
  @@ -191,6 +191,18 @@
   
   
   
  +#if defined(XALAN_NO_COVARIANT_RETURN_TYPE)
  +NodeRefListBase*
  +#else
  +NodeRefList*
  +#endif
  +NodeRefList::clone() const
  +{
  +     return new NodeRefList(*this);
  +}
  +
  +
  +
   #if !defined(NDEBUG)
   bool
   NodeRefList::checkForDuplicates() const
  
  
  
  1.9       +7 -0      xml-xalan/c/src/XPath/NodeRefList.hpp
  
  Index: NodeRefList.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/NodeRefList.hpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- NodeRefList.hpp   2000/07/21 19:50:02     1.8
  +++ NodeRefList.hpp   2000/07/28 22:01:52     1.9
  @@ -122,6 +122,13 @@
        virtual XPathSupport*
        getSupport() const;
   
  +#if defined(XALAN_NO_COVARIANT_RETURN_TYPE)
  +     virtual NodeRefListBase*
  +#else
  +     virtual NodeRefList*
  +#endif
  +     clone() const;
  +
   #if !defined(NDEBUG)
        bool
        checkForDuplicates() const;
  
  
  
  1.6       +3 -0      xml-xalan/c/src/XPath/NodeRefListBase.hpp
  
  Index: NodeRefListBase.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/NodeRefListBase.hpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- NodeRefListBase.hpp       2000/04/11 14:46:10     1.5
  +++ NodeRefListBase.hpp       2000/07/28 22:01:52     1.6
  @@ -122,6 +122,9 @@
        virtual XPathSupport*
        getSupport() const = 0;
   
  +     virtual NodeRefListBase*
  +     clone() const = 0;
  +
   #if defined(XALAN_INLINE_INITIALIZATION)
        static const unsigned int       npos = UINT_MAX;
   #else
  
  
  
  1.19      +48 -39    xml-xalan/c/src/XPath/SimpleNodeLocator.cpp
  
  Index: SimpleNodeLocator.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/SimpleNodeLocator.cpp,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- SimpleNodeLocator.cpp     2000/07/27 20:35:23     1.18
  +++ SimpleNodeLocator.cpp     2000/07/28 22:01:52     1.19
  @@ -110,22 +110,23 @@
   
   XObject*
   SimpleNodeLocator::connectToNodes(
  -                     const XPath&                                    xpath,
  +                     const XPath&                                    /* 
xpath */,
                        XPathExecutionContext&                  
executionContext,
                        XalanNode&                                              
/* context */, 
  -                     int                                                     
opPos,
  +                     int                                                     
/* opPos */,
                        const ConnectArgsVectorType&    connectArgs)
   {
        assert(connectArgs.size() > 0 && connectArgs.size() < 3);
   
  -     const XPathExpression&  currentExpression =
  -             xpath.getExpression();
  -
        XObjectFactory&                 theFactory =
                executionContext.getXObjectFactory();
   
        XObjectGuard                    results(theFactory,
  -                                                                     
theFactory.createNodeSet(MutableNodeRefList()));
  +                                                                     
theFactory.createNodeSet(executionContext.createMutableNodeRefList()));
  +
  +#if 0
  +     const XPathExpression&  currentExpression =
  +             xpath.getExpression();
   
        const XalanDOMString    theFileSpec = connectArgs[0]->str();
   
  @@ -197,6 +198,7 @@
        {
                executionContext.warn("No files matched the file 
specification!");
        }
  +#endif
   
        return results.release();
   }
  @@ -210,11 +212,15 @@
                        XalanNode&                              context, 
                        int                                     opPos)
   {
  -     MutableNodeRefList      
mnl(executionContext.createMutableNodeRefList());
  +#if !defined(XALAN_NO_NAMESPACES)
  +     using std::auto_ptr;
  +#endif
  +
  +     auto_ptr<MutableNodeRefList>    
mnl(executionContext.createMutableNodeRefList());
   
  -     step(xpath, executionContext, &context, opPos + 2, mnl);
  +     step(xpath, executionContext, &context, opPos + 2, *mnl.get());
   
  -     return executionContext.getXObjectFactory().createNodeSet(mnl);
  +     return 
executionContext.getXObjectFactory().createNodeSet(mnl.release());
   }
   
   
  @@ -252,9 +258,10 @@
   
        int                             argLen = 0;
   
  -     MutableNodeRefList      
subQueryResults(executionContext.createMutableNodeRefList());
  -//   MutableNodeRefList      queryResults(subQueryResults);
  +     typedef XPathExecutionContext::BorrowReturnMutableNodeRefList   
BorrowReturnMutableNodeRefList;
   
  +     BorrowReturnMutableNodeRefList  subQueryResults(executionContext);
  +
        bool                            shouldReorder = false;
        bool                            continueStepRecursion = true;
   
  @@ -265,28 +272,28 @@
        case XPathExpression::eOP_FUNCTION:
        case XPathExpression::eOP_GROUP:
                argLen = findNodeSet(xpath, executionContext, context, opPos, 
  -                                                       stepType, 
subQueryResults);
  +                                                       stepType, 
*subQueryResults);
                break;
   
        case XPathExpression::eFROM_ROOT:
  -             argLen = findRoot(xpath, executionContext, context, opPos, 
stepType, subQueryResults);
  +             argLen = findRoot(xpath, executionContext, context, opPos, 
stepType, *subQueryResults);
                break;
   
        case XPathExpression::eFROM_PARENT:
  -             argLen = findParent(xpath, executionContext, context, opPos, 
stepType, subQueryResults);
  +             argLen = findParent(xpath, executionContext, context, opPos, 
stepType, *subQueryResults);
                break;
   
        case XPathExpression::eFROM_SELF:
  -             argLen = findSelf(xpath, executionContext, context, opPos, 
stepType, subQueryResults);
  +             argLen = findSelf(xpath, executionContext, context, opPos, 
stepType, *subQueryResults);
                break;
   
        case XPathExpression::eFROM_ANCESTORS:
  -             argLen = findAncestors(xpath, executionContext, context, opPos, 
stepType, subQueryResults);
  +             argLen = findAncestors(xpath, executionContext, context, opPos, 
stepType, *subQueryResults);
                shouldReorder = true;
                break;
   
        case XPathExpression::eFROM_ANCESTORS_OR_SELF:
  -             argLen = findAncestorsOrSelf(xpath, executionContext, context, 
opPos, stepType, subQueryResults);
  +             argLen = findAncestorsOrSelf(xpath, executionContext, context, 
opPos, stepType, *subQueryResults);
                shouldReorder = true;
                break;
   
  @@ -295,7 +302,7 @@
                // fall-through on purpose.
   
        case XPathExpression::eFROM_ATTRIBUTES:
  -             argLen = findAttributes(xpath, executionContext, context, 
opPos, stepType, subQueryResults);
  +             argLen = findAttributes(xpath, executionContext, context, 
opPos, stepType, *subQueryResults);
                break;
   
        case XPathExpression::eMATCH_ANY_ANCESTOR:
  @@ -305,45 +312,45 @@
                // fall-through on purpose.
   
        case XPathExpression::eFROM_CHILDREN:
  -             argLen = findChildren(xpath, executionContext, context, opPos, 
stepType, subQueryResults);
  +             argLen = findChildren(xpath, executionContext, context, opPos, 
stepType, *subQueryResults);
                break;
   
        case XPathExpression::eFROM_DESCENDANTS:
        case XPathExpression::eFROM_DESCENDANTS_OR_SELF:
  -             argLen = findDescendants(xpath, executionContext, context, 
opPos, stepType, subQueryResults);
  +             argLen = findDescendants(xpath, executionContext, context, 
opPos, stepType, *subQueryResults);
                break;
   
        case XPathExpression::eFROM_FOLLOWING:
  -             argLen = findFollowing(xpath, executionContext, context, opPos, 
stepType, subQueryResults);
  +             argLen = findFollowing(xpath, executionContext, context, opPos, 
stepType, *subQueryResults);
                break;
   
        case XPathExpression::eFROM_FOLLOWING_SIBLINGS:
  -             argLen = findFollowingSiblings(xpath, executionContext, 
context, opPos, stepType, subQueryResults);
  +             argLen = findFollowingSiblings(xpath, executionContext, 
context, opPos, stepType, *subQueryResults);
                break;
   
        case XPathExpression::eFROM_PRECEDING:
  -             argLen = findPreceeding(xpath, executionContext, context, 
opPos, stepType, subQueryResults);
  +             argLen = findPreceeding(xpath, executionContext, context, 
opPos, stepType, *subQueryResults);
                shouldReorder = true;
                break;
   
        case XPathExpression::eFROM_PRECEDING_SIBLINGS:
  -             argLen = findPreceedingSiblings(xpath, executionContext, 
context, opPos, stepType, subQueryResults);
  +             argLen = findPreceedingSiblings(xpath, executionContext, 
context, opPos, stepType, *subQueryResults);
                shouldReorder = true;
                break;
   
        case XPathExpression::eFROM_NAMESPACE:
  -             argLen = findNamespace(xpath, executionContext, context, opPos, 
 stepType, subQueryResults);
  +             argLen = findNamespace(xpath, executionContext, context, opPos, 
 stepType, *subQueryResults);
                break;
   
        default:
  -             argLen = findNodesOnUnknownAxis(xpath, executionContext, 
context, opPos, stepType, subQueryResults);
  +             argLen = findNodesOnUnknownAxis(xpath, executionContext, 
context, opPos, stepType, *subQueryResults);
                break;
        }
   
        // Push and pop the PrefixResolver...
        XPathExecutionContext::ContextNodeListSetAndRestore             
theSetAndRestore(
                                                                        
executionContext,
  -                                                                     
subQueryResults);
  +                                                                     
*subQueryResults);
   
        opPos += argLen;
   
  @@ -355,7 +362,7 @@
                                   executionContext,
                                   context,
                                   opPos, 
  -                                subQueryResults,
  +                                *subQueryResults,
                                   opPos);
   
                nextStepType = currentExpression.getOpCodeMapValue(opPos);
  @@ -363,25 +370,25 @@
   
        if(XPathExpression::eENDOP != nextStepType && continueStepRecursion == 
true)
        {
  -             const unsigned int      nContexts = subQueryResults.getLength();
  +             const unsigned int      nContexts = 
subQueryResults->getLength();
   
                for(unsigned int i = 0; i < nContexts; i++)
                {
  -                     XalanNode* const        node = subQueryResults.item(i);
  +                     XalanNode* const        node = subQueryResults->item(i);
   
                        if(0 != node)
                        {
  -                             MutableNodeRefList      
mnl(executionContext.createMutableNodeRefList());
  +                             BorrowReturnMutableNodeRefList  
mnl(executionContext);
   
  -                             step(xpath, executionContext, node, opPos, mnl);
  +                             step(xpath, executionContext, node, opPos, 
*mnl);
   
                                if(queryResults.getLength() == 0)
                                {
  -                                     queryResults = mnl;
  +                                     queryResults = *mnl;
                                }
                                else
                                {
  -                                     queryResults.addNodesInDocOrder(mnl);
  +                                     queryResults.addNodesInDocOrder(*mnl);
                                }
                        }
                }
  @@ -390,11 +397,11 @@
        {
                if (shouldReorder == true)
                {
  -                     queryResults.addNodesInDocOrder(subQueryResults);
  +                     queryResults.addNodesInDocOrder(*subQueryResults);
                }
                else
                {
  -                     queryResults = subQueryResults;
  +                     queryResults = *subQueryResults;
                }
        }
   }
  @@ -645,12 +652,14 @@
   
                        XalanNode* const        parentContext =
                                executionContext.getParentOfNode(*localContext);
  +
  +                     typedef 
XPathExecutionContext::BorrowReturnMutableNodeRefList   
BorrowReturnMutableNodeRefList;
   
  -                     MutableNodeRefList              
mnl(executionContext.createMutableNodeRefList());
  +                     BorrowReturnMutableNodeRefList  mnl(executionContext);
   
  -                     step(xpath, executionContext, parentContext, 
startOpPos, mnl);
  +                     step(xpath, executionContext, parentContext, 
startOpPos, *mnl);
   
  -                     if (mnl.indexOf(localContext) == 
MutableNodeRefList::npos)
  +                     if (mnl->indexOf(localContext) == 
MutableNodeRefList::npos)
                        {
                                score = xpath.s_MatchScoreNone;
                        }
  
  
  
  1.6       +0 -24     xml-xalan/c/src/XPath/XBoolean.cpp
  
  Index: XBoolean.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XBoolean.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- XBoolean.cpp      2000/07/13 22:47:13     1.5
  +++ XBoolean.cpp      2000/07/28 22:01:52     1.6
  @@ -197,30 +197,6 @@
   
   
   
  -const MutableNodeRefList&
  -XBoolean::mutableNodeset() const
  -{
  -     error("Can't cast XBoolean to MutableNodeRefList");
  -
  -     // error will throw, so this is just a dummy
  -     // value to satisfy the compiler.
  -     return reinterpret_cast<MutableNodeRefList&>(dummy);
  -}
  -
  -
  -
  -MutableNodeRefList&
  -XBoolean::mutableNodeset()
  -{
  -     error("Can't cast XBoolean to MutableNodeRefList");
  -
  -     // error will throw, so this is just a dummy
  -     // value to satisfy the compiler.
  -     return reinterpret_cast<MutableNodeRefList&>(dummy);
  -}
  -
  -
  -
   void
   XBoolean::ProcessXObjectTypeCallback(XObjectTypeCallback&    
theCallbackObject)
   {
  
  
  
  1.7       +0 -6      xml-xalan/c/src/XPath/XBoolean.hpp
  
  Index: XBoolean.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XBoolean.hpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- XBoolean.hpp      2000/07/13 22:47:14     1.6
  +++ XBoolean.hpp      2000/07/28 22:01:53     1.7
  @@ -120,12 +120,6 @@
        virtual const NodeRefListBase&
        nodeset() const;
   
  -     virtual const MutableNodeRefList&
  -     mutableNodeset() const;
  -
  -     virtual MutableNodeRefList&
  -     mutableNodeset();
  -
        virtual void
        ProcessXObjectTypeCallback(XObjectTypeCallback&         
theCallbackObject);
   
  
  
  
  1.11      +43 -38    xml-xalan/c/src/XPath/XNodeSet.cpp
  
  Index: XNodeSet.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XNodeSet.cpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- XNodeSet.cpp      2000/07/25 18:39:25     1.10
  +++ XNodeSet.cpp      2000/07/28 22:01:53     1.11
  @@ -69,6 +69,7 @@
   
   
   #include "ResultTreeFrag.hpp"
  +#include "MutableNodeRefList.hpp"
   #include "XObjectTypeCallback.hpp"
   #include "XPathEnvSupport.hpp"
   #include "XPathSupport.hpp"
  @@ -76,44 +77,64 @@
   
   
   XNodeSet::XNodeSet(
  -                     XPathEnvSupport&                envSupport,
  -                     XPathSupport&                   support,
  -                     const NodeRefListBase&  value) :
  +                     XPathEnvSupport&        envSupport,
  +                     XPathSupport&           support,
  +                     NodeRefListBase*        value) :
        XObject(&envSupport, &support),
  -     m_value(value),
  +     m_value(value == 0 ? new NodeRefList : value),
        m_cachedStringValue(),
        m_cachedNumberValue(0.0),
        m_resultTreeFrag()
   {
  +     assert(value != 0);
   }
   
   
   
  +#if 0
   XNodeSet::XNodeSet(
                        XPathEnvSupport&                        envSupport,
                        XPathSupport&                           support,
                        const MutableNodeRefList&       value) :
        XObject(&envSupport, &support),
        m_value(value),
  +     m_resultTreeFrag(),
        m_cachedStringValue(),
  -     m_cachedNumberValue(0.0),
  -     m_resultTreeFrag()
  +     m_cachedNumberValue(0.0)
   {
   }
  +#endif
  +
  +
   
  +MutableNodeRefList*
  +createNodeListWithNode(
  +                     XPathSupport&           support,
  +                     XalanNode*                      node)
  +{
  +#if !defined(XALAN_NO_NAMESPACES)
  +     using std::auto_ptr;
  +#endif
  +
  +     auto_ptr<MutableNodeRefList>    resultNodeList(new 
MutableNodeRefList(&support));
  +
  +     resultNodeList->addNode(node);
  +
  +     return resultNodeList.release();
  +}
   
   
  +
   XNodeSet::XNodeSet(
                        XPathEnvSupport&        envSupport,
                        XPathSupport&           support,
                        XalanNode&                      value) :
        XObject(&envSupport, &support),
  -     m_value(),
  +     m_value(createNodeListWithNode(support, &value)),
  +     m_resultTreeFrag(),
        m_cachedStringValue(),
  -     m_cachedNumberValue(0.0),
  -     m_resultTreeFrag()
  +     m_cachedNumberValue(0.0)
   {
  -     m_value.addNode(&value);
   }
   
   
  @@ -121,12 +142,12 @@
   XNodeSet::XNodeSet(const XNodeSet&   source,
                                   bool                         deepClone) :
        XObject(source),
  -     m_value(source.m_value),
  -     m_cachedStringValue(source.m_cachedStringValue),
  -     m_cachedNumberValue(source.m_cachedNumberValue),
  +     m_value(source.m_value->clone()),
        m_resultTreeFrag(source.m_resultTreeFrag.get() == 0 ?
                                                0 :
  -                                             
source.m_resultTreeFrag->clone(deepClone))
  +                                             
source.m_resultTreeFrag->clone(deepClone)),
  +     m_cachedStringValue(source.m_cachedStringValue),
  +     m_cachedNumberValue(source.m_cachedNumberValue)
   {
   }
   
  @@ -186,7 +207,7 @@
   bool
   XNodeSet::boolean() const
   {
  -     return m_value.getLength() > 0 ? true : false;
  +     return m_value->getLength() > 0 ? true : false;
   }
   
   
  @@ -197,9 +218,9 @@
        assert(m_support != 0);
   
        if (isEmpty(m_cachedStringValue) == true &&
  -             m_value.getLength() > 0)
  +             m_value->getLength() > 0)
        {
  -             const XalanNode* const  theNode = m_value.item(0);
  +             const XalanNode* const  theNode = m_value->item(0);
                assert(theNode != 0);
   
                const XalanNode::NodeType       theType = 
theNode->getNodeType();
  @@ -248,11 +269,11 @@
                        new ResultTreeFrag(*m_envSupport->getDOMFactory(),
                                                           *m_support);
   
  -             const int       nNodes = m_value.getLength();
  +             const int       nNodes = m_value->getLength();
   
                for(int i = 0; i < nNodes; i++)
                {
  -                     theFrag->appendChild(m_value.item(i)->cloneNode(true));
  +                     theFrag->appendChild(m_value->item(i)->cloneNode(true));
                }
   
   #if defined(XALAN_OLD_AUTO_PTR)
  @@ -295,11 +316,11 @@
            m_resultTreeFrag.reset(theFrag);
   #endif
   
  -             const int       nNodes = m_value.getLength();
  +             const int       nNodes = m_value->getLength();
   
                for(int i = 0; i < nNodes; i++)
                {
  -                     
m_resultTreeFrag->appendChild(m_value.item(i)->cloneNode(true));
  +                     
m_resultTreeFrag->appendChild(m_value->item(i)->cloneNode(true));
                }
        }
   
  @@ -310,24 +331,8 @@
   
   const NodeRefListBase&
   XNodeSet::nodeset() const
  -{
  -     return m_value;
  -}
  -
  -
  -
  -const MutableNodeRefList&
  -XNodeSet::mutableNodeset() const
  -{
  -     return m_value;
  -}
  -
  -
  -
  -MutableNodeRefList&
  -XNodeSet::mutableNodeset()
   {
  -     return m_value;
  +     return *m_value.get();
   }
   
   
  
  
  
  1.11      +14 -36    xml-xalan/c/src/XPath/XNodeSet.hpp
  
  Index: XNodeSet.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XNodeSet.hpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- XNodeSet.hpp      2000/07/25 18:39:52     1.10
  +++ XNodeSet.hpp      2000/07/28 22:01:53     1.11
  @@ -73,16 +73,10 @@
   
   
   
  -#include <XPath/ResultTreeFragBase.hpp>
  -#include <XPath/MutableNodeRefList.hpp>
  -
  -
  -
   class NodeRefListBase;
  -
  -
  -
  +class ResultTreeFragBase;
   class XPathSupport;
  +class XalanNode;
   
   
   
  @@ -98,24 +92,12 @@
         *
         * @param envSupport XPath environment support class instance
         * @param support XPath support class instance
  -      * @param value source node list 
  +      * @param value Pointer to source node list.  The XNodeSet will adopt 
the pointer.
         */
        XNodeSet(
  -                     XPathEnvSupport&                envSupport,
  -                     XPathSupport&                   support,
  -                     const NodeRefListBase&  value = MutableNodeRefList());
  -
  -     /**
  -      * Create an XNodeSet from a node list.
  -      *
  -      * @param envSupport XPath environment support class instance
  -      * @param support XPath support class instance
  -      * @param value source node list 
  -      */
  -     XNodeSet(
  -                     XPathEnvSupport&                        envSupport,
  -                     XPathSupport&                           support,
  -                     const MutableNodeRefList&       value = 
MutableNodeRefList());
  +                     XPathEnvSupport&        envSupport,
  +                     XPathSupport&           support,
  +                     NodeRefListBase*        value = 0);
   
        /**
         * Create an XNodeSet from a node.
  @@ -175,12 +157,6 @@
        virtual const NodeRefListBase&
        nodeset() const;
   
  -     virtual const MutableNodeRefList&
  -     mutableNodeset() const;
  -
  -     virtual MutableNodeRefList&
  -     mutableNodeset();
  -
        virtual void
        ProcessXObjectTypeCallback(XObjectTypeCallback&         
theCallbackObject);
   
  @@ -194,17 +170,19 @@
        operator=(const XNodeSet&);
   
        // Data members...
  -     MutableNodeRefList                                                      
m_value;
  -
  -     mutable XalanDOMString                                          
m_cachedStringValue;
  -
  -     mutable double                                                          
m_cachedNumberValue;
  -
   #if defined(XALAN_NO_NAMESPACES)
  +     auto_ptr<NodeRefListBase>                                       m_value;
  +
        mutable auto_ptr<ResultTreeFragBase>            m_resultTreeFrag;
   #else
  +     std::auto_ptr<NodeRefListBase>                          m_value;
  +
        mutable std::auto_ptr<ResultTreeFragBase>       m_resultTreeFrag;
   #endif
  +
  +     mutable XalanDOMString                                          
m_cachedStringValue;
  +
  +     mutable double                                                          
m_cachedNumberValue;
   };
   
   
  
  
  
  1.6       +0 -24     xml-xalan/c/src/XPath/XNull.cpp
  
  Index: XNull.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XNull.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- XNull.cpp 2000/07/13 22:47:15     1.5
  +++ XNull.cpp 2000/07/28 22:01:54     1.6
  @@ -176,30 +176,6 @@
   
   
   
  -const MutableNodeRefList&
  -XNull::mutableNodeset() const
  -{
  -     error("Can't cast XNull to MutableNodeRefList");
  -
  -     // error will throw, so this is just a dummy
  -     // value to satisfy the compiler.
  -     return *static_cast<MutableNodeRefList*>(0);
  -}
  -
  -
  -
  -MutableNodeRefList&
  -XNull::mutableNodeset()
  -{
  -     error("Can't cast XNull to MutableNodeRefList");
  -
  -     // error will throw, so this is just a dummy
  -     // value to satisfy the compiler.
  -     return *static_cast<MutableNodeRefList*>(0);
  -}
  -
  -
  -
   void
   XNull::ProcessXObjectTypeCallback(XObjectTypeCallback&       
theCallbackObject)
   {
  
  
  
  1.8       +0 -6      xml-xalan/c/src/XPath/XNull.hpp
  
  Index: XNull.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XNull.hpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- XNull.hpp 2000/07/21 19:50:02     1.7
  +++ XNull.hpp 2000/07/28 22:01:54     1.8
  @@ -145,12 +145,6 @@
        virtual const NodeRefListBase&
        nodeset() const;
   
  -     virtual const MutableNodeRefList&
  -     mutableNodeset() const;
  -
  -     virtual MutableNodeRefList&
  -     mutableNodeset();
  -
        virtual void
        ProcessXObjectTypeCallback(XObjectTypeCallback&         
theCallbackObject);
   
  
  
  
  1.8       +0 -24     xml-xalan/c/src/XPath/XNumber.cpp
  
  Index: XNumber.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XNumber.cpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- XNumber.cpp       2000/07/13 22:47:15     1.7
  +++ XNumber.cpp       2000/07/28 22:01:54     1.8
  @@ -192,30 +192,6 @@
   
   
   
  -const MutableNodeRefList&
  -XNumber::mutableNodeset() const
  -{
  -     error("Can't cast XNumber to MutableNodeRefList");
  -
  -     // error will throw, so this is just a dummy
  -     // value to satisfy the compiler.
  -     return *static_cast<MutableNodeRefList*>(0);
  -}
  -
  -
  -
  -MutableNodeRefList&
  -XNumber::mutableNodeset()
  -{
  -     error("Can't cast XNumber to MutableNodeRefList");
  -
  -     // error will throw, so this is just a dummy
  -     // value to satisfy the compiler.
  -     return *static_cast<MutableNodeRefList*>(0);
  -}
  -
  -
  -
   void
   XNumber::ProcessXObjectTypeCallback(XObjectTypeCallback&     
theCallbackObject)
   {
  
  
  
  1.8       +0 -6      xml-xalan/c/src/XPath/XNumber.hpp
  
  Index: XNumber.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XNumber.hpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- XNumber.hpp       2000/07/13 22:47:15     1.7
  +++ XNumber.hpp       2000/07/28 22:01:54     1.8
  @@ -126,12 +126,6 @@
        virtual const NodeRefListBase&
        nodeset() const;
   
  -     virtual const MutableNodeRefList&
  -     mutableNodeset() const;
  -
  -     virtual MutableNodeRefList&
  -     mutableNodeset();
  -
        virtual void
        ProcessXObjectTypeCallback(XObjectTypeCallback&         
theCallbackObject);
   
  
  
  
  1.9       +0 -16     xml-xalan/c/src/XPath/XObject.hpp
  
  Index: XObject.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XObject.hpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- XObject.hpp       2000/07/13 22:47:16     1.8
  +++ XObject.hpp       2000/07/28 22:01:55     1.9
  @@ -163,22 +163,6 @@
        nodeset() const = 0;
   
        /**
  -      * Cast result object to a nodelist that is mutable.
  -      *
  -      * @return mutable node list
  -      */
  -     virtual const MutableNodeRefList&
  -     mutableNodeset() const = 0;
  -
  -     /**
  -      * Cast result object to a nodelist that is mutable.
  -      *
  -      * @return mutable node list
  -      */
  -     virtual MutableNodeRefList&
  -     mutableNodeset() = 0;
  -
  -     /**
         * Process a callback request for preferred type information.
         *
         * @param theCallbackObject object to call back
  
  
  
  1.8       +9 -33     xml-xalan/c/src/XPath/XObjectFactory.hpp
  
  Index: XObjectFactory.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XObjectFactory.hpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- XObjectFactory.hpp        2000/07/25 14:48:12     1.7
  +++ XObjectFactory.hpp        2000/07/28 22:01:55     1.8
  @@ -139,26 +139,14 @@
        /**
         * Create a node set XObject from a node list.
         * 
  -      * @param theValue  value used to create object
  -      * @param fOptimize not used
  -      * @return pointer to new object
  -      */
  -     virtual XObject*
  -     createNodeSet(
  -                     const NodeRefListBase&  theValue,
  -                     bool                                    fOptimize = 
true) = 0;
  -
  -     /**
  -      * Create a node set XObject from a mutable node list.
  -      * 
  -      * @param theValue  value used to create object
  +      * @param theValue  value used to create object.  theValue will be 
owned by the new XObject.
         * @param fOptimize not used
         * @return pointer to new object
         */
        virtual XObject*
        createNodeSet(
  -                     const MutableNodeRefList&       theValue,
  -                     bool                                            
fOptimize = true) = 0;
  +                     NodeRefListBase*        theValue,
  +                     bool                            fOptimize = true) = 0;
   
        /**
         * Create a node set XObject from a DOM node.
  @@ -222,38 +210,26 @@
        /**
         * Create a result tree fragment XObject from a result tree fragment.
         * 
  -      * @param theValue  value used to create object
  +      * @param theValue  value used to create object.  theValue will be 
owned by the new XObject.
         * @param fOptimize not used
         * @return pointer to new object
         */
        virtual XObject*
        createResultTreeFrag(
  -                     const ResultTreeFragBase&       theValue,
  -                     bool                                            
fOptimize = true) = 0;
  -
  -     /**
  -      * Create a span XObject from a node list.
  -      * 
  -      * @param theValue  value used to create object
  -      * @param fOptimize not used
  -      * @return pointer to new object
  -      */
  -     virtual XObject*
  -     createSpan(
  -                     const NodeRefListBase&  theValue,
  +                     ResultTreeFragBase*             theValue,
                        bool                                    fOptimize = 
true) = 0;
   
        /**
  -      * Create a span XObject from a mutable node list.
  +      * Create a span XObject from a node list.
         * 
  -      * @param theValue  value used to create object
  +      * @param theValue  value used to create object.  The new object will 
own the pointer.
         * @param fOptimize not used
         * @return pointer to new object
         */
        virtual XObject*
        createSpan(
  -                     const MutableNodeRefList&       theValue,
  -                     bool                                            
fOptimize = true) = 0;
  +                     NodeRefListBase*        theValue,
  +                     bool                            fOptimize = true) = 0;
   
        /**
         * Create a span XObject from a DOM node.
  
  
  
  1.11      +6 -42     xml-xalan/c/src/XPath/XObjectFactoryDefault.cpp
  
  Index: XObjectFactoryDefault.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XObjectFactoryDefault.cpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- XObjectFactoryDefault.cpp 2000/07/17 14:52:33     1.10
  +++ XObjectFactoryDefault.cpp 2000/07/28 22:01:56     1.11
  @@ -204,26 +204,8 @@
   
   XObject*
   XObjectFactoryDefault::createNodeSet(
  -                     const NodeRefListBase&  value,
  -                     bool                                    /* fOptimize */)
  -{
  -     XNodeSet* const         theXNodeSet = new XNodeSet(m_envSupport, 
m_support, value);
  -
  -     m_xobjects.insert(theXNodeSet);
  -
  -#if !defined(NDEBUG)
  -     ++m_totalNodeSetInstanceCount;
  -#endif
  -
  -     return theXNodeSet;
  -}
  -
  -
  -
  -XObject*
  -XObjectFactoryDefault::createNodeSet(
  -                     const MutableNodeRefList&       value,
  -                     bool                                    /* fOptimize */)
  +                     NodeRefListBase*        value,
  +                     bool                            /* fOptimize */)
   {
        XNodeSet* const         theXNodeSet = new XNodeSet(m_envSupport, 
m_support, value);
   
  @@ -335,8 +317,8 @@
   
   XObject*
   XObjectFactoryDefault::createResultTreeFrag(
  -                     const ResultTreeFragBase&       theValue,
  -                     bool                                            /* 
fOptimize */)
  +                     ResultTreeFragBase*             theValue,
  +                     bool                                    /* fOptimize */)
   {
        XResultTreeFrag* const  theResultTreeFrag = new 
XResultTreeFrag(m_envSupport, m_support, theValue);
   
  @@ -352,27 +334,9 @@
   
   
   XObject*
  -XObjectFactoryDefault::createSpan(
  -                     const NodeRefListBase&  theValue,
  -                     bool                                    /* fOptimize */)
  -{
  -     XSpan* const    theXSpan = new XSpan(m_envSupport, m_support, theValue);
  -
  -     m_xobjects.insert(theXSpan);
  -
  -#if !defined(NDEBUG)
  -     ++m_totalSpanInstanceCount;
  -#endif
  -
  -     return theXSpan;
  -}
  -
  -
  -
  -XObject*
   XObjectFactoryDefault::createSpan(
  -                     const MutableNodeRefList&       theValue,
  -                     bool                                            /* 
fOptimize */)
  +                     NodeRefListBase*        theValue,
  +                     bool                            /* fOptimize */)
   {
        XSpan* const    theXSpan = new XSpan(m_envSupport, m_support, theValue);
   
  
  
  
  1.8       +5 -15     xml-xalan/c/src/XPath/XObjectFactoryDefault.hpp
  
  Index: XObjectFactoryDefault.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XObjectFactoryDefault.hpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- XObjectFactoryDefault.hpp 2000/07/12 21:46:51     1.7
  +++ XObjectFactoryDefault.hpp 2000/07/28 22:01:56     1.8
  @@ -117,13 +117,8 @@
   
        virtual XObject*
        createNodeSet(
  -                     const NodeRefListBase&  value,
  -                     bool                                    fOptimize = 
true);
  -
  -     virtual XObject*
  -     createNodeSet(
  -                     const MutableNodeRefList&       value,
  -                     bool                                            
fOptimize = true);
  +                     NodeRefListBase*        value,
  +                     bool                            fOptimize = true);
   
        virtual XObject*
        createNodeSet(
  @@ -150,18 +145,13 @@
   
        virtual XObject*
        createResultTreeFrag(
  -                     const ResultTreeFragBase&       theValue,
  -                     bool                                            
fOptimize = true);
  -
  -     virtual XObject*
  -     createSpan(
  -                     const NodeRefListBase&  value,
  +                     ResultTreeFragBase*             theValue,
                        bool                                    fOptimize = 
true);
   
        virtual XObject*
        createSpan(
  -                     const MutableNodeRefList&       value,
  -                     bool                                            
fOptimize = true);
  +                     NodeRefListBase*        value,
  +                     bool                            fOptimize = true);
   
        virtual XObject*
        createSpan(
  
  
  
  1.23      +20 -17    xml-xalan/c/src/XPath/XPath.cpp
  
  Index: XPath.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPath.cpp,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- XPath.cpp 2000/07/27 20:35:23     1.22
  +++ XPath.cpp 2000/07/28 22:01:56     1.23
  @@ -1115,8 +1115,12 @@
   {
        opPos += 2;
   
  -     XObject*        resultNodeSet = 0;
  +#if !defined(XALAN_NO_NAMESPACES)
  +     using std::auto_ptr;
  +#endif
   
  +     auto_ptr<MutableNodeRefList>    
resultNodeList(executionContext.createMutableNodeRefList());
  +
        XObjectFactory&         theFactory = 
executionContext.getXObjectFactory();
   
        while(m_expression.m_opMap[opPos] != XPathExpression::eENDOP)
  @@ -1125,24 +1129,17 @@
   
                XObject*        expr = executeMore(context, opPos, 
executionContext);
   
  -             if(0 == resultNodeSet)
  -             {
  -                     resultNodeSet = expr;
  -             }
  -             else
  -             {
  -                     MutableNodeRefList&             nl =
  -                             resultNodeSet->mutableNodeset();
  +             const NodeRefListBase&  nl =
  +                             expr->nodeset();
   
  -                     nl.addNodesInDocOrder(expr->nodeset());
  +             resultNodeList->addNodesInDocOrder(nl);
   
  -                     theFactory.returnObject(expr);
  -             }
  +             theFactory.returnObject(expr);
   
                opPos = nextOpPos;
        }
   
  -     return resultNodeSet;
  +     return theFactory.createNodeSet(resultNodeList.release());
   }
   
   
  @@ -1351,10 +1348,13 @@
        const XObject* const    funcName = 
m_expression.m_tokenQueue[m_expression.m_opMap[opPos]];
   
        opPos++;
  +
  +     typedef XPathExecutionContext::XObjectArgVectorType             
XObjectArgVectorType;
  +     typedef XPathExecutionContext::PushPopArgVector                 
PushPopArgVector;
   
  -     Function::XObjectArgVectorType  args;
  +     PushPopArgVector        thePushPop(executionContext);
   
  -     args.reserve(eDefaultArgVectorSize);
  +     XObjectArgVectorType&   args = thePushPop.getVector();
   
        while(opPos < endExtFunc)
        {
  @@ -1415,10 +1415,13 @@
        const int       funcID = m_expression.m_opMap[opPos];
   
        opPos++;
  +
  +     typedef XPathExecutionContext::XObjectArgVectorType             
XObjectArgVectorType;
  +     typedef XPathExecutionContext::PushPopArgVector                 
PushPopArgVector;
   
  -     Function::XObjectArgVectorType  args;
  +     PushPopArgVector        thePushPop(executionContext);
   
  -     args.reserve(eDefaultArgVectorSize);
  +     XObjectArgVectorType&   args = thePushPop.getVector();
   
        while(opPos < endFunc)
        {
  
  
  
  1.17      +99 -2     xml-xalan/c/src/XPath/XPathExecutionContext.hpp
  
  Index: XPathExecutionContext.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathExecutionContext.hpp,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- XPathExecutionContext.hpp 2000/07/14 16:57:13     1.16
  +++ XPathExecutionContext.hpp 2000/07/28 22:01:56     1.17
  @@ -66,6 +66,7 @@
   
   
   
  +#include <cassert>
   #include <vector>
   
   
  @@ -334,6 +335,50 @@
                        const XObjectArgVectorType&             argVec) = 0;
   
        /**
  +      * Push an arg vector on the execution context and
  +      * return a reference to it.  Must be followed by
  +      * a pop.
  +      * 
  +      * @return a reference to an arg vector.
  +      */
  +     virtual XObjectArgVectorType&
  +     pushArgVector() = 0;
  +
  +     /**
  +      * Pop the arg vector from the execution context.
  +      */
  +     virtual void
  +     popArgVector() = 0;
  +
  +     class PushPopArgVector
  +     {
  +     public:
  +
  +             PushPopArgVector(XPathExecutionContext&         
executionContext) :
  +                     m_xpathExecutionContext(executionContext),
  +                     m_argVector(executionContext.pushArgVector())
  +             {
  +             }
  +
  +             ~PushPopArgVector()
  +             {
  +                     m_xpathExecutionContext.popArgVector();
  +             }
  +
  +             XObjectArgVectorType&
  +             getVector()
  +             {
  +                     return m_argVector;
  +             }
  +
  +     private:
  +
  +             XPathExecutionContext&  m_xpathExecutionContext;
  +
  +             XObjectArgVectorType&   m_argVector;
  +     };
  +
  +     /**
         * Get an XLocator provider keyed by node.  This gets the association
         * based on the root of the tree that is the node's parent.
         *
  @@ -368,11 +413,63 @@
                        const XalanDOMString&   base) const = 0;
   
        /**
  +      * Borrow a cached MutableNodeRefList.
  +      *
  +      * @return A pointer the to node list.
  +      */
  +     virtual MutableNodeRefList*
  +     borrowMutableNodeRefList() = 0;
  +
  +     /**
  +      * Return a previously borrowed MutableNodeRefList.
  +      *
  +      * @param theList A pointer the to previously borrowed node list.
  +      * @return true if the list was borrowed (at therefore, destroyed), 
false if not.
  +      */
  +     virtual bool
  +     returnMutableNodeRefList(MutableNodeRefList*    theList) = 0;
  +
  +     class BorrowReturnMutableNodeRefList
  +     {
  +     public:
  +
  +             BorrowReturnMutableNodeRefList(XPathExecutionContext&   
executionContext) :
  +                     m_xpathExecutionContext(executionContext),
  +                     
m_mutableNodeRefList(executionContext.borrowMutableNodeRefList())
  +             {
  +                     assert(m_mutableNodeRefList != 0);
  +             }
  +
  +             ~BorrowReturnMutableNodeRefList()
  +             {
  +                     
m_xpathExecutionContext.returnMutableNodeRefList(m_mutableNodeRefList);
  +             }
  +
  +             MutableNodeRefList&
  +             operator*() const
  +             {
  +                     return *m_mutableNodeRefList;
  +             }
  +
  +             MutableNodeRefList*
  +             operator->() const
  +             {
  +                     return m_mutableNodeRefList;
  +             }
  +
  +     private:
  +
  +             XPathExecutionContext&  m_xpathExecutionContext;
  +
  +             MutableNodeRefList*             m_mutableNodeRefList;
  +     };
  +
  +     /**
         * Create a MutableNodeRefList with the appropriate context.
         *
  -      * @return node list created
  +      * @return pointer to node list created
         */
  -     virtual MutableNodeRefList
  +     virtual MutableNodeRefList*
        createMutableNodeRefList() const = 0;
   
        /**
  
  
  
  1.14      +127 -3    xml-xalan/c/src/XPath/XPathExecutionContextDefault.cpp
  
  Index: XPathExecutionContextDefault.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathExecutionContextDefault.cpp,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- XPathExecutionContextDefault.cpp  2000/07/21 19:50:03     1.13
  +++ XPathExecutionContextDefault.cpp  2000/07/28 22:01:57     1.14
  @@ -62,6 +62,10 @@
   
   
   
  +#include <PlatformSupport/STLHelper.hpp>
  +
  +
  +
   #include "ElementPrefixResolverProxy.hpp"
   #include "FoundIndex.hpp"
   #include "XObjectFactory.hpp"
  @@ -86,14 +90,37 @@
        m_currentNode(theCurrentNode),
        m_contextNodeList(&theContextNodeList),
        m_prefixResolver(thePrefixResolver),
  -     m_throwFoundIndex(false)
  +     m_throwFoundIndex(false),
  +     m_availableCachedNodeLists(),
  +     m_busyCachedNodeLists(),
  +     m_argVectorsStack(),
  +     m_argVectorsStackPosition(m_argVectorsStack.end())
   {
  +     m_availableCachedNodeLists.reserve(eMutableNodeRefListCacheMax);
  +
  +     m_busyCachedNodeLists.reserve(eMutableNodeRefListCacheMax);
   }
   
   
   
   XPathExecutionContextDefault::~XPathExecutionContextDefault()
   {
  +     assert(m_busyCachedNodeLists.size() == 0);
  +     assert(m_argVectorsStackPosition == m_argVectorsStack.begin() ||
  +                m_argVectorsStack.size() == 0);
  +
  +#if !defined(XALAN_NO_NAMESPACES)
  +     using std::for_each;
  +#endif
  +
  +     for_each(
  +             m_availableCachedNodeLists.begin(),
  +             m_availableCachedNodeLists.end(),
  +             DeleteFunctor<MutableNodeRefList>());
  +
  +     m_argVectorsStack.clear();
  +
  +     m_argVectorsStackPosition = m_argVectorsStack.end();
   }
   
   
  @@ -248,6 +275,53 @@
   
   
   
  +XPathExecutionContextDefault::XObjectArgVectorType&
  +XPathExecutionContextDefault::pushArgVector()
  +{
  +     // m_argVectorsStackPosition always points one past
  +     // the current top of the stack.
  +     if (m_argVectorsStackPosition != m_argVectorsStack.end())
  +     {
  +             return *m_argVectorsStackPosition++;
  +     }
  +     else
  +     {
  +             m_argVectorsStack.push_back(XObjectArgVectorType());
  +
  +             m_argVectorsStackPosition = m_argVectorsStack.end();
  +
  +             XObjectArgVectorType&   theResult =
  +                     m_argVectorsStack.back();
  +
  +             theResult.reserve(eCachedArgVectorDefaultSize);
  +
  +             return theResult;
  +     }
  +}
  +
  +
  +
  +void
  +XPathExecutionContextDefault::popArgVector()
  +{
  +     assert(m_argVectorsStackPosition != m_argVectorsStack.begin());
  +
  +     if (m_argVectorsStack.size() > eArgVectorStackMax)
  +     {
  +             m_argVectorsStack.pop_back();
  +
  +             m_argVectorsStackPosition = m_argVectorsStack.end();
  +     }
  +     else
  +     {
  +             m_argVectorsStackPosition->clear();
  +
  +             --m_argVectorsStackPosition;
  +     }
  +}
  +
  +
  +
   XObject*
   XPathExecutionContextDefault::extFunction(
                        const XalanDOMString&                   theNamespace,
  @@ -287,11 +361,61 @@
   }
   
   
  +
  +MutableNodeRefList*
  +XPathExecutionContextDefault::borrowMutableNodeRefList()
  +{
  +     // We'll always return the back of the free list, since
  +     // that's the cheapest thing.
  +     if (m_availableCachedNodeLists.size() == 0)
  +     {
  +             m_busyCachedNodeLists.push_back(new 
MutableNodeRefList(&m_xpathSupport));
  +     }
  +     else
  +     {
  +             
m_busyCachedNodeLists.push_back(m_availableCachedNodeLists.back());
  +
  +             m_availableCachedNodeLists.pop_back();
  +     }
  +
  +     return m_busyCachedNodeLists.back();
  +}
  +
  +
  +
  +bool
  +XPathExecutionContextDefault::returnMutableNodeRefList(MutableNodeRefList*   
theList)
  +{
  +#if !defined(XALAN_NO_NAMESPACES)
  +     using std::find;
  +#endif
  +
  +     // Search from the back to the front, since we push the latest borrowed 
on the back.
  +     const NodeRefListCacheType::reverse_iterator    i =
  +             find(m_busyCachedNodeLists.rbegin(), 
m_busyCachedNodeLists.rend(), theList);
  +
  +     if (i == m_busyCachedNodeLists.rend())
  +     {
  +             return false;
  +     }
  +     else
  +     {
  +             theList->clear();
  +
  +             m_availableCachedNodeLists.push_back(*i);
  +
  +             m_busyCachedNodeLists.erase(&*i);
  +
  +             return true;
  +     }
  +}
  +
  +
   
  -MutableNodeRefList
  +MutableNodeRefList*
   XPathExecutionContextDefault::createMutableNodeRefList() const
   {
  -     return MutableNodeRefList(&m_xpathSupport);
  +     return new MutableNodeRefList(&m_xpathSupport);
   }
   
   
  
  
  
  1.15      +39 -1     xml-xalan/c/src/XPath/XPathExecutionContextDefault.hpp
  
  Index: XPathExecutionContextDefault.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathExecutionContextDefault.hpp,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- XPathExecutionContextDefault.hpp  2000/07/14 16:57:13     1.14
  +++ XPathExecutionContextDefault.hpp  2000/07/28 22:01:57     1.15
  @@ -69,6 +69,10 @@
   
   
   
  +#include <deque>
  +
  +
  +
   #include <XalanDOM/XalanDOMString.hpp>
   
   
  @@ -170,6 +174,12 @@
                        const XalanDOMString&   theNamespace, 
                        const XalanDOMString&   functionName) const;
   
  +     virtual XObjectArgVectorType&
  +     pushArgVector();
  +
  +     virtual void
  +     popArgVector();
  +
        virtual XObject*
        extFunction(
                        const XalanDOMString&                   theNamespace,
  @@ -189,8 +199,14 @@
        parseXML(
                        const XalanDOMString&   urlString,
                        const XalanDOMString&   base) const;
  +
  +     virtual MutableNodeRefList*
  +     borrowMutableNodeRefList();
   
  -     virtual MutableNodeRefList
  +     virtual bool
  +     returnMutableNodeRefList(MutableNodeRefList*    theList);
  +
  +     virtual MutableNodeRefList*
        createMutableNodeRefList() const;
   
        virtual bool
  @@ -286,6 +302,20 @@
   
   protected:
   
  +#if defined(XALAN_NO_NAMESPACES)
  +     typedef vector<MutableNodeRefList*>                     
NodeRefListCacheType;
  +     typedef deque<XObjectArgVectorType>                     
XObjectArgVectorStackType;
  +#else
  +     typedef std::vector<MutableNodeRefList*>        NodeRefListCacheType;
  +     typedef std::deque<XObjectArgVectorType>        
XObjectArgVectorStackType;
  +#endif
  +
  +     typedef XObjectArgVectorStackType::iterator             
ArgVectorStackIteratorType;
  +
  +     enum { eMutableNodeRefListCacheMax = 50,
  +                eArgVectorStackMax = 25,
  +                eCachedArgVectorDefaultSize = 10 };
  +
        XPathEnvSupport&                                m_xpathEnvSupport;
   
        XPathSupport&                                   m_xpathSupport;
  @@ -301,6 +331,14 @@
        bool                                                    
m_throwFoundIndex;
   
        XalanDOMString                                  m_currentPattern;
  +
  +     NodeRefListCacheType                    m_availableCachedNodeLists;
  +
  +     NodeRefListCacheType                    m_busyCachedNodeLists;
  +
  +     XObjectArgVectorStackType               m_argVectorsStack;
  +
  +     ArgVectorStackIteratorType              m_argVectorsStackPosition;
   };
   
   
  
  
  
  1.9       +12 -29    xml-xalan/c/src/XPath/XResultTreeFrag.cpp
  
  Index: XResultTreeFrag.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XResultTreeFrag.cpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- XResultTreeFrag.cpp       2000/07/27 20:34:34     1.8
  +++ XResultTreeFrag.cpp       2000/07/28 22:01:57     1.9
  @@ -77,13 +77,12 @@
   
   
   XResultTreeFrag::XResultTreeFrag(
  -                     XPathEnvSupport&                        envSupport,
  -                     XPathSupport&                           support,
  -                     const ResultTreeFragBase&       val,
  -                     bool                                            
deepClone) :
  +                     XPathEnvSupport&                envSupport,
  +                     XPathSupport&                   support,
  +                     ResultTreeFragBase*             val) :
        XObject(&envSupport, &support),
        NodeRefListBase(),
  -     m_value(val.clone(deepClone)),
  +     m_value(val),
        m_cachedStringValue(),
        m_cachedNumberValue(0.0)
   {
  @@ -228,30 +227,6 @@
   
   
   
  -const MutableNodeRefList&
  -XResultTreeFrag::mutableNodeset() const
  -{
  -     error("Can't cast XResultTreeFrag to MutableNodeRefList");
  -
  -     // error will throw, so this is just a dummy
  -     // value to satisfy the compiler.
  -     return *static_cast<MutableNodeRefList*>(0);
  -}
  -
  -
  -
  -MutableNodeRefList&
  -XResultTreeFrag::mutableNodeset()
  -{
  -     error("Can't cast XResultTreeFrag to MutableNodeRefList");
  -
  -     // error will throw, so this is just a dummy
  -     // value to satisfy the compiler.
  -     return *static_cast<MutableNodeRefList*>(0);
  -}
  -
  -
  -
   void
   XResultTreeFrag::ProcessXObjectTypeCallback(XObjectTypeCallback&     
theCallbackObject)
   {
  @@ -345,4 +320,12 @@
   XResultTreeFrag::getSupport() const
   {
        return m_support;
  +}
  +
  +
  +
  +NodeRefListBase*
  +XResultTreeFrag::clone() const
  +{
  +     return new XResultTreeFrag(*this);
   }
  
  
  
  1.10      +8 -12     xml-xalan/c/src/XPath/XResultTreeFrag.hpp
  
  Index: XResultTreeFrag.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XResultTreeFrag.hpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- XResultTreeFrag.hpp       2000/07/27 20:34:34     1.9
  +++ XResultTreeFrag.hpp       2000/07/28 22:01:57     1.10
  @@ -91,14 +91,13 @@
         * 
         * @param envSupport XPath environment support class instance
         * @param support    XPath support class instance
  -      * @param val        source result tree fragment
  +      * @param val        source result tree fragment.  The XResultTreeFrag 
instance will adopt the object.
         * @param deepClone  true to copy all subobjects, default is false
         */
        XResultTreeFrag(
  -                     XPathEnvSupport&                        envSupport,
  -                     XPathSupport&                           support,
  -                     const ResultTreeFragBase&       val,
  -                     bool                                            
deepClone = false);
  +                     XPathEnvSupport&                envSupport,
  +                     XPathSupport&                   support,
  +                     ResultTreeFragBase*             val);
   
        /**
         * Construct an XResultTreeFrag object from another
  @@ -112,7 +111,7 @@
        virtual
        ~XResultTreeFrag();
   
  -     
  +
        // These methods are inherited from XObject ...
   
   #if defined(XALAN_NO_COVARIANT_RETURN_TYPE)
  @@ -146,12 +145,6 @@
        virtual const NodeRefListBase&
        nodeset() const;
   
  -     virtual const MutableNodeRefList&
  -     mutableNodeset() const;
  -
  -     virtual MutableNodeRefList&
  -     mutableNodeset();
  -
        virtual void
        ProcessXObjectTypeCallback(XObjectTypeCallback&         
theCallbackObject);
   
  @@ -176,6 +169,9 @@
   
        virtual XPathSupport*
        getSupport() const;
  +
  +     virtual NodeRefListBase*
  +     clone() const;
   
   #if defined(XALAN_NO_NAMESPACES)
        auto_ptr<ResultTreeFragBase>            m_value;
  
  
  
  1.5       +5 -3      xml-xalan/c/src/XPath/XSpan.cpp
  
  Index: XSpan.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XSpan.cpp,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- XSpan.cpp 2000/07/13 22:47:17     1.4
  +++ XSpan.cpp 2000/07/28 22:01:58     1.5
  @@ -59,9 +59,9 @@
   
   
   XSpan::XSpan(
  -                     XPathEnvSupport&                envSupport,
  -                     XPathSupport&                   support,
  -                     const NodeRefListBase&  value) :
  +                     XPathEnvSupport&        envSupport,
  +                     XPathSupport&           support,
  +                     NodeRefListBase*        value) :
        XNodeSet(envSupport,
                         support,
                         value),
  @@ -72,6 +72,7 @@
   
   
   
  +#if 0
   XSpan::XSpan(
                        XPathEnvSupport&                        envSupport,
                        XPathSupport&                           support,
  @@ -83,6 +84,7 @@
        m_end(-1)
   {
   }
  +#endif
   
   
   
  
  
  
  1.6       +4 -16     xml-xalan/c/src/XPath/XSpan.hpp
  
  Index: XSpan.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XSpan.hpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- XSpan.hpp 2000/07/13 22:47:17     1.5
  +++ XSpan.hpp 2000/07/28 22:01:58     1.6
  @@ -78,24 +78,12 @@
         * 
         * @param envSupport XPath environment support class instance
         * @param support    XPath support class instance
  -      * @param value      source node list
  +      * @param value      source node list.  The instance will adopt the 
value instance.
         */
        XSpan(
  -                     XPathEnvSupport&                envSupport,
  -                     XPathSupport&                   support,
  -                     const NodeRefListBase&  value = MutableNodeRefList());
  -
  -     /**
  -      * Construct an XSpan object from a node list.
  -      * 
  -      * @param envSupport XPath environment support class instance
  -      * @param support    XPath support class instance
  -      * @param value      source node list
  -      */
  -     XSpan(
  -                     XPathEnvSupport&                        envSupport,
  -                     XPathSupport&                           support,
  -                     const MutableNodeRefList&       value = 
MutableNodeRefList());
  +                     XPathEnvSupport&        envSupport,
  +                     XPathSupport&           support,
  +                     NodeRefListBase*        value = 0);
   
        /**
         * Construct an XSpan object from a DOM node.
  
  
  
  1.10      +0 -24     xml-xalan/c/src/XPath/XString.cpp
  
  Index: XString.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XString.cpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- XString.cpp       2000/07/21 19:50:03     1.9
  +++ XString.cpp       2000/07/28 22:01:58     1.10
  @@ -279,30 +279,6 @@
   
   
   
  -const MutableNodeRefList&
  -XString::mutableNodeset() const
  -{
  -     error("Can't cast XString to MutableNodeRefList");
  -
  -     // error will throw, so this is just a dummy
  -     // value to satisfy the compiler.
  -     return *static_cast<MutableNodeRefList*>(0);
  -}
  -
  -
  -
  -MutableNodeRefList&
  -XString::mutableNodeset()
  -{
  -     error("Can't cast XString to MutableNodeRefList");
  -
  -     // error will throw, so this is just a dummy
  -     // value to satisfy the compiler.
  -     return *static_cast<MutableNodeRefList*>(0);
  -}
  -
  -
  -
   void
   XString::ProcessXObjectTypeCallback(XObjectTypeCallback&     
theCallbackObject)
   {
  
  
  
  1.9       +0 -6      xml-xalan/c/src/XPath/XString.hpp
  
  Index: XString.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XString.hpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- XString.hpp       2000/07/13 22:47:18     1.8
  +++ XString.hpp       2000/07/28 22:01:59     1.9
  @@ -138,12 +138,6 @@
        virtual const NodeRefListBase&
        nodeset() const;
   
  -     virtual const MutableNodeRefList&
  -     mutableNodeset() const;
  -
  -     virtual MutableNodeRefList&
  -     mutableNodeset();
  -
        virtual void
        ProcessXObjectTypeCallback(XObjectTypeCallback&         
theCallbackObject);
   
  
  
  
  1.6       +0 -24     xml-xalan/c/src/XPath/XUnknown.cpp
  
  Index: XUnknown.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XUnknown.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- XUnknown.cpp      2000/07/13 22:47:18     1.5
  +++ XUnknown.cpp      2000/07/28 22:01:59     1.6
  @@ -180,30 +180,6 @@
   
   
   
  -const MutableNodeRefList&
  -XUnknown::mutableNodeset() const
  -{
  -     error("Can't cast XUnknown to MutableNodeRefList");
  -
  -     // error will throw, so this is just a dummy
  -     // value to satisfy the compiler.
  -     return *static_cast<MutableNodeRefList*>(0);
  -}
  -
  -
  -
  -MutableNodeRefList&
  -XUnknown::mutableNodeset()
  -{
  -     error("Can't cast XUnknown to MutableNodeRefList");
  -
  -     // error will throw, so this is just a dummy
  -     // value to satisfy the compiler.
  -     return *static_cast<MutableNodeRefList*>(0);
  -}
  -
  -
  -
   void
   XUnknown::ProcessXObjectTypeCallback(XObjectTypeCallback&    
theCallbackObject)
   {
  
  
  
  1.7       +0 -6      xml-xalan/c/src/XPath/XUnknown.hpp
  
  Index: XUnknown.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XUnknown.hpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- XUnknown.hpp      2000/07/13 22:47:19     1.6
  +++ XUnknown.hpp      2000/07/28 22:01:59     1.7
  @@ -126,12 +126,6 @@
        virtual const NodeRefListBase&
        nodeset() const;
   
  -     virtual const MutableNodeRefList&
  -     mutableNodeset() const;
  -
  -     virtual MutableNodeRefList&
  -     mutableNodeset();
  -
        virtual void
        ProcessXObjectTypeCallback(XObjectTypeCallback&         
theCallbackObject);
   
  
  
  

Reply via email to