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...@locus.apache.org on 2000/08/23 01:28:00 UTC

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

dbertoni    00/08/22 16:28:00

  Modified:    c/src/XSLT StylesheetHandler.cpp StylesheetHandler.hpp
  Log:
  Track elements that have already been parented, so that they are not doubly-deleted.
  
  Revision  Changes    Path
  1.39      +41 -11    xml-xalan/c/src/XSLT/StylesheetHandler.cpp
  
  Index: StylesheetHandler.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetHandler.cpp,v
  retrieving revision 1.38
  retrieving revision 1.39
  diff -u -r1.38 -r1.39
  --- StylesheetHandler.cpp	2000/08/22 20:21:28	1.38
  +++ StylesheetHandler.cpp	2000/08/22 23:27:58	1.39
  @@ -129,6 +129,7 @@
   	m_stylesheet(stylesheetTree),
   	m_constructionContext(constructionContext),
   	m_elemStack(),
  +	m_elemStackParentedElements(),
   	m_strayElements(),
   	m_whiteSpaceElems(),
   	m_pTemplate(0),
  @@ -152,10 +153,30 @@
   	using std::for_each;
   #endif
   
  -	// Clean up the element stack vector
  -	for_each(m_elemStack.begin(),
  -			 m_elemStack.end(),
  -			 DeleteFunctor<ElemTemplateElement>());
  +	// Clean up the element stack vector...
  +	ElemTemplateStackType::const_iterator	i = m_elemStack.begin();
  +
  +	while(i != m_elemStack.end())
  +	{
  +		// See if the element is in the set of elements that have
  +		// already been parented, so we don't try to delete it after
  +		// it's parent has already deleted it...
  +		const ElemTemplateSetType::iterator		j =
  +				m_elemStackParentedElements.find(*i);
  +
  +		if (j == m_elemStackParentedElements.end())
  +		{
  +			// Not found, so delete it...
  +			delete *i;
  +		}
  +		else
  +		{
  +			// Found, so erase it from the set...
  +			m_elemStackParentedElements.erase(j);
  +		}
  +
  +		++i;
  +	}
   
   	// Clean up the whitespace elements.
   	for_each(m_whiteSpaceElems.begin(),
  @@ -166,6 +187,8 @@
   	for_each(m_strayElements.begin(),
   			 m_strayElements.end(),
   			 DeleteFunctor<ElemTemplateElement>());
  +
  +	m_elemStackParentedElements.clear();
   }
   
   
  @@ -309,6 +332,7 @@
   												m_stylesheet,
   												name, atts, lineNumber, columnNumber);
   					m_elemStack.push_back(m_pTemplate);
  +					m_elemStackParentedElements.insert(m_pTemplate);
   					m_inTemplate = true;
   					m_stylesheet.addTemplate(m_pTemplate, m_constructionContext);
   					break;
  @@ -318,7 +342,6 @@
   					{
   						m_constructionContext.warn("Old syntax: the functions instruction should use a url of " + m_constructionContext.getXalanXSLNameSpaceURL());
   					}
  -					// m_constructionContext.handleFunctionsInstruction((Element)child);
   				break;
   
   				case Constants::ELEMNAME_VARIABLE:
  @@ -337,6 +360,7 @@
   					m_elemStack.push_back(varelem);
   					m_inTemplate = true; // fake it out
   					m_stylesheet.setTopLevelVariable(varelem);
  +					m_elemStackParentedElements.insert(varelem);
   					varelem->setTopLevel(true);
   				}
   				break;
  @@ -651,6 +675,8 @@
   					foreach->getSortElems().push_back(sortElem);
   
   					sortElem->setParentNodeElem(foreach);
  +
  +					m_elemStackParentedElements.insert(foreach);
   				}
   				break;
   
  @@ -997,6 +1023,7 @@
   			{
   				ElemTemplateElement* const	parent = m_elemStack.back();
   				parent->appendChildElem(elem);
  +				m_elemStackParentedElements.insert(elem);
   			}
   
   			m_elemStack.push_back(elem);
  @@ -1013,6 +1040,8 @@
   			if (elem != 0)
   			{
   				delete elem;
  +
  +				m_elemStackParentedElements.erase(elem);
   			}
   		}
   	} // end try
  @@ -1029,6 +1058,7 @@
   		while(m_elemStack.empty() == false &&
   			  m_elemStack.back()->getXSLToken() != Constants::ELEMNAME_UNDEFINED)
   		{
  +			m_elemStackParentedElements.erase(m_elemStack.back());
   			m_elemStack.pop_back();
   		}
   
  @@ -1043,6 +1073,7 @@
   		while(m_elemStack.empty() == false &&
   			  m_elemStack.back()->getXSLToken() != Constants::ELEMNAME_UNDEFINED)
   		{
  +			m_elemStackParentedElements.erase(m_elemStack.back());
   			m_elemStack.pop_back();
   		}
   
  @@ -1170,13 +1201,9 @@
   			StylesheetHandler tp(*importedStylesheet.get(), m_constructionContext);
   
   			m_constructionContext.parseXML(hrefUrl, &tp, importedStylesheet.get());
  -
  -			// Add it to the front of the imports
  -			m_stylesheet.addImport(importedStylesheet.get(), true);
   
  -			// The imported stylesheet is now owned by the stylesheet, so
  -			// release the XalanAutoPtr.
  -			importedStylesheet.release();
  +			// Add it to the front of the imports, releasing the XalanAutoPtr...
  +			m_stylesheet.addImport(importedStylesheet.release(), true);
   
   			assert(equals(importStack.back(), hrefUrl));
   			importStack.pop_back();		
  @@ -1262,6 +1289,7 @@
   
   	m_lastPopped = m_elemStack.back();
   	m_elemStack.pop_back();
  +	m_elemStackParentedElements.erase(m_lastPopped);
   	m_lastPopped->setFinishedConstruction(true);
   
   	const int tok = m_lastPopped->getXSLToken();
  @@ -1592,6 +1620,7 @@
   StylesheetHandler::PushPopIncludeState::PushPopIncludeState(StylesheetHandler&	theHandler) :
   	m_handler(theHandler),
   	m_elemStack(theHandler.m_elemStack),
  +	m_elemStackParentedElements(theHandler.m_elemStackParentedElements),
   	m_pTemplate(theHandler.m_pTemplate),
   	m_lastPopped(theHandler.m_lastPopped),
   	m_inTemplate(theHandler.m_inTemplate),
  @@ -1629,6 +1658,7 @@
   			 DeleteFunctor<ElemTemplateElement>());
   
   	m_handler.m_elemStack = m_elemStack;
  +	m_handler.m_elemStackParentedElements = m_elemStackParentedElements;
   	m_handler.m_pTemplate = m_pTemplate;
   	m_handler.m_lastPopped = m_lastPopped;
   	m_handler.m_inTemplate = m_inTemplate;
  
  
  
  1.16      +12 -0     xml-xalan/c/src/XSLT/StylesheetHandler.hpp
  
  Index: StylesheetHandler.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetHandler.hpp,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- StylesheetHandler.hpp	2000/08/22 20:21:29	1.15
  +++ StylesheetHandler.hpp	2000/08/22 23:27:58	1.16
  @@ -67,6 +67,7 @@
   
   
   #include <vector>
  +#include <set>
   
   
   
  @@ -104,9 +105,11 @@
   #if defined(XALAN_NO_NAMESPACES)
   	typedef vector<ElemTemplateElement*>		ElemTemplateStackType;
   	typedef vector<ElemTextLiteral*>			ElemTextLiteralStackType;
  +	typedef set<ElemTemplateElement*>			ElemTemplateSetType;
   #else
   	typedef std::vector<ElemTemplateElement*>	ElemTemplateStackType;
   	typedef std::vector<ElemTextLiteral*>		ElemTextLiteralStackType;
  +	typedef std::set<ElemTemplateElement*>		ElemTemplateSetType;
   #endif
   
   	/**
  @@ -419,6 +422,13 @@
   	ElemTemplateStackType	m_elemStack;
   
   	/**
  +	 * The set of elements in m_elemStack which have already
  +	 * been parented.  This prevents us from deleting them
  +	 * twice if an exception is thrown.
  +	 */
  +	ElemTemplateSetType		m_elemStackParentedElements;
  +
  +	/**
   	 * The stack of stray elements, to be delete when finished.
   	 */
   	ElemTemplateStackType	m_strayElements;
  @@ -491,6 +501,8 @@
   		StylesheetHandler&					m_handler;
   
   		ElemTemplateStackType				m_elemStack;
  +
  +		ElemTemplateSetType					m_elemStackParentedElements;
   
   		ElemTemplate* const					m_pTemplate;