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 2003/11/05 23:18:17 UTC

cvs commit: xml-xalan/c/src/xalanc/XPath XPath.cpp XPath.hpp XPathExecutionContext.hpp XPathExecutionContextDefault.cpp XPathExecutionContextDefault.hpp FoundIndex.cpp FoundIndex.hpp

dbertoni    2003/11/05 14:18:17

  Modified:    c/src/xalanc/XPath XPath.cpp XPath.hpp
                        XPathExecutionContext.hpp
                        XPathExecutionContextDefault.cpp
                        XPathExecutionContextDefault.hpp
  Removed:     c/src/xalanc/XPath FoundIndex.cpp FoundIndex.hpp
  Log:
  Cleaned up obsolete code that used exceptions to handle indexes in patterns.  push and pop the context node list to an internal stack for better stack management.
  
  Revision  Changes    Path
  1.6       +55 -76    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.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- XPath.cpp	19 Sep 2003 21:05:26 -0000	1.5
  +++ XPath.cpp	5 Nov 2003 22:18:17 -0000	1.6
  @@ -85,7 +85,6 @@
   
   
   #include "FormatterStringLengthCounter.hpp"
  -#include "FoundIndex.hpp"
   #include "MutableNodeRefList.hpp"
   #include "XalanQNameByReference.hpp"
   #include "XObject.hpp"
  @@ -2893,15 +2892,15 @@
   		break;
   	}
   
  -	// Push and pop the context node list...
  -	XPathExecutionContext::ContextNodeListSetAndRestore		theSetAndRestore(
  -									executionContext,
  -									*subQueryResults);
  -
   	opPos += argLen;
   
   	int		nextStepType = currentExpression.getOpCodeMapValue(opPos);
   
  +	// Push and pop the context node list...
  +		XPathExecutionContext::ContextNodeListPushAndPop	thePushAndPop(
  +										executionContext,
  +										*subQueryResults);
  +
   	if(XPathExpression::eOP_PREDICATE == nextStepType ||
   	   XPathExpression::eOP_PREDICATE_WITH_POSITION == nextStepType)
   	{
  @@ -2917,35 +2916,38 @@
   	{
   		const NodeRefListBase::size_type	nContexts = subQueryResults->getLength();
   
  -		for(NodeRefListBase::size_type i = 0; i < nContexts; i++)
  +		if (nContexts > 0)
   		{
  -			XalanNode* const	node = subQueryResults->item(i);
  -			assert(node != 0);
  +			for(NodeRefListBase::size_type i = 0; i < nContexts; i++)
  +			{
  +				XalanNode* const	node = subQueryResults->item(i);
  +				assert(node != 0);
   
  -			BorrowReturnMutableNodeRefList	mnl(executionContext);
  +				BorrowReturnMutableNodeRefList	mnl(executionContext);
   
  -			step(executionContext, node, opPos, *mnl);
  +				step(executionContext, node, opPos, *mnl);
   
  -			if (mnl->empty() == false)
  -			{
  -				if(queryResults.empty() == false)
  +				if (mnl->empty() == false)
   				{
  -					queryResults.addNodesInDocOrder(*mnl, executionContext);
  +					if(queryResults.empty() == false)
  +					{
  +						queryResults.addNodesInDocOrder(*mnl, executionContext);
   
  -					queryResults.setDocumentOrder();
  -				}
  -				else
  -				{
  -					assert(mnl->getDocumentOrder() == true);
  +						queryResults.setDocumentOrder();
  +					}
  +					else
  +					{
  +						assert(mnl->getDocumentOrder() == true);
   
  -					queryResults.swap(*mnl);
  +						queryResults.swap(*mnl);
  +					}
   				}
   			}
  -		}
   
  -		if (queryResults.empty() == true)
  -		{
  -			queryResults.setDocumentOrder();
  +			if (queryResults.empty() == true)
  +			{
  +				queryResults.setDocumentOrder();
  +			}
   		}
   	}
   	else
  @@ -3247,68 +3249,48 @@
   	{
   		score = eMatchScoreOther;
   
  -		// Execute the xpath.predicates, but if we have an index, then we have 
  -		// to start over and do a search from the parent.  It would be nice 
  -		// if I could sense this condition earlier...
  -#if 0
  -		try
  +		while(XPathExpression::eOP_PREDICATE == nextStepType ||
  +			  XPathExpression::eOP_PREDICATE_WITH_POSITION == nextStepType)
   		{
  -			executionContext.setThrowFoundIndex(true);
  -#endif
  -
  -			while(XPathExpression::eOP_PREDICATE == nextStepType ||
  -				  XPathExpression::eOP_PREDICATE_WITH_POSITION == nextStepType)
  +			// This is a quick hack to look ahead and see if we have
  +			// number literal as the predicate, i.e. match="foo[1]".
  +			if (XPathExpression::eOP_PREDICATE_WITH_POSITION == nextStepType)
   			{
  -				// This is a quick hack to look ahead and see if we have
  -				// number literal as the predicate, i.e. match="foo[1]".
  -				if (XPathExpression::eOP_PREDICATE_WITH_POSITION == nextStepType)
  +				if (m_expression.getOpCodeMapValue(opPos + 2) == XPathExpression::eOP_NUMBERLIT)
   				{
  -					if (m_expression.getOpCodeMapValue(opPos + 2) == XPathExpression::eOP_NUMBERLIT)
  -					{
  -						score = handleFoundIndexPositional(
  +					score = handleFoundIndexPositional(
   							executionContext,
   							context,
   							startOpPos);
  -					}
  -					else
  -					{
  -						score = handleFoundIndex(
  +				}
  +				else
  +				{
  +					score = handleFoundIndex(
   							executionContext,
   							context,
   							startOpPos);
  -					}
   				}
  -				else
  -				{
  -					const XObjectPtr	pred(predicate(context, opPos, executionContext));
  -					assert(pred.get() != 0);
  -
  -					if(XObject::eTypeNumber == pred->getType())
  -					{
  -						score = handleFoundIndex(executionContext, context, startOpPos);
  -					}
  -					else if(pred->boolean() == false)
  -					{
  -						score = eMatchScoreNone;
  +			}
  +			else
  +			{
  +				const XObjectPtr	pred(predicate(context, opPos, executionContext));
  +				assert(pred.get() != 0);
   
  -						break;
  -					}
  +				if(XObject::eTypeNumber == pred->getType())
  +				{
  +					score = handleFoundIndex(executionContext, context, startOpPos);
   				}
  +				else if(pred->boolean() == false)
  +				{
  +					score = eMatchScoreNone;
   
  -				opPos = currentExpression.getNextOpCodePosition(opPos);
  -				nextStepType = currentExpression.getOpCodeMapValue(opPos);
  +					break;
  +				}
   			}
   
  -#if 0
  -			executionContext.setThrowFoundIndex(false);
  +			opPos = currentExpression.getNextOpCodePosition(opPos);
  +			nextStepType = currentExpression.getOpCodeMapValue(opPos);
   		}
  -		catch(const FoundIndex&)
  -		{
  -			executionContext.setThrowFoundIndex(false);
  -
  -			score = handleFoundIndex(executionContext, context, startOpPos);
  -		}
  -#endif
   	}
   
   	if (scoreHolder == eMatchScoreNone || 
  @@ -4690,6 +4672,8 @@
   			int 					opPos,
   			MutableNodeRefList& 	subQueryResults) const
   {
  +	assert(&executionContext.getContextNodeList() == &subQueryResults);
  +
   	const XPathExpression&	currentExpression = getExpression();
   
   	assert(currentExpression.getOpCodeMapValue(opPos) == XPathExpression::eOP_PREDICATE ||
  @@ -4789,11 +4773,6 @@
   		else
   		{
   			theLength = subQueryResults.getLength();
  -
  -			if(theLength != 0)
  -			{
  -				executionContext.setContextNodeList(subQueryResults);
  -			}
   		}
   	}
   
  
  
  
  1.3       +12 -12    xml-xalan/c/src/xalanc/XPath/XPath.hpp
  
  Index: XPath.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/xalanc/XPath/XPath.hpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XPath.hpp	19 Sep 2003 21:05:26 -0000	1.2
  +++ XPath.hpp	5 Nov 2003 22:18:17 -0000	1.3
  @@ -330,8 +330,8 @@
   			const NodeRefListBase&	contextNodeList,
   			XPathExecutionContext&	executionContext) const
   	{
  -		// Set and restore the context node list...
  -		XPathExecutionContext::ContextNodeListSetAndRestore		theSetAndRestore(
  +		// Push and pop the context node list...
  +		XPathExecutionContext::ContextNodeListPushAndPop	thePushAndPop(
   										executionContext,
   										contextNodeList);
   
  @@ -355,8 +355,8 @@
   			XPathExecutionContext&	executionContext,
   			bool&					result) const
   	{
  -		// Set and restore the context node list...
  -		XPathExecutionContext::ContextNodeListSetAndRestore		theSetAndRestore(
  +		// Push and pop the context node list...
  +		XPathExecutionContext::ContextNodeListPushAndPop	thePushAndPop(
   										executionContext,
   										contextNodeList);
   
  @@ -380,8 +380,8 @@
   			XPathExecutionContext&	executionContext,
   			double&					result) const
   	{
  -		// Set and restore the context node list...
  -		XPathExecutionContext::ContextNodeListSetAndRestore		theSetAndRestore(
  +		// Push and pop the context node list...
  +		XPathExecutionContext::ContextNodeListPushAndPop	thePushAndPop(
   										executionContext,
   										contextNodeList);
   
  @@ -406,8 +406,8 @@
   			XPathExecutionContext&	executionContext,
   			XalanDOMString&			result) const
   	{
  -		// Set and restore the context node list...
  -		XPathExecutionContext::ContextNodeListSetAndRestore		theSetAndRestore(
  +		// Push and pop the context node list...
  +		XPathExecutionContext::ContextNodeListPushAndPop	thePushAndPop(
   										executionContext,
   										contextNodeList);
   
  @@ -433,8 +433,8 @@
   			FormatterListener&		formatterListener,
   			MemberFunctionPtr		function) const
   	{
  -		// Set and restore the context node list...
  -		XPathExecutionContext::ContextNodeListSetAndRestore		theSetAndRestore(
  +		// Push and pop the context node list...
  +		XPathExecutionContext::ContextNodeListPushAndPop	thePushAndPop(
   										executionContext,
   										contextNodeList);
   
  @@ -469,8 +469,8 @@
   			XPathExecutionContext&	executionContext,
   			MutableNodeRefList&		result) const
   	{
  -		// Set and restore the context node list...
  -		XPathExecutionContext::ContextNodeListSetAndRestore		theSetAndRestore(
  +		// Push and pop the context node list...
  +		XPathExecutionContext::ContextNodeListPushAndPop	thePushAndPop(
   										executionContext,
   										contextNodeList);
   
  
  
  
  1.5       +23 -33    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.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- XPathExecutionContext.hpp	26 Oct 2003 00:41:04 -0000	1.4
  +++ XPathExecutionContext.hpp	5 Nov 2003 22:18:17 -0000	1.5
  @@ -201,45 +201,49 @@
   			const XalanNode&	node2) const = 0;
   
   	/**
  -	 * Retrieve node list for current context.
  +	 * Push the node list for current context.
   	 * 
  -	 * @return node list
  +	 * @param theList new node list
   	 */
  -	virtual const NodeRefListBase&
  -	getContextNodeList() const = 0;
  +	virtual void
  +	pushContextNodeList(const NodeRefListBase&	theList) = 0;
   
   	/**
  -	 * Set node list for current context.
  -	 * 
  -	 * @param theList new node list
  +	 * Pop the node list for current context.
   	 */
   	virtual void	
  -	setContextNodeList(const NodeRefListBase&	theList) = 0;
  +	popContextNodeList() = 0;
   
  -	class ContextNodeListSetAndRestore
  +	class ContextNodeListPushAndPop
   	{
   	public:
   
  -		ContextNodeListSetAndRestore(
  +		ContextNodeListPushAndPop(
   				XPathExecutionContext&		theExecutionContext,
   				const NodeRefListBase&		theNodeList) :
  -			m_executionContext(theExecutionContext),
  -			m_savedNodeList(theExecutionContext.getContextNodeList())
  +			m_executionContext(theExecutionContext)
   		{
  -			m_executionContext.setContextNodeList(theNodeList);
  +			m_executionContext.pushContextNodeList(theNodeList);
   		}
   
  -		~ContextNodeListSetAndRestore()
  +		~ContextNodeListPushAndPop()
   		{
  -			m_executionContext.setContextNodeList(m_savedNodeList);
  +			m_executionContext.popContextNodeList();
   		}
   
   	private:
   
   		XPathExecutionContext&	m_executionContext;
  -		const NodeRefListBase&	m_savedNodeList;
   	};
   
  +	/**
  +	 * Get the node list for current context.
  +	 * 
  +	 * @return node list
  +	 */
  +	virtual const NodeRefListBase&
  +	getContextNodeList() const = 0;
  +
   	/*
   	 * Get the count of nodes in the current context node list.
   	 *
  @@ -671,25 +675,11 @@
   	shouldStripSourceNode(const XalanNode&	node) = 0;
   
   	/**
  -	 * Tells if FoundIndex should be thrown if index is found. This is an
  -	 * optimization for match patterns, and is used internally by the XPath
  -	 * engine.
  +	 * Get the document associated with the given URI.
   	 *
  -	 * @return true to throw FoundIndex
  +	 * @param theURI      document URI
  +	 * @return a pointer to the document instance, if any.
   	 */
  -	virtual bool
  -	getThrowFoundIndex() const = 0;
  -
  -	/**
  -	 * Changes whether FoundIndex should be thrown if index is found. This is an
  -	 * optimization for match patterns, and is used internally by the XPath
  -	 * engine.
  -	 *
  -	 * @param fThrow true to throw FoundIndex
  -	 */
  -	virtual void
  -	setThrowFoundIndex(bool 	fThrow) = 0;
  -
   	virtual XalanDocument*
   	getSourceDocument(const XalanDOMString&		theURI) const = 0;
   
  
  
  
  1.4       +31 -52    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.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XPathExecutionContextDefault.cpp	19 Sep 2003 21:05:26 -0000	1.3
  +++ XPathExecutionContextDefault.cpp	5 Nov 2003 22:18:17 -0000	1.4
  @@ -79,7 +79,6 @@
   
   
   
  -#include "FoundIndex.hpp"
   #include "XObjectFactory.hpp"
   #include "XalanQName.hpp"
   #include "XPathEnvSupport.hpp"
  @@ -105,15 +104,16 @@
   	m_xpathEnvSupport(&theXPathEnvSupport),
   	m_domSupport(&theDOMSupport),
   	m_currentNodeStack(),
  -	m_contextNodeList(theContextNodeList == 0 ? &s_dummyList : theContextNodeList),
  +	m_contextNodeListStack(),
   	m_prefixResolver(thePrefixResolver),
  -	m_throwFoundIndex(false),
   	m_nodeListCache(eNodeListCacheListSize),
   	m_stringCache(),
   	m_cachedPosition(),
   	m_scratchQName()
   {
   	m_currentNodeStack.push_back(theCurrentNode);
  +
  +	m_contextNodeListStack.push_back(theContextNodeList == 0 ? &s_dummyList : theContextNodeList);
   }
   
   
  @@ -126,15 +126,16 @@
   	m_xpathEnvSupport(0),
   	m_domSupport(0),
   	m_currentNodeStack(),
  -	m_contextNodeList(theContextNodeList == 0 ? &s_dummyList : theContextNodeList),
  +	m_contextNodeListStack(),
   	m_prefixResolver(thePrefixResolver),
  -	m_throwFoundIndex(false),
   	m_nodeListCache(eNodeListCacheListSize),
   	m_stringCache(),
   	m_cachedPosition(),
   	m_scratchQName()
   {
   	m_currentNodeStack.push_back(theCurrentNode);
  +
  +	m_contextNodeListStack.push_back(theContextNodeList == 0 ? &s_dummyList : theContextNodeList);
   }
   
   
  @@ -166,10 +167,9 @@
   	}
   
   	m_currentNodeStack.clear();
  +	m_contextNodeListStack.clear();
   
  -	m_contextNodeList = &s_dummyList;
   	m_prefixResolver = 0;
  -	m_throwFoundIndex = false;
   
   	m_nodeListCache.reset(),
   
  @@ -214,23 +214,32 @@
   
   
   
  -const NodeRefListBase&
  -XPathExecutionContextDefault::getContextNodeList() const
  +void	
  +XPathExecutionContextDefault::pushContextNodeList(const NodeRefListBase&	theList)
   {
  -	return *m_contextNodeList;
  +	m_cachedPosition.clear();
  +
  +	m_contextNodeListStack.push_back(&theList);
   }
   
   
   
   void	
  -XPathExecutionContextDefault::setContextNodeList(const NodeRefListBase&		theList)
  +XPathExecutionContextDefault::popContextNodeList()
   {
  -	if (&theList != m_contextNodeList)
  -	{
  -		m_contextNodeList = &theList;
  +	m_cachedPosition.clear();
   
  -		m_cachedPosition.clear();
  -	}
  +	m_contextNodeListStack.pop_back();
  +}
  +
  +
  +
  +const NodeRefListBase&
  +XPathExecutionContextDefault::getContextNodeList() const
  +{
  +	assert(m_contextNodeListStack.empty() == false);
  +
  +	return *m_contextNodeListStack.back();
   }
   
   
  @@ -238,16 +247,9 @@
   XPathExecutionContextDefault::size_type
   XPathExecutionContextDefault::getContextNodeListLength() const
   {
  -#if 1
  -	assert(m_throwFoundIndex == false);
  -#else
  -	if (m_throwFoundIndex == true)
  -	{
  -		throw FoundIndex();
  -	}
  -#endif
  +	assert(m_contextNodeListStack.empty() == false);
   
  -	return m_contextNodeList->getLength();
  +	return m_contextNodeListStack.back()->getLength();
   }
   
   
  @@ -255,24 +257,17 @@
   XPathExecutionContextDefault::size_type
   XPathExecutionContextDefault::getContextNodeListPosition(const XalanNode&	contextNode) const
   {
  -#if 1
  -	assert(m_throwFoundIndex == false);
  -#else
  -	if (m_throwFoundIndex == true)
  -	{
  -		throw FoundIndex();
  -	}
  -#endif
  +	assert(m_contextNodeListStack.empty() == false);
   
   	if (m_cachedPosition.m_node == &contextNode)
   	{
  -		assert((m_cachedPosition.m_index == 0 && m_contextNodeList->indexOf(&contextNode) == NodeRefListBase::npos) ||
  -			   (m_contextNodeList->indexOf(&contextNode) + 1 == m_cachedPosition.m_index));
  +		assert((m_cachedPosition.m_index == 0 && m_contextNodeListStack.back()->indexOf(&contextNode) == NodeRefListBase::npos) ||
  +			   (m_contextNodeListStack.back()->indexOf(&contextNode) + 1 == m_cachedPosition.m_index));
   	}
   	else
   	{
   		// Get the index of the node...
  -		const size_type		theIndex = m_contextNodeList->indexOf(&contextNode);
  +		const size_type		theIndex = m_contextNodeListStack.back()->indexOf(&contextNode);
   
   		// If not found, it's 0.  Otherwise, it's the index + 1
   #if defined(XALAN_NO_MUTABLE)
  @@ -682,22 +677,6 @@
   			const LocatorType* 	locator) const
   {
   	message(TranscodeFromLocalCodePage(msg), sourceNode, locator);
  -}
  -
  -			
  -			
  -bool
  -XPathExecutionContextDefault::getThrowFoundIndex() const
  -{
  -	return m_throwFoundIndex;
  -}
  -
  -
  -
  -void
  -XPathExecutionContextDefault::setThrowFoundIndex(bool 	fThrow)
  -{
  -	m_throwFoundIndex = fThrow;
   }
   
   
  
  
  
  1.4       +11 -14    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.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XPathExecutionContextDefault.hpp	19 Sep 2003 21:05:26 -0000	1.3
  +++ XPathExecutionContextDefault.hpp	5 Nov 2003 22:18:17 -0000	1.4
  @@ -113,9 +113,11 @@
   public:
   
   #if defined(XALAN_NO_STD_NAMESPACE)
  -	typedef deque<XalanNode*>			CurrentNodeStackType;
  +	typedef deque<XalanNode*>				CurrentNodeStackType;
  +	typedef deque<const NodeRefListBase*>	ContextNodeListStackType;
   #else
  -	typedef std::deque<XalanNode*>		CurrentNodeStackType;
  +	typedef std::deque<XalanNode*>				CurrentNodeStackType;
  +	typedef std::deque<const NodeRefListBase*>	ContextNodeListStackType;
   #endif
   
   	/**
  @@ -233,11 +235,14 @@
   			const XalanNode&	node1,
   			const XalanNode&	node2) const;
   
  -	virtual const NodeRefListBase&
  -	getContextNodeList() const;
  +	virtual void
  +	pushContextNodeList(const NodeRefListBase&	theList);
   
   	virtual void	
  -	setContextNodeList(const NodeRefListBase&	theList);
  +	popContextNodeList();
  +
  +	virtual const NodeRefListBase&
  +	getContextNodeList() const;
   
   	virtual size_type
   	getContextNodeListLength() const;
  @@ -329,12 +334,6 @@
   	virtual bool
   	shouldStripSourceNode(const XalanNode&	node);
   
  -	virtual bool
  -	getThrowFoundIndex() const;
  -
  -	virtual void
  -	setThrowFoundIndex(bool 	fThrow);
  -
   	virtual XalanDocument*
   	getSourceDocument(const XalanDOMString&		theURI) const;
   
  @@ -419,11 +418,9 @@
   
   	CurrentNodeStackType					m_currentNodeStack;
   
  -	const NodeRefListBase*					m_contextNodeList;
  +	ContextNodeListStackType				m_contextNodeListStack;
   
   	const PrefixResolver*					m_prefixResolver;
  -
  -	bool									m_throwFoundIndex;
   
   	XalanDOMString							m_currentPattern;
   
  
  
  

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