dbertoni    2003/08/01 18:06:52

  Modified:    c/src/xalanc/XPath XPath.cpp XPathExecutionContext.hpp
                        XPathExecutionContextDefault.cpp
                        XPathExecutionContextDefault.hpp
  Log:
  Implement current node as a stack within the execution context.  This will 
help implement preventing stack overflow and takes stress off the processor 
stack.
  
  Revision  Changes    Path
  1.4       +6 -6      xml-xalan/c/src/xalanc/XPath/XPath.cpp
  
  Index: XPath.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XPath/XPath.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XPath.cpp 30 Jul 2003 15:45:26 -0000      1.3
  +++ XPath.cpp 2 Aug 2003 01:06:51 -0000       1.4
  @@ -160,7 +160,7 @@
                                                                        
&prefixResolver);
   
        // Push and pop the current node...
  -     XPathExecutionContext::CurrentNodeSetAndRestore         
theNodeSetAndRestore(
  +     XPathExecutionContext::CurrentNodePushAndPop            
theNodePushAndPop(
                                                                        
executionContext,
                                                                        
context);
   
  @@ -184,7 +184,7 @@
                                                                        
&prefixResolver);
   
        // Push and pop the current node...
  -     XPathExecutionContext::CurrentNodeSetAndRestore         
theNodeSetAndRestore(
  +     XPathExecutionContext::CurrentNodePushAndPop            
theNodePushAndPop(
                                                                        
executionContext,
                                                                        
context);
   
  @@ -208,7 +208,7 @@
                                                                        
&prefixResolver);
   
        // Push and pop the current node...
  -     XPathExecutionContext::CurrentNodeSetAndRestore         
theNodeSetAndRestore(
  +     XPathExecutionContext::CurrentNodePushAndPop            
theNodePushAndPop(
                                                                        
executionContext,
                                                                        
context);
   
  @@ -232,7 +232,7 @@
                                                                        
&prefixResolver);
   
        // Push and pop the current node...
  -     XPathExecutionContext::CurrentNodeSetAndRestore         
theNodeSetAndRestore(
  +     XPathExecutionContext::CurrentNodePushAndPop            
theNodePushAndPop(
                                                                        
executionContext,
                                                                        
context);
   
  @@ -257,7 +257,7 @@
                                                                        
&prefixResolver);
   
        // Push and pop the current node...
  -     XPathExecutionContext::CurrentNodeSetAndRestore         
theNodeSetAndRestore(
  +     XPathExecutionContext::CurrentNodePushAndPop            
theNodePushAndPop(
                                                                        
executionContext,
                                                                        
context);
   
  @@ -282,7 +282,7 @@
                                                                        
&prefixResolver);
   
        // Push and pop the current node...
  -     XPathExecutionContext::CurrentNodeSetAndRestore         
