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 2001/02/04 06:43:36 UTC

cvs commit: xml-xalan/c/src/XSLT VariablesStack.cpp VariablesStack.hpp

dbertoni    01/02/03 21:43:36

  Modified:    c/src/XSLT VariablesStack.cpp VariablesStack.hpp
  Log:
  Fixed bug with xsl:with-param with no matching xsl:param in the called template.  Fixes variable26.
  
  Revision  Changes    Path
  1.12      +87 -16    xml-xalan/c/src/XSLT/VariablesStack.cpp
  
  Index: VariablesStack.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/VariablesStack.cpp,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- VariablesStack.cpp	2001/01/26 23:01:51	1.11
  +++ VariablesStack.cpp	2001/02/04 05:43:35	1.12
  @@ -145,10 +145,10 @@
   
   	for(int i = (nElems - 1); i >= 0 && m_stack.empty() == false; --i)
   	{
  -		const StackEntry&	theEntry = m_stack[i];
  +		const StackEntry&			theEntry = m_stack[i];
   		assert(theEntry == back());
   
  -		const StackEntry::eStackEntryType	type = theEntry.getType();
  +		const StackEntry::eType		type = theEntry.getType();
   		assert(type < StackEntry::eNextValue && type >= 0);
   
   		pop();
  @@ -244,13 +244,13 @@
   
   	if (theEntry.m_value.null() == false)
   	{
  -		m_variablesStack.push(VariablesStack::StackEntry(theEntry.m_qname, theEntry.m_value));
  +		m_variablesStack.push(VariablesStack::StackEntry(theEntry.m_qname, theEntry.m_value, true));
   	}
   	else
   	{
   		assert(theEntry.m_variable != 0);
   
  -		m_variablesStack.push(VariablesStack::StackEntry(theEntry.m_qname, theEntry.m_variable));
  +		m_variablesStack.push(VariablesStack::StackEntry(theEntry.m_qname, theEntry.m_variable, true));
   	}
   }
   
  @@ -322,6 +322,31 @@
   
   
   void
  +VariablesStack::resetParams()
  +{
  +	const unsigned int	nElems = getCurrentStackFrameIndex();
  +
  +	// There is guaranteed to be a context marker at
  +	// the bottom of the stack, so i should stop at
  +	// 1.
  +	for(unsigned int i = nElems - 1; i > 0; --i)
  +	{
  +		StackEntry&		theEntry = m_stack[i];
  +
  +		if(theEntry.getType() == StackEntry::eContextMarker)
  +		{
  +			break;
  +		}
  +		else
  +		{
  +			theEntry.deactivate();
  +		}
  +	}
  +}
  +
  +
  +
  +void
   VariablesStack::markGlobalStackFrame()
   {
   	m_globalStackFrameIndex = m_stack.size();
  @@ -362,11 +387,12 @@
   VariablesStack::findXObject(
   			const QName&					name,
   			StylesheetExecutionContext&		executionContext,
  +			bool							fIsParam,
   			bool							fSearchGlobalSpace,
   			bool&							fNameFound)
   {
   	StackEntry* const	theEntry =
  -		findEntry(name, fSearchGlobalSpace);
  +		findEntry(name, fIsParam, fSearchGlobalSpace);
   
   	if (theEntry == 0)
   	{
  @@ -378,7 +404,9 @@
   	{
   		fNameFound = true;
   
  -		assert(theEntry->getType() == StackEntry::eVariable);
  +		assert(theEntry->getType() == StackEntry::eVariable ||
  +			   theEntry->getType() == StackEntry::eParam ||
  +			   theEntry->getType() == StackEntry::eActiveParam);
   
   		const XObjectPtr&	theValue = theEntry->getValue();
   
  @@ -403,6 +431,7 @@
   				assert(theNewValue.null() == false);
   
   				theEntry->setValue(theNewValue);
  +				theEntry->activate();
   			}
   
   			return theNewValue;
  @@ -415,6 +444,7 @@
   VariablesStack::StackEntry*
   VariablesStack::findEntry(
   			const QName&	qname,
  +			bool			fIsParam,
   			bool			fSearchGlobalSpace)
   {
   	StackEntry*		theResult = 0;
  @@ -428,9 +458,12 @@
   		// 1.
   		for(unsigned int i = nElems - 1; i > 0; --i)
   		{
  -			StackEntry&		theEntry = m_stack[i];
  +			StackEntry&					theEntry = m_stack[i];
   
  -			if(theEntry.getType() == StackEntry::eVariable)
  +			const StackEntry::eType		theType = theEntry.getType();
  +
  +			if(theType == StackEntry::eVariable ||
  +			   theType == StackEntry::eActiveParam)
   			{
   				assert(theEntry.getName() != 0);
   
  @@ -441,6 +474,20 @@
   					break;
   				}
   			}
  +			else if (theType == StackEntry::eParam)
  +			{
  +				if (fIsParam == true)
  +				{
  +					if(theEntry.getName()->equals(qname))
  +					{
  +						theEntry.activate();
  +
  +						theResult = &theEntry;
  +
  +						break;
  +					}
  +				}
  +			}
   			else if(theEntry.getType() == StackEntry::eContextMarker)
   			{
   				break;
  @@ -448,7 +495,7 @@
   		}
   	}
   
  -	if(0 == theResult && true == fSearchGlobalSpace && m_globalStackFrameIndex > 1)
  +	if(0 == theResult && fIsParam == false && true == fSearchGlobalSpace && m_globalStackFrameIndex > 1)
   	{
   		// Look in the global space
   		for(unsigned int i = m_globalStackFrameIndex - 1; i > 0; i--)
  @@ -552,9 +599,10 @@
   
   
   VariablesStack::StackEntry::StackEntry(
  -		const QName*		name,
  -		const XObjectPtr&	val) :
  -	m_type(eVariable),
  +			const QName*		name,
  +			const XObjectPtr&	val,
  +			bool				isParam) :
  +	m_type(isParam == true ? eParam : eVariable),
   	m_qname(name),
   	m_value(val),
   	m_variable(0),
  @@ -566,8 +614,9 @@
   
   VariablesStack::StackEntry::StackEntry(
   			const QName*			name,
  -			const ElemVariable*		var) :
  -	m_type(eVariable),
  +			const ElemVariable*		var,
  +			bool					isParam) :
  +	m_type(isParam == true ? eParam : eVariable),
   	m_qname(name),
   	m_value(),
   	m_variable(var),
  @@ -612,7 +661,7 @@
   {
   	m_type = theRHS.m_type;
   
  -	if (m_type == eVariable)
  +	if (m_type == eVariable || m_type == eParam || m_type == eActiveParam)
   	{
   		m_qname = theRHS.m_qname;
   
  @@ -654,7 +703,7 @@
   				fResult = true;
   			}
   		}
  -		else if (m_type == eVariable)
  +		else if (m_type == eVariable || m_type == eParam || m_type == eActiveParam)
   		{
   			// We only need to compare the variable related members...
   			if (m_value == theRHS.m_value ||
  @@ -677,6 +726,28 @@
   	}
   
   	return fResult;
  +}
  +
  +
  +
  +void
  +VariablesStack::StackEntry::activate()
  +{
  +	if (m_type == eParam)
  +	{
  +		m_type = eActiveParam;
  +	}
  +}
  +
  +
  +
  +void
  +VariablesStack::StackEntry::deactivate()
  +{
  +	if (m_type == eActiveParam)
  +	{
  +		m_type = eParam;
  +	}
   }
   
   
  
  
  
  1.9       +28 -10    xml-xalan/c/src/XSLT/VariablesStack.hpp
  
  Index: VariablesStack.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/VariablesStack.hpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- VariablesStack.hpp	2001/01/16 02:38:12	1.8
  +++ VariablesStack.hpp	2001/02/04 05:43:35	1.9
  @@ -208,7 +208,7 @@
   			StylesheetExecutionContext&		executionContext,
   			bool&							fNameFound)
   	{
  -		return findXObject(qname, executionContext, false, fNameFound);
  +		return findXObject(qname, executionContext, true, false, fNameFound);
   	}
   
   	/**
  @@ -226,7 +226,7 @@
   			StylesheetExecutionContext&		executionContext,
   			bool&							fNameFound)
   	{
  -		return findXObject(qname, executionContext, true, fNameFound);
  +		return findXObject(qname, executionContext, false, true, fNameFound);
   	}
   
   	/**
  @@ -266,6 +266,12 @@
   	start();
   
   	/**
  +	 * Reset all params in the current stack frame.
  +	 */
  +	void
  +	resetParams();
  +
  +	/**
   	 * Mark the top of the global stack frame.
   	 */
   	void
  @@ -383,10 +389,12 @@
   		 * Enumeration for types of stack entries, one of context state, context
   		 * marker, element marker, or argument.
   		 */
  -		enum eStackEntryType { eContextMarker,
  -							   eVariable,
  -							   eElementFrameMarker,
  -							   eNextValue };
  +		enum eType { eContextMarker,
  +				    eVariable,
  +					eParam,
  +					eActiveParam,
  +					eElementFrameMarker,
  +					eNextValue };
   
   		/**
   		 * Construct a context marker.
  @@ -399,14 +407,16 @@
   		 */
   		StackEntry(
   			const QName*		name,
  -			const XObjectPtr&	val);
  +			const XObjectPtr&	val,
  +			bool				isParam = false);
   
   		/**
   		 * Construct a variable that has not been evaluated yet.
   		 */
   		StackEntry(
   			const QName*			name,
  -			const ElemVariable*		var);
  +			const ElemVariable*		var,
  +			bool					isParam = false);
   
   		/**
   		 * Construct an element frame marker.
  @@ -429,7 +439,7 @@
   		 * 
   		 * @return enumeration value for type
   		 */
  -		eStackEntryType
  +		eType
   		getType() const
   		{
   			return m_type;
  @@ -479,6 +489,12 @@
   			return m_variable;
   		}
   
  +		void
  +		activate();
  +
  +		void
  +		deactivate();
  +
   		/**
   		 * Retrieve the ElemTemplateElem where frame begins.  Valid only for element frame markers
   		 *
  @@ -499,7 +515,7 @@
   	private:
   
   		// Data members...
  -		eStackEntryType				m_type;
  +		eType						m_type;
   
   		const QName*				m_qname;
   
  @@ -523,12 +539,14 @@
   	findXObject(
   			const QName&					name,
   			StylesheetExecutionContext&		executionContext,
  +			bool							fIsParam,
   			bool							fSearchGlobalSpace,
   			bool&							fNameFound);
   
   	StackEntry*
   	findEntry(
   			const QName&	name,
  +			bool			fIsParam,
   			bool			fSearchGlobalSpace);