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/01/29 03:30:31 UTC
cvs commit: xml-xalan/c/src/XSLT StylesheetExecutionContextDefault.cpp StylesheetExecutionContextDefault.hpp StylesheetRoot.cpp
dbertoni 01/01/28 18:30:31
Modified: c/src/XSLT StylesheetExecutionContextDefault.cpp
StylesheetExecutionContextDefault.hpp
StylesheetRoot.cpp
Log:
Clear out transient objects in endDocument(). This closes any files that may have been opened.
Revision Changes Path
1.53 +53 -39 xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.cpp
Index: StylesheetExecutionContextDefault.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.cpp,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -r1.52 -r1.53
--- StylesheetExecutionContextDefault.cpp 2001/01/26 22:03:11 1.52
+++ StylesheetExecutionContextDefault.cpp 2001/01/29 02:30:31 1.53
@@ -758,8 +758,9 @@
// resolveTopLevelParams().
popContextMarker();
- // Clear any cached XPaths...
- clearXPathCache();
+ cleanUpTransients();
+
+ setFormatterListener(0);
}
@@ -1290,50 +1291,16 @@
void
StylesheetExecutionContextDefault::reset()
{
-#if !defined(XALAN_NO_NAMESPACES)
- using std::for_each;
-#endif
-
assert(m_elementRecursionStack.size() == 0);
m_variablesStack.reset();
m_xsltProcessor.reset();
-
- for_each(m_formatterListeners.begin(),
- m_formatterListeners.end(),
- DeleteFunctor<FormatterListener>());
- m_formatterListeners.clear();
-
- for_each(m_printWriters.begin(),
- m_printWriters.end(),
- DeleteFunctor<PrintWriter>());
-
- m_printWriters.clear();
-
- for_each(m_outputStreams.begin(),
- m_outputStreams.end(),
- DeleteFunctor<XalanOutputStream>());
+ // Just in case endDocument() was not called,
+ // clean things up...
+ cleanUpTransients();
- m_outputStreams.clear();
-
- // Clean up the key table vector
- for_each(m_keyTables.begin(),
- m_keyTables.end(),
- makeMapValueDeleteFunctor(m_keyTables));
-
- m_keyTables.clear();
-
- assert(m_matchPatternCache.size() == 0);
-
- // Destroy the source tree factory, which
- // will destroy all result tree fragment nodes
- // that were generated...
- m_sourceTreeResultTreeFactory.reset();
-
- m_countersTable.reset();
-
// Reset the default execution context...
m_xpathExecutionContextDefault.reset();
}
@@ -1955,4 +1922,51 @@
// Add the XPath with the current clock
m_matchPatternCache.insert(XPathCacheMapType::value_type(pattern, XPathCacheEntry(theXPath, addClock)));
+}
+
+
+
+void
+StylesheetExecutionContextDefault::cleanUpTransients()
+{
+#if !defined(XALAN_NO_NAMESPACES)
+ using std::for_each;
+#endif
+
+ for_each(m_formatterListeners.begin(),
+ m_formatterListeners.end(),
+ DeleteFunctor<FormatterListener>());
+
+ m_formatterListeners.clear();
+
+ for_each(m_printWriters.begin(),
+ m_printWriters.end(),
+ DeleteFunctor<PrintWriter>());
+
+ m_printWriters.clear();
+
+ for_each(m_outputStreams.begin(),
+ m_outputStreams.end(),
+ DeleteFunctor<XalanOutputStream>());
+
+ m_outputStreams.clear();
+
+ // Clean up the key table vector
+ for_each(m_keyTables.begin(),
+ m_keyTables.end(),
+ makeMapValueDeleteFunctor(m_keyTables));
+
+ m_keyTables.clear();
+
+ // Destroy the source tree factory, which
+ // will destroy all result tree fragment nodes
+ // that were generated...
+ m_sourceTreeResultTreeFactory.reset();
+
+ m_countersTable.reset();
+
+ // Clear any cached XPaths...
+ clearXPathCache();
+
+ assert(m_matchPatternCache.size() == 0);
}
1.47 +6 -0 xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.hpp
Index: StylesheetExecutionContextDefault.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.hpp,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -r1.46 -r1.47
--- StylesheetExecutionContextDefault.hpp 2001/01/26 22:03:13 1.46
+++ StylesheetExecutionContextDefault.hpp 2001/01/29 02:30:31 1.47
@@ -856,6 +856,12 @@
const XPath* theXPath);
+ /**
+ * Clean up anything that was created for use only during the transformation.
+ */
+ void
+ cleanUpTransients();
+
XPathExecutionContextDefault m_xpathExecutionContextDefault;
// $$ ToDo: Try to remove this dependency, and rely only on XSLTProcessor...
1.34 +5 -2 xml-xalan/c/src/XSLT/StylesheetRoot.cpp
Index: StylesheetRoot.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetRoot.cpp,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- StylesheetRoot.cpp 2000/12/01 22:11:19 1.33
+++ StylesheetRoot.cpp 2001/01/29 02:30:31 1.34
@@ -201,7 +201,7 @@
executionContext.resetCurrentState(sourceTree, sourceTree);
executionContext.setRootDocument(sourceTree);
-
+
if(executionContext.doDiagnosticsOutput())
{
executionContext.diag(StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("=============================")));
@@ -229,6 +229,9 @@
// occurs from here.
rootRule->execute(executionContext, sourceTree, sourceTree, QNameByReference());
+ // At this point, anything transient during the tranformation
+ // may have been deleted, so we may not refer to anything the
+ // execution context may have created for us.
executionContext.endDocument();
#if defined(XALAN_VQ_SPECIAL_TRACE)
@@ -349,7 +352,7 @@
{
if (outputTarget.getDocument() != 0)
{
- flistener = executionContext.createFormatterToDOM(outputTarget.getDocument(), 0);
+ flistener = executionContext.createFormatterToDOM(outputTarget.getDocument(), 0);
}
else if (outputTarget.getDocumentFragment() != 0)
{