theNodeSetAndRestore(
  +     XPathExecutionContext::CurrentNodePushAndPop            
theNodePushAndPop(
                                                                        
executionContext,
                                                                        
context);
   
  
  
  
  1.2       +13 -21    xml-xalan/c/src/xalanc/XPath/XPathExecutionContext.hpp
  
  Index: XPathExecutionContext.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XPath/XPathExecutionContext.hpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XPathExecutionContext.hpp 29 Jun 2003 03:58:00 -0000      1.1
  +++ XPathExecutionContext.hpp 2 Aug 2003 01:06:52 -0000       1.2
  @@ -146,42 +146,34 @@
         * @param theCurrentNode new current node
         */
        virtual void
  -     setCurrentNode(XalanNode*       theCurrentNode) = 0;
  +     pushCurrentNode(XalanNode*      theCurrentNode) = 0;
   
  -     class CurrentNodeSetAndRestore
  +     /**
  +      * Reset the node currently being executed.
  +      */
  +     virtual void
  +     popCurrentNode() = 0;
  +
  +     class CurrentNodePushAndPop
        {
        public:
   
  -             CurrentNodeSetAndRestore(
  +             CurrentNodePushAndPop(
                                XPathExecutionContext&  theExecutionContext,
                                XalanNode*                              
theNewNode) :
  -                     m_executionContext(theExecutionContext),
  -                     m_savedNode(theExecutionContext.getCurrentNode())
  +                     m_executionContext(theExecutionContext)
                {
  -                     theExecutionContext.setCurrentNode(theNewNode);
  -             }
  -
  -             CurrentNodeSetAndRestore(
  -                             XPathExecutionContext&  theExecutionContext,
  -                             XalanNode*                              
theOldNode,
  -                             XalanNode*                              
theNewNode) :
  -                     m_executionContext(theExecutionContext),
  -                     m_savedNode(theOldNode)
  -             {
  -                     assert(theExecutionContext.getCurrentNode() == 
theOldNode);
  -
  -                     theExecutionContext.setCurrentNode(theNewNode);
  +                     theExecutionContext.pushCurrentNode(theNewNode);
                }
   
  -             ~CurrentNodeSetAndRestore()
  +             ~CurrentNodePushAndPop()
                {
  -                     m_executionContext.setCurrentNode(m_savedNode);
  +                     m_executionContext.popCurrentNode();
                }
   
        private:
   
                XPathExecutionContext&  m_executionContext;
  -             XalanNode* const                m_savedNode;
        };
   
        /**
  
  
  
  1.2       +17 -6     
xml-xalan/c/src/xalanc/XPath/XPathExecutionContextDefault.cpp
  
  Index: XPathExecutionContextDefault.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/xalanc/XPath/XPathExecutionContextDefault.cpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XPathExecutionContextDefault.cpp  29 Jun 2003 03:58:00 -0000      1.1
  +++ XPathExecutionContextDefault.cpp  2 Aug 2003 01:06:52 -0000       1.2
  @@ -104,7 +104,7 @@
        XPathExecutionContext(&theXObjectFactory),
        m_xpathEnvSupport(&theXPathEnvSupport),
        m_domSupport(&theDOMSupport),
  -     m_currentNode(theCurrentNode),
  +     m_currentNodeStack(),
        m_contextNodeList(theContextNodeList == 0 ? &s_dummyList : 
theContextNodeList),
        m_prefixResolver(thePrefixResolver),
        m_throwFoundIndex(false),
  @@ -113,6 +113,7 @@
        m_cachedPosition(),
        m_scratchQName()
   {
  +     m_currentNodeStack.push_back(theCurrentNode);
   }
   
   
  @@ -124,7 +125,7 @@
        XPathExecutionContext(),
        m_xpathEnvSupport(0),
        m_domSupport(0),
  -     m_currentNode(theCurrentNode),
  +     m_currentNodeStack(),
        m_contextNodeList(theContextNodeList == 0 ? &s_dummyList : 
theContextNodeList),
        m_prefixResolver(thePrefixResolver),
        m_throwFoundIndex(false),
  @@ -133,6 +134,7 @@
        m_cachedPosition(),
        m_scratchQName()
   {
  +     m_currentNodeStack.push_back(theCurrentNode);
   }
   
   
  @@ -163,7 +165,8 @@
                m_xobjectFactory->reset();
        }
   
  -     m_currentNode = 0;
  +     m_currentNodeStack.clear();
  +
        m_contextNodeList = &s_dummyList;
        m_prefixResolver = 0;
        m_throwFoundIndex = false;
  @@ -180,15 +183,23 @@
   XalanNode*
   XPathExecutionContextDefault::getCurrentNode() const
   {
  -     return m_currentNode;
  +     return m_currentNodeStack.back();
  +}
  +
  +
  +
  +void
  +XPathExecutionContextDefault::pushCurrentNode(XalanNode*     theCurrentNode)
  +{
  +     m_currentNodeStack.push_back(theCurrentNode);
   }
   
   
   
   void
  -XPathExecutionContextDefault::setCurrentNode(XalanNode*              
theCurrentNode)
  +XPathExecutionContextDefault::popCurrentNode()
   {
  -     m_currentNode = theCurrentNode;
  +     m_currentNodeStack.pop_back();
   }
   
   
  
  
  
  1.2       +11 -2     
xml-xalan/c/src/xalanc/XPath/XPathExecutionContextDefault.hpp
  
  Index: XPathExecutionContextDefault.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/xalanc/XPath/XPathExecutionContextDefault.hpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XPathExecutionContextDefault.hpp  29 Jun 2003 03:58:00 -0000      1.1
  +++ XPathExecutionContextDefault.hpp  2 Aug 2003 01:06:52 -0000       1.2
  @@ -112,6 +112,12 @@
   {
   public:
   
  +#if defined(XALAN_NO_STD_NAMESPACE)
  +     typedef deque<XalanNode*>                       CurrentNodeStackType;
  +#else
  +     typedef std::deque<XalanNode*>          CurrentNodeStackType;
  +#endif
  +
        /**
         * Construct an XPathExecutionContextDefault object
         *
  @@ -217,7 +223,10 @@
        getCurrentNode() const;
   
        virtual void
  -     setCurrentNode(XalanNode*               theCurrentNode);
  +     pushCurrentNode(XalanNode*              theCurrentNode);
  +
  +     virtual void
  +     popCurrentNode();
   
        virtual bool
        isNodeAfter(
  @@ -408,7 +417,7 @@
   
        DOMSupport*                                                             
m_domSupport;
   
  -     XalanNode*                                                              
m_currentNode;
  +     CurrentNodeStackType                                    
m_currentNodeStack;
   
        const NodeRefListBase*                                  
m_contextNodeList;
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to