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/07/21 21:53:05 UTC
cvs commit: xml-xalan/c/src/XSLT ElemVariable.cpp ElemVariable.hpp StackEntry.cpp StackEntry.hpp Stylesheet.cpp Stylesheet.hpp StylesheetExecutionContext.cpp StylesheetExecutionContext.hpp StylesheetExecutionContextDefault.cpp StylesheetExecutionContextDefault.hpp StylesheetRoot.cpp VariablesStack.cpp XSLTEngineImpl.cpp XSLTEngineImpl.hpp XSLTProcessor.hpp XSLTProcessorEnvSupport.hpp XSLTProcessorEnvSupportDefault.cpp XSLTProcessorEnvSupportDefault.hpp XSLTResultTarget.cpp XSLTResultTarget.hpp
dbertoni 00/07/21 12:53:04
Modified: c/src/XSLT ElemVariable.cpp ElemVariable.hpp StackEntry.cpp
StackEntry.hpp Stylesheet.cpp Stylesheet.hpp
StylesheetExecutionContext.cpp
StylesheetExecutionContext.hpp
StylesheetExecutionContextDefault.cpp
StylesheetExecutionContextDefault.hpp
StylesheetRoot.cpp VariablesStack.cpp
XSLTEngineImpl.cpp XSLTEngineImpl.hpp
XSLTProcessor.hpp XSLTProcessorEnvSupport.hpp
XSLTProcessorEnvSupportDefault.cpp
XSLTProcessorEnvSupportDefault.hpp
XSLTResultTarget.cpp XSLTResultTarget.hpp
Log:
Performance tuning work.
Revision Changes Path
1.7 +19 -25 xml-xalan/c/src/XSLT/ElemVariable.cpp
Index: ElemVariable.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemVariable.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- ElemVariable.cpp 2000/05/24 19:38:49 1.6
+++ ElemVariable.cpp 2000/07/21 19:52:55 1.7
@@ -155,40 +155,34 @@
{
ElemTemplateElement::execute(executionContext, sourceTree, sourceNode, mode);
- XObject* const var = getValue(executionContext, sourceTree, sourceNode);
-
- executionContext.pushVariable(m_qname,
- var,
- getParentNode());
-}
-
-
-
-XObject*
-ElemVariable::getValue(
- StylesheetExecutionContext& executionContext,
- XalanNode* sourceTree,
- XalanNode* sourceNode) const
-{
- XObject* var = 0;
-
if(0 != m_selectPattern)
{
- var = m_selectPattern->execute(sourceNode, *this, executionContext);
+ executionContext.pushVariable(
+ m_qname,
+ getParentNodeElem(),
+ *m_selectPattern,
+ sourceNode,
+ *this);
if(0 != executionContext.getTraceListeners())
{
executionContext.fireSelectEvent(
- SelectionEvent(executionContext, sourceNode,
- *this, XalanDOMString(XALAN_STATIC_UCODE_STRING("select")), *m_selectPattern, var));
+ SelectionEvent(
+ executionContext,
+ sourceNode,
+ *this,
+ XalanDOMString(XALAN_STATIC_UCODE_STRING("select")),
+ *m_selectPattern,
+ executionContext.getVariable(m_qname)));
}
}
else
{
- var = executionContext.createXResultTreeFrag(*this,
- sourceTree,
- sourceNode);
+ executionContext.pushVariable(
+ m_qname,
+ getParentNodeElem(),
+ *this,
+ sourceTree,
+ sourceNode);
}
-
- return var;
}
1.5 +6 -6 xml-xalan/c/src/XSLT/ElemVariable.hpp
Index: ElemVariable.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemVariable.hpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- ElemVariable.hpp 2000/04/11 15:09:27 1.4
+++ ElemVariable.hpp 2000/07/21 19:52:55 1.5
@@ -58,7 +58,7 @@
#define XALAN_ELEMVARIABLE_HEADER_GUARD
/**
- * $Id: ElemVariable.hpp,v 1.4 2000/04/11 15:09:27 dbertoni Exp $
+ * $Id: ElemVariable.hpp,v 1.5 2000/07/21 19:52:55 dbertoni Exp $
*
* $State: Exp $
*
@@ -119,11 +119,11 @@
* @param sourceTree input source tree
* @param sourceNode current context node
*/
- XObject*
- getValue(
- StylesheetExecutionContext& executionContext,
- XalanNode* sourceTree,
- XalanNode* sourceNode) const;
+// XObject*
+// getValue(
+// StylesheetExecutionContext& executionContext,
+// XalanNode* sourceTree,
+// XalanNode* sourceNode) const;
/**
* Determines if this is a top level variable.
1.2 +15 -0 xml-xalan/c/src/XSLT/StackEntry.cpp
Index: StackEntry.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StackEntry.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- StackEntry.cpp 1999/12/18 19:48:04 1.1
+++ StackEntry.cpp 2000/07/21 19:52:56 1.2
@@ -58,9 +58,18 @@
+#if !defined(NDEBUG)
+unsigned long StackEntry::s_instanceCount = 0;
+#endif
+
+
+
StackEntry::StackEntry(eStackEntryType theType) :
m_type(theType)
{
+#if !defined(NDEBUG)
+ ++s_instanceCount;
+#endif
}
@@ -68,12 +77,18 @@
StackEntry::StackEntry(const StackEntry& theSource) :
m_type(theSource.m_type)
{
+#if !defined(NDEBUG)
+ ++s_instanceCount;
+#endif
}
StackEntry::~StackEntry()
{
+#if !defined(NDEBUG)
+ --s_instanceCount;
+#endif
}
1.4 +9 -26 xml-xalan/c/src/XSLT/StackEntry.hpp
Index: StackEntry.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StackEntry.hpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- StackEntry.hpp 2000/05/29 22:46:34 1.3
+++ StackEntry.hpp 2000/07/21 19:52:56 1.4
@@ -93,34 +93,13 @@
return m_type;
}
- /**
- * Create a copy of this stack entry object.
- *
- * @return pointer to copy
- */
- virtual StackEntry*
- clone() const = 0;
-
- /**
- * Compare this stack entry to another
- *
- * @param rhs the object for comparison
- * @return true if both represent the same value
- */
- virtual bool
- equals(const StackEntry& rhs) const = 0;
-
- /**
- * Compare this stack entry to another
- *
- * @param rhs the object for comparison
- * @return true if both represent the same value
- */
- bool
- operator==(const StackEntry& theRHS) const
+#if !defined(NDEBUG)
+ static unsigned long
+ getInstanceCount()
{
- return equals(theRHS);
+ return s_instanceCount;
}
+#endif
protected:
@@ -130,6 +109,10 @@
StackEntry(const StackEntry& theSource);
private:
+
+#if !defined(NDEBUG)
+ static unsigned long s_instanceCount;
+#endif
// Data members...
eStackEntryType m_type;
1.25 +26 -58 xml-xalan/c/src/XSLT/Stylesheet.cpp
Index: Stylesheet.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/Stylesheet.cpp,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- Stylesheet.cpp 2000/07/11 19:54:53 1.24
+++ Stylesheet.cpp 2000/07/21 19:52:56 1.25
@@ -119,7 +119,6 @@
PrefixResolver(),
m_stylesheetRoot(root),
m_baseIdent(baseIdentifier),
- m_document(),
m_key_tables(),
m_keyDeclarations(),
m_needToBuildKeysTable(false),
@@ -152,7 +151,7 @@
{
typedef StylesheetConstructionContext::URLAutoPtrType URLAutoPtrType;
- URLAutoPtrType url = constructionContext.getURLFromString(m_baseIdent);
+ URLAutoPtrType url(constructionContext.getURLFromString(m_baseIdent));
if (url.get() != 0)
{
@@ -584,40 +583,6 @@
-XObject*
-Stylesheet::getTopLevelVariable(
- const XalanDOMString& name,
- StylesheetExecutionContext& executionContext) const
-{
- XObject* theResult = executionContext.getTopLevelVariable(name);
-
- if(0 == theResult)
- {
- const unsigned int nImports = m_imports.size();
-
- for(unsigned int i = 0; i < nImports; i++)
- {
- const Stylesheet* const stylesheet = m_imports[i];
- assert(stylesheet != 0);
-
- theResult = stylesheet->getTopLevelVariable(name, executionContext);
-
- if(0 != theResult)
- {
- break;
- }
- }
- }
-
- if(0 == theResult)
- {
- executionContext.warn(XalanDOMString("Could not find variable def for: ") + name);
- }
-
- return theResult;
-}
-
-
ElemTemplate*
Stylesheet::findTemplate(
StylesheetExecutionContext& executionContext,
@@ -1120,19 +1085,21 @@
void Stylesheet::pushTopLevelVariables(
StylesheetExecutionContext& executionContext,
- ParamVectorType& topLevelParams) const
+ const ParamVectorType& topLevelParams) const
{
// try
{
- int i, nImports = m_imports.size();
- for(i = 0; i < nImports; i++)
+ ParamVectorType::size_type i = 0;
+ const ParamVectorType::size_type nImports = m_imports.size();
+
+ for(; i < nImports; i++)
{
const Stylesheet* const stylesheet = m_imports[i];
stylesheet->pushTopLevelVariables(executionContext, topLevelParams);
}
- const int nVars = m_topLevelVariables.size();
+ const ParamVectorType::size_type nVars = m_topLevelVariables.size();
for(i = 0; i < nVars; i++)
{
@@ -1145,33 +1112,33 @@
{
isParam = false;
- const int n = topLevelParams.size();
+ const ParamVectorType::size_type n = topLevelParams.size();
- for(int k = 0; k < n; k++)
+ for(ParamVectorType::size_type k = 0; k < n; k++)
{
- Arg& a = topLevelParams[k];
+ const ParamVectorType::value_type& arg = topLevelParams[k];
- if(a.getName().equals(var->getName()))
+ if(arg.getName().equals(var->getName()))
{
isParam = true;
-
- XObject *pXO = 0;
- const XalanDOMString& expr = a.getExpression();
+ XObject* const theXObject = arg.getXObject();
- if(length(expr) != 0)
+ if (theXObject != 0)
{
- pXO = executionContext.executeXPath(expr,
- executionContext.getRootDocument(),
- *this);
-
- a.setXObjectPtr(pXO);
- a.setExpression(0);
+ executionContext.pushVariable(arg.getName(),
+ theXObject,
+ 0);
+ }
+ else
+ {
+ executionContext.pushVariable(arg.getName(),
+ 0,
+ arg.getExpression(),
+ executionContext.getRootDocument(),
+ *this);
}
- executionContext.pushVariable(a.getName(),
- pXO,
- this);
break;
}
}
@@ -1179,7 +1146,8 @@
if (isParam == false)
{
- XalanDocument* const doc = executionContext.getRootDocument();
+ XalanNode* const doc = executionContext.getRootDocument();
+ assert(doc != 0);
var->execute(executionContext,
doc,
1.17 +21 -38 xml-xalan/c/src/XSLT/Stylesheet.hpp
Index: Stylesheet.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/Stylesheet.hpp,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- Stylesheet.hpp 2000/07/11 19:54:53 1.16
+++ Stylesheet.hpp 2000/07/21 19:52:56 1.17
@@ -85,8 +85,8 @@
-#include "Arg.hpp"
-#include "KeyDeclaration.hpp"
+#include <XSLT/KeyDeclaration.hpp>
+#include <XSLT/StylesheetExecutionContext.hpp>
@@ -103,7 +103,6 @@
class NodeRefListBase;
class PrefixResolver;
class StylesheetConstructionContext;
-class StylesheetExecutionContext;
class StylesheetRoot;
class XMLURL;
class XObject;
@@ -127,25 +126,26 @@
# define XALAN_STD std::
#endif
-typedef XALAN_STD map<XalanDOMString, XalanDOMString> PrefixAliasesMapType;
-typedef XALAN_STD map<XalanDOMString, ExtensionNSHandler*> ExtensionNamespacesMapType;
-typedef XALAN_STD map<QName, ElemTemplateElement*> ElemTemplateElementMapType;
-typedef XALAN_STD vector<Arg> ParamVectorType;
-typedef XALAN_STD vector<ElemAttributeSet*> AttributeSetMapType;
-typedef XALAN_STD vector<ElemVariable*> ElemVariableVectorType;
-typedef XALAN_STD vector<KeyDeclaration> KeyDeclarationVectorType;
-typedef XALAN_STD vector<KeyTable*> KeyTableVectorType;
-typedef XALAN_STD map<const XalanNode*, KeyTable*> KeyTablesTableType;
-typedef XALAN_STD vector<NameSpace> NamespaceVectorType;
-typedef XALAN_STD vector<NamespaceVectorType> NamespacesStackType;
-typedef XALAN_STD vector<QName> QNameVectorType;
-typedef XALAN_STD vector<const Stylesheet*> StylesheetVectorType;
-typedef XALAN_STD vector<const XMLURL*> URLStackType;
-typedef XALAN_STD vector<const XPath*> XPathVectorType;
-typedef XALAN_STD vector<ElemDecimalFormat*> ElemDecimalFormatVectorType;
+typedef XALAN_STD map<XalanDOMString, XalanDOMString> PrefixAliasesMapType;
+typedef XALAN_STD map<XalanDOMString, ExtensionNSHandler*> ExtensionNamespacesMapType;
+typedef XALAN_STD map<QName, ElemTemplateElement*> ElemTemplateElementMapType;
+typedef XALAN_STD vector<ElemAttributeSet*> AttributeSetMapType;
+typedef XALAN_STD vector<ElemVariable*> ElemVariableVectorType;
+typedef XALAN_STD vector<KeyDeclaration> KeyDeclarationVectorType;
+typedef XALAN_STD vector<KeyTable*> KeyTableVectorType;
+typedef XALAN_STD map<const XalanNode*, KeyTable*> KeyTablesTableType;
+typedef XALAN_STD vector<NameSpace> NamespaceVectorType;
+typedef XALAN_STD vector<NamespaceVectorType> NamespacesStackType;
+typedef XALAN_STD vector<QName> QNameVectorType;
+typedef XALAN_STD vector<const Stylesheet*> StylesheetVectorType;
+typedef XALAN_STD vector<const XMLURL*> URLStackType;
+typedef XALAN_STD vector<const XPath*> XPathVectorType;
+typedef XALAN_STD vector<ElemDecimalFormat*> ElemDecimalFormatVectorType;
#undef XALAN_STD
+ typedef StylesheetExecutionContext::ParamVectorType ParamVectorType;
+
/**
* Constructor for a Stylesheet needs a Document.
* @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide
@@ -634,18 +634,6 @@
StylesheetExecutionContext& executionContext) const;
/**
- * Given the name of a variable, return its corresponding XObject
- *
- * @param name name of variable
- * @param executionContext current execution context
- * @return pointer to object
- */
- virtual XObject*
- getTopLevelVariable(
- const XalanDOMString& name,
- StylesheetExecutionContext& executionContext) const;
-
- /**
* Given a target element, find the template that best matches in the given
* XSL document, according to the rules specified in the xsl draft.
*
@@ -935,7 +923,7 @@
void
pushTopLevelVariables(
StylesheetExecutionContext& executionContext,
- ParamVectorType& topLevelParams) const;
+ const ParamVectorType& topLevelParams) const;
const XPathVectorType&
getWhitespacePreservingElements() const
@@ -1164,14 +1152,9 @@
XPathVectorType m_whitespaceStrippingElements;
/**
- * The root XSL stylesheet.
- */
- XalanDocument* m_document;
-
- /**
* Table of tables of element keys. See KeyTable.
*/
- mutable KeyTableVectorType m_key_tables;
+ KeyTableVectorType m_key_tables;
/**
* Table of KeyDeclaration objects, which are set by the
1.4 +4 -6 xml-xalan/c/src/XSLT/StylesheetExecutionContext.cpp
Index: StylesheetExecutionContext.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContext.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- StylesheetExecutionContext.cpp 2000/05/15 15:57:45 1.3
+++ StylesheetExecutionContext.cpp 2000/07/21 19:52:56 1.4
@@ -78,18 +78,16 @@
StylesheetExecutionContext::ParamsPushPop::ParamsPushPop(
StylesheetExecutionContext& executionContext,
- const ElemTemplateElement* contextElement,
+ const ElemTemplateElement* /* contextElement */,
const ElemTemplateElement& xslCallTemplateElement,
XalanNode* sourceTree,
XalanNode* sourceNode,
const QName& mode,
- const XalanNode* targetTemplate) :
+ const ElemTemplateElement* targetTemplate) :
m_executionContext(executionContext),
m_savedStackFrameIndex(executionContext.getCurrentStackFrameIndex())
{
- executionContext.pushContextMarker(
- contextElement,
- sourceNode);
+ executionContext.pushContextMarker();
executionContext.setCurrentStackFrameIndex(m_savedStackFrameIndex);
@@ -107,7 +105,7 @@
StylesheetExecutionContext::ParamsPushPop::~ParamsPushPop()
{
- m_executionContext.popCurrentContext();
+ m_executionContext.popContextMarker();
m_executionContext.setCurrentStackFrameIndex(m_savedStackFrameIndex);
}
1.23 +142 -42 xml-xalan/c/src/XSLT/StylesheetExecutionContext.hpp
Index: StylesheetExecutionContext.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContext.hpp,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- StylesheetExecutionContext.hpp 2000/07/14 16:57:42 1.22
+++ StylesheetExecutionContext.hpp 2000/07/21 19:52:56 1.23
@@ -94,6 +94,11 @@
+#include <XSLT/TopLevelArg.hpp>
+
+
+
+
class ElemTemplateElement;
class FormatterListener;
class FormatterToDOM;
@@ -144,15 +149,6 @@
reset() = 0;
/**
- * Retrieve a top level variable corresponding to name.
- *
- * @param name name of variable
- * @return pointer to XObject for variable
- */
- virtual XObject*
- getTopLevelVariable(const XalanDOMString& theName) const = 0;
-
- /**
* Determine whether conflicts should be reported.
*
* @return true if conflicts should not be warned
@@ -161,20 +157,24 @@
getQuietConflictWarnings() const = 0;
/**
- * Retrieve root document for stylesheet.
+ * Retrieve root document for stylesheet. Note that
+ * this does not have to be a XalanDocument -- it can
+ * be any node in a document.
*
* @return root document
*/
- virtual XalanDocument*
+ virtual XalanNode*
getRootDocument() const = 0;
/**
- * Set root document for stylesheet.
+ * Set root document for stylesheet. Note that
+ * this does not have to be a XalanDocument -- it can
+ * be any node in a document.
*
* @param theDocument root document
*/
virtual void
- setRootDocument(XalanDocument* theDocument) = 0;
+ setRootDocument(XalanNode* theDocument) = 0;
/**
* Create a new empty document.
@@ -592,6 +592,7 @@
virtual int
getIndent() const = 0;
+ // $$$ ToDo: Remove this one!!!!
/**
* Execute an XPath and return the resulting XObject. The lifetime of this
* XObject is not necessarily that of the Stylesheet.
@@ -605,21 +606,6 @@
executeXPath(
const XalanDOMString& str,
XalanNode* contextNode,
- const PrefixResolver& resolver) = 0;
-
- /**
- * Execute an XPath and return the resulting XObject. The lifetime of this
- * XObject is not necessarily that of the Stylesheet.
- *
- * @param str string expression for XPath evaluation
- * @param contextNode current node in the source tree
- * @param resolver resolver for namespace resolution
- * @return pointer to resulting XObject
- */
- virtual XObject*
- executeXPath(
- const XalanDOMString& str,
- XalanNode* contextNode,
const XalanElement& resolver) = 0;
/**
@@ -712,7 +698,115 @@
const PrefixResolver& namespaceContext,
const XalanDOMString& stringedValue) = 0;
+#if defined(XALAN_NO_NAMESPACES)
+ typedef vector<TopLevelArg> ParamVectorType;
+#else
+ typedef std::vector<TopLevelArg> ParamVectorType;
+#endif
+
+ /**
+ * Set a list of top level variables in the specified execution context
+ * stylesheet.
+ *
+ * @param topLevelParams list of top level parameters
+ */
+ virtual void
+ pushTopLevelVariables(const ParamVectorType& topLevelParams) = 0;
+
/**
+ * Execute the supplied XPath and and create a
+ * variable in the current context.
+ *
+ * @param element element marker for variable
+ * @param str string expression for XPath evaluation
+ * @param contextNode current node in the source tree
+ * @param resolver resolver for namespace resolution
+ * @return a pointer to the XObject result
+ */
+ virtual XObject*
+ createVariable(
+ const ElemTemplateElement* element,
+ const XPath& xpath,
+ XalanNode* contextNode,
+ const PrefixResolver& resolver) = 0;
+
+ /**
+ * Create an ResultTreeFragment as a variable and push it
+ * on to the stack with the current context.
+ *
+ * @param name name of variable
+ * @param element element marker for variable
+ * @param templateChild result tree fragment to use.
+ * @param sourceTree node for source tree
+ * @param sourceNode source node
+ * @return a pointer to the XObject result
+ */
+ virtual XObject*
+ createVariable(
+ const ElemTemplateElement* element,
+ const ElemTemplateElement& templateChild,
+ XalanNode* sourceTree,
+ XalanNode* sourceNode,
+ const QName& mode) = 0;
+
+ /**
+ * Execute an XPath using the provided expression,
+ * and push the result as a variable in the context of
+ * the supplied element.
+ *
+ * @param name name of variable
+ * @param element element marker for variable
+ * @param str string expression for XPath evaluation
+ * @param contextNode current node in the source tree
+ * @param resolver resolver for namespace resolution
+ * @return nothing
+ */
+ virtual void
+ pushVariable(
+ const QName& name,
+ const ElemTemplateElement* element,
+ const XalanDOMString& str,
+ XalanNode* contextNode,
+ const PrefixResolver& resolver) = 0;
+
+ /**
+ * Execute the supplied XPath and push the result as a
+ * variable in the current context.
+ *
+ * @param name name of variable
+ * @param element element marker for variable
+ * @param str string expression for XPath evaluation
+ * @param contextNode current node in the source tree
+ * @param resolver resolver for namespace resolution
+ * @return nothing
+ */
+ virtual void
+ pushVariable(
+ const QName& name,
+ const ElemTemplateElement* element,
+ const XPath& xpath,
+ XalanNode* contextNode,
+ const PrefixResolver& resolver) = 0;
+
+ /**
+ * Create an ResultTreeFragment as a variable and push it
+ * on to the stack with the current context.
+ *
+ * @param name name of variable
+ * @param element element marker for variable
+ * @param templateChild result tree fragment to use.
+ * @param sourceTree node for source tree
+ * @param sourceNode source node
+ */
+ virtual void
+ pushVariable(
+ const QName& name,
+ const ElemTemplateElement* element,
+ const ElemTemplateElement& templateChild,
+ XalanNode* sourceTree,
+ XalanNode* sourceNode) = 0;
+
+ /**
* Push a named variable onto the processor variable stack
*
* @param name name of variable
@@ -721,27 +815,22 @@
*/
virtual void
pushVariable(
- const QName& name,
- XObject* var,
- const XalanNode* element) = 0;
+ const QName& name,
+ XObject* var,
+ const ElemTemplateElement* element) = 0;
/**
* Push a context marker onto the stack to let us know when to stop
* searching for a var.
- *
- * @param caller caller node
- * @param sourceNode source node
*/
virtual void
- pushContextMarker(
- const XalanNode* caller,
- const XalanNode* sourceNode) = 0;
+ pushContextMarker() = 0;
/**
* Pop the current context from the current context stack.
*/
virtual void
- popCurrentContext() = 0;
+ popContextMarker() = 0;
/**
* Resolve the params that were pushed by the caller.
@@ -771,7 +860,7 @@
XalanNode* sourceTree,
XalanNode* sourceNode,
const QName& mode,
- const XalanNode* targetTemplate) = 0;
+ const ElemTemplateElement* targetTemplate) = 0;
/**
* Given a name, return a string representing the value, but don't look in
@@ -894,7 +983,7 @@
XalanNode* sourceTree,
XalanNode* sourceNode,
const QName& mode,
- const XalanNode* targetTemplate);
+ const ElemTemplateElement* targetTemplate);
~ParamsPushPop();
@@ -1098,6 +1187,17 @@
const QName& mode) = 0;
/**
+ * Function to destroy an XObject that was returned
+ * by executing. It is safe to call this function
+ * with any XObject.
+ *
+ * @param theXObject pointer to the XObject.
+ * @return true if the object was destroyed.
+ */
+ virtual bool
+ destroyXObject(XObject* theXObject) const = 0;
+
+ /**
* Given a result tree fragment, walk the tree and
* output it to the result stream.
*
@@ -1260,8 +1360,8 @@
virtual FormatterToDOM*
createFormatterToDOM(
XalanDocument* doc,
- XalanDocumentFragment* docFrag = 0,
- XalanElement* currentElement = 0) = 0;
+ XalanDocumentFragment* docFrag,
+ XalanElement* currentElement) = 0;
/**
* Construct a FormatterToDOM instance. it will add the DOM nodes
1.22 +296 -47 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.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- StylesheetExecutionContextDefault.cpp 2000/07/14 16:57:42 1.21
+++ StylesheetExecutionContextDefault.cpp 2000/07/21 19:52:57 1.22
@@ -74,7 +74,10 @@
#include <XPath/ElementPrefixResolverProxy.hpp>
+#include <XPath/QName.hpp>
#include <XPath/ResultTreeFragBase.hpp>
+#include <XPath/XObjectFactory.hpp>
+#include <XPath/XPath.hpp>
#include <XPath/XPathExecutionContext.hpp>
#include <XPath/QName.hpp>
@@ -95,7 +98,9 @@
+#include "Constants.hpp"
#include "ElemTemplateElement.hpp"
+#include "ElemWithParam.hpp"
#include "StylesheetRoot.hpp"
#include "XSLTEngineImpl.hpp"
#include "XSLTProcessorException.hpp"
@@ -127,14 +132,18 @@
theContextNodeList,
thePrefixResolver),
m_xsltProcessor(xsltProcessor),
+ m_rootDocument(0),
m_elementRecursionStack(),
m_prefixResolver(0),
m_stylesheetRoot(0),
m_formatterListeners(),
m_printWriters(),
m_textOutputStreams(),
- m_collationCompareFunctor(&s_defaultFunctor)
+ m_collationCompareFunctor(&s_defaultFunctor),
+ m_liveVariablesStack(),
+ m_variablesStack()
{
+ m_liveVariablesStack.reserve(eDefaultVariablesStackSize);
}
@@ -170,14 +179,10 @@
DeleteFunctor<TextOutputStream>());
m_textOutputStreams.clear();
-}
-
+ clearLiveVariablesStack();
-XObject*
-StylesheetExecutionContextDefault::getTopLevelVariable(const XalanDOMString& theName) const
-{
- return m_xsltProcessor.getTopLevelVariable(theName);
+ m_variablesStack.reset();
}
@@ -190,18 +195,18 @@
-XalanDocument*
+XalanNode*
StylesheetExecutionContextDefault::getRootDocument() const
{
- return m_xsltProcessor.getRootDoc();
+ return m_rootDocument;
}
void
-StylesheetExecutionContextDefault::setRootDocument(XalanDocument* theDocument)
+StylesheetExecutionContextDefault::setRootDocument(XalanNode* theDocument)
{
- m_xsltProcessor.setRootDoc(theDocument);
+ m_rootDocument = theDocument;
}
@@ -434,20 +439,6 @@
StylesheetExecutionContextDefault::executeXPath(
const XalanDOMString& str,
XalanNode* contextNode,
- const PrefixResolver& resolver)
-{
- return m_xsltProcessor.evalXPathStr(str,
- contextNode,
- resolver,
- *this);
-}
-
-
-
-XObject*
-StylesheetExecutionContextDefault::executeXPath(
- const XalanDOMString& str,
- XalanNode* contextNode,
const XalanElement& resolver)
{
return m_xsltProcessor.evalXPathStr(str,
@@ -491,38 +482,168 @@
void
+StylesheetExecutionContextDefault::pushTopLevelVariables(const ParamVectorType& topLevelParams)
+{
+ assert(m_stylesheetRoot != 0);
+
+ m_stylesheetRoot->pushTopLevelVariables(*this, topLevelParams);
+}
+
+
+
+XObject*
+StylesheetExecutionContextDefault::createVariable(
+ const ElemTemplateElement* /* element */,
+ const XPath& xpath,
+ XalanNode* contextNode,
+ const PrefixResolver& resolver)
+{
+ XObject* const theVariable =
+ xpath.execute(contextNode, resolver, *this);
+
+ assert(m_liveVariablesStack.empty() == false);
+
+ // We'll want to return this variable after the current element frame
+ // has finished executing, so save this off for later...
+ m_liveVariablesStack.back().push_back(theVariable);
+
+ return theVariable;
+}
+
+
+
+XObject*
+StylesheetExecutionContextDefault::createVariable(
+ const ElemTemplateElement* /* element */,
+ const ElemTemplateElement& templateChild,
+ XalanNode* sourceTree,
+ XalanNode* sourceNode,
+ const QName& mode)
+{
+ XObject* const theVariable =
+ this->createXResultTreeFrag(templateChild, sourceTree, sourceNode, mode);
+
+ // We'll want to return this variable after the current element frame
+ // has finished executing, so save this off for later...
+ m_liveVariablesStack.back().push_back(theVariable);
+
+ return theVariable;
+}
+
+
+
+void
StylesheetExecutionContextDefault::pushVariable(
- const QName& name,
- XObject* var,
- const XalanNode* element)
+ const QName& name,
+ const ElemTemplateElement* element,
+ const XalanDOMString& str,
+ XalanNode* contextNode,
+ const PrefixResolver& resolver)
{
- m_xsltProcessor.pushVariable(name, var, element);
+ XObject* var = 0;
+
+ if (length(str) > 0)
+ {
+ var = m_xsltProcessor.evalXPathStr(
+ str,
+ contextNode,
+ resolver,
+ *this);
+ assert(var != 0);
+ }
+
+ // Call to our own member function, to keep track of the XObject...
+ pushVariable(name, var, element);
}
void
-StylesheetExecutionContextDefault::pushContextMarker(
- const XalanNode* caller,
- const XalanNode* sourceNode)
+StylesheetExecutionContextDefault::pushVariable(
+ const QName& name,
+ XObject* var,
+ const ElemTemplateElement* element)
{
- m_xsltProcessor.pushContextMarker(caller, sourceNode);
+ m_variablesStack.pushVariable(name, var, element);
+
+ if (m_liveVariablesStack.empty() == false)
+ {
+ // We'll want to return this variable after the current element frame
+ // has finished executing, so save this off for later...
+ m_liveVariablesStack.back().push_back(var);
+ }
}
void
-StylesheetExecutionContextDefault::popCurrentContext()
+StylesheetExecutionContextDefault::pushVariable(
+ const QName& name,
+ const ElemTemplateElement* element,
+ const XPath& xpath,
+ XalanNode* contextNode,
+ const PrefixResolver& resolver)
+{
+ XObjectGuard theXObject(
+ m_xpathExecutionContextDefault.getXObjectFactory(),
+ xpath.execute(contextNode, resolver, *this));
+
+ pushVariable(name, theXObject.get(), element);
+
+ theXObject.release();
+}
+
+
+
+void
+StylesheetExecutionContextDefault::pushVariable(
+ const QName& name,
+ const ElemTemplateElement* element,
+ const ElemTemplateElement& templateChild,
+ XalanNode* sourceTree,
+ XalanNode* sourceNode)
{
- m_xsltProcessor.popCurrentContext();
+ XObjectGuard theXObject(
+ m_xpathExecutionContextDefault.getXObjectFactory(),
+ createXResultTreeFrag(templateChild, sourceTree, sourceNode));
+
+ pushVariable(name, theXObject.get(), element);
+
+ theXObject.release();
}
void
+StylesheetExecutionContextDefault::pushContextMarker()
+{
+ m_variablesStack.pushContextMarker();
+
+ m_liveVariablesStack.push_back(LiveVariablesStackType::value_type());
+
+ m_liveVariablesStack.back().reserve(eDefaultVariablesCollectionSize);
+}
+
+
+
+void
+StylesheetExecutionContextDefault::popContextMarker()
+{
+ m_variablesStack.popContextMarker();
+
+ popLiveVariablesStack();
+}
+
+
+
+void
StylesheetExecutionContextDefault::resolveTopLevelParams()
{
+ pushContextMarker();
+
m_xsltProcessor.resolveTopLevelParams(*this);
+
+ m_variablesStack.markGlobalStackFrame();
}
@@ -535,19 +656,93 @@
+class PopPushContextMarker
+{
+public:
+
+ PopPushContextMarker(StylesheetExecutionContext& theExecutionContext) :
+ m_executionContext(theExecutionContext)
+ {
+ m_executionContext.popContextMarker();
+ }
+
+ ~PopPushContextMarker()
+ {
+ m_executionContext.pushContextMarker();
+ }
+
+private:
+
+ StylesheetExecutionContext& m_executionContext;
+};
+
+
+
void
StylesheetExecutionContextDefault::pushParams(
const ElemTemplateElement& xslCallTemplateElement,
XalanNode* sourceTree,
XalanNode* sourceNode,
const QName& mode,
- const XalanNode* targetTemplate)
+ const ElemTemplateElement* targetTemplate)
{
- m_xsltProcessor.pushParams(*this,
- xslCallTemplateElement,
- sourceTree,
- sourceNode,
- mode,
+ typedef VariablesStack::ParamsVectorType ParamsVectorType;
+
+ ParamsVectorType theParams;
+
+ const ElemTemplateElement* child =
+ xslCallTemplateElement.getFirstChildElem();
+
+ if (0 != child)
+ {
+ // This object will take care of popping, then
+ // pushing the context marker at the top of the
+ // stack, even if an exception is thrown...
+ PopPushContextMarker thePopPush(*this);
+
+ while(0 != child)
+ {
+ if(Constants::ELEMNAME_WITHPARAM == child->getXSLToken())
+ {
+ const ElemWithParam* const xslParamElement =
+#if defined(XALAN_OLD_STYLE_CASTS)
+ (ElemWithParam*)child;
+#else
+ static_cast<const ElemWithParam*>(child);
+#endif
+
+ const XPath* const pxpath = xslParamElement->getSelectPattern();
+
+ XObject* theXObject = 0;
+
+ if(0 != pxpath)
+ {
+ theXObject =
+ createVariable(
+ &xslCallTemplateElement,
+ *pxpath,
+ sourceNode,
+ *xslParamElement);
+ }
+ else
+ {
+ theXObject =
+ createVariable(
+ &xslCallTemplateElement,
+ *xslParamElement,
+ sourceTree,
+ sourceNode,
+ mode);
+ }
+
+ theParams.push_back(ParamsVectorType::value_type(xslParamElement->getQName(), theXObject));
+ }
+
+ child = child->getNextSiblingElem();
+ }
+ }
+
+ m_variablesStack.pushParams(theParams,
targetTemplate);
}
@@ -556,7 +751,7 @@
XObject*
StylesheetExecutionContextDefault::getParamVariable(const QName& theName) const
{
- return m_xsltProcessor.getParamVariable(theName);
+ return m_variablesStack.getParamVariable(theName);
}
@@ -564,7 +759,9 @@
void
StylesheetExecutionContextDefault::pushElementFrame(const ElemTemplateElement* elem)
{
- m_xsltProcessor.getVariableStacks().pushElementFrame(elem);
+ m_variablesStack.pushElementFrame(elem);
+
+ m_liveVariablesStack.push_back(LiveVariablesStackType::value_type());
}
@@ -572,7 +769,9 @@
void
StylesheetExecutionContextDefault::popElementFrame(const ElemTemplateElement* elem)
{
- m_xsltProcessor.getVariableStacks().popElementFrame(elem);
+ m_variablesStack.popElementFrame(elem);
+
+ popLiveVariablesStack();
}
@@ -580,7 +779,7 @@
int
StylesheetExecutionContextDefault::getCurrentStackFrameIndex() const
{
- return m_xsltProcessor.getVariableStacks().getCurrentStackFrameIndex();
+ return m_variablesStack.getCurrentStackFrameIndex();
}
@@ -588,7 +787,7 @@
void
StylesheetExecutionContextDefault::setCurrentStackFrameIndex(int currentStackFrameIndex)
{
- m_xsltProcessor.getVariableStacks().setCurrentStackFrameIndex(currentStackFrameIndex);
+ m_variablesStack.setCurrentStackFrameIndex(currentStackFrameIndex);
}
@@ -605,6 +804,10 @@
StylesheetExecutionContextDefault::endDocument()
{
m_xsltProcessor.endDocument();
+
+ // This matches the pushContextMarker in
+ // resolveTopLevelParams().
+ popContextMarker();
}
@@ -725,6 +928,15 @@
+bool
+StylesheetExecutionContextDefault::destroyXObject(XObject* theXObject) const
+{
+
+ return m_xsltProcessor.destroyXObject(theXObject);
+}
+
+
+
void
StylesheetExecutionContextDefault::outputResultTreeFragment(const XObject& theTree)
{
@@ -1290,7 +1502,10 @@
XObject*
StylesheetExecutionContextDefault::getVariable(const QName& name) const
{
- return m_xpathExecutionContextDefault.getVariable(name);
+ XObject* const theVariable =
+ m_variablesStack.getVariable(name);
+
+ return m_xpathExecutionContextDefault.getXObjectFactory().clone(*theVariable);
}
@@ -1525,3 +1740,37 @@
{
m_xsltProcessor.message(msg, sourceNode, styleNode);
}
+
+
+
+void
+StylesheetExecutionContextDefault::popLiveVariablesStack()
+{
+#if !defined(XALAN_NO_NAMESPACES)
+ using std::for_each;
+#endif
+
+ assert(m_liveVariablesStack.empty() == false);
+
+ // Clean up any XObjects we created...
+ for_each(
+ m_liveVariablesStack.back().begin(),
+ m_liveVariablesStack.back().end(),
+ XObjectFactory::DeleteXObjectFunctor(getXObjectFactory()));
+
+ // Pop the stack...
+ m_liveVariablesStack.pop_back();
+}
+
+
+
+void
+StylesheetExecutionContextDefault::clearLiveVariablesStack()
+{
+ // Clean up the entire stack.
+ while(m_liveVariablesStack.empty() == false)
+ {
+ popLiveVariablesStack();
+ }
+}
+
1.20 +84 -23 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.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- StylesheetExecutionContextDefault.hpp 2000/07/14 16:57:42 1.19
+++ StylesheetExecutionContextDefault.hpp 2000/07/21 19:52:57 1.20
@@ -66,6 +66,7 @@
+#include <deque>
#include <memory>
#include <set>
#include <vector>
@@ -76,6 +77,10 @@
+#include <XSLT/VariablesStack.hpp>
+
+
+
class TextOutputStream;
class XPathProcessor;
class XPathSupport;
@@ -108,17 +113,14 @@
virtual void
reset();
- virtual XObject*
- getTopLevelVariable(const XalanDOMString& theName) const;
-
virtual bool
getQuietConflictWarnings() const;
- virtual XalanDocument*
+ virtual XalanNode*
getRootDocument() const;
virtual void
- setRootDocument(XalanDocument* theDocument);
+ setRootDocument(XalanNode* theDocument);
virtual XalanDocument*
createDocument() const;
@@ -203,16 +205,11 @@
virtual int
getIndent() const;
+ // $$$ ToDo: Get rid of this!!!!
virtual XObject*
executeXPath(
const XalanDOMString& str,
XalanNode* contextNode,
- const PrefixResolver& resolver);
-
- virtual XObject*
- executeXPath(
- const XalanDOMString& str,
- XalanNode* contextNode,
const XalanElement& resolver);
virtual XPath*
@@ -230,18 +227,58 @@
const XalanDOMString& stringedValue);
virtual void
+ pushTopLevelVariables(const ParamVectorType& topLevelParams);
+
+ virtual XObject*
+ createVariable(
+ const ElemTemplateElement* element,
+ const XPath& xpath,
+ XalanNode* contextNode,
+ const PrefixResolver& resolver);
+
+ virtual XObject*
+ createVariable(
+ const ElemTemplateElement* element,
+ const ElemTemplateElement& templateChild,
+ XalanNode* sourceTree,
+ XalanNode* sourceNode,
+ const QName& mode);
+
+ virtual void
pushVariable(
- const QName& name,
- XObject* var,
- const XalanNode* element);
+ const QName& name,
+ const ElemTemplateElement* element,
+ const XalanDOMString& str,
+ XalanNode* contextNode,
+ const PrefixResolver& resolver);
virtual void
- pushContextMarker(
- const XalanNode* caller,
- const XalanNode* sourceNode);
+ pushVariable(
+ const QName& name,
+ XObject* var,
+ const ElemTemplateElement* element);
+
+ virtual void
+ pushVariable(
+ const QName& name,
+ const ElemTemplateElement* element,
+ const XPath& xpath,
+ XalanNode* contextNode,
+ const PrefixResolver& resolver);
+
+ virtual void
+ pushVariable(
+ const QName& name,
+ const ElemTemplateElement* element,
+ const ElemTemplateElement& templateChild,
+ XalanNode* sourceTree,
+ XalanNode* sourceNode);
+
+ virtual void
+ pushContextMarker();
virtual void
- popCurrentContext();
+ popContextMarker();
virtual void
resolveTopLevelParams();
@@ -255,7 +292,7 @@
XalanNode* sourceTree,
XalanNode* sourceNode,
const QName& mode,
- const XalanNode* targetTemplate);
+ const ElemTemplateElement* targetTemplate);
virtual XObject*
getParamVariable(const QName& theName) const;
@@ -327,6 +364,9 @@
XalanNode* sourceNode,
const QName& mode);
+ virtual bool
+ destroyXObject(XObject* theXObject) const;
+
virtual void
outputResultTreeFragment(const XObject& theTree);
@@ -374,8 +414,8 @@
virtual FormatterToDOM*
createFormatterToDOM(
XalanDocument* doc,
- XalanDocumentFragment* docFrag = 0,
- XalanElement* currentElement = 0);
+ XalanDocumentFragment* docFrag,
+ XalanElement* currentElement);
virtual FormatterToDOM*
createFormatterToDOM(
@@ -673,23 +713,37 @@
private:
+ void
+ popLiveVariablesStack();
+
+ void
+ clearLiveVariablesStack();
+
XPathExecutionContextDefault m_xpathExecutionContextDefault;
// $$ ToDo: Try to remove this dependency, and rely only on XSLTProcessor...
XSLTEngineImpl& m_xsltProcessor;
+ XalanNode* m_rootDocument;
+
#if defined(XALAN_NO_NAMESPACES)
- typedef vector<const ElemTemplateElement*> ElementRecursionStackType;
+ typedef deque<const ElemTemplateElement*> ElementRecursionStackType;
typedef set<FormatterListener*> FormatterListenerSetType;
typedef set<PrintWriter*> PrintWriterSetType;
typedef set<TextOutputStream*> TextOutputStreamSetType;
+ typedef vector<const XObject*> VariablesCollectionType;
+ typedef vector<VariablesCollectionType> LiveVariablesStackType;
#else
- typedef std::vector<const ElemTemplateElement*> ElementRecursionStackType;
+ typedef std::deque<const ElemTemplateElement*> ElementRecursionStackType;
typedef std::set<FormatterListener*> FormatterListenerSetType;
typedef std::set<PrintWriter*> PrintWriterSetType;
typedef std::set<TextOutputStream*> TextOutputStreamSetType;
+ typedef std::vector<const XObject*> VariablesCollectionType;
+ typedef std::vector<VariablesCollectionType> LiveVariablesStackType;
#endif
+ enum { eDefaultVariablesCollectionSize = 10, eDefaultVariablesStackSize = 200 };
+
ElementRecursionStackType m_elementRecursionStack;
const PrefixResolver* m_prefixResolver;
@@ -703,6 +757,13 @@
TextOutputStreamSetType m_textOutputStreams;
const CollationCompareFunctor* m_collationCompareFunctor;
+
+ LiveVariablesStackType m_liveVariablesStack;
+
+ /**
+ * Holds all information about variables during execution.
+ */
+ VariablesStack m_variablesStack;
static XalanNumberFormatFactory s_defaultXalanNumberFormatFactory;
1.19 +31 -28 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.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- StylesheetRoot.cpp 2000/07/11 19:54:53 1.18
+++ StylesheetRoot.cpp 2000/07/21 19:52:57 1.19
@@ -315,46 +315,52 @@
/*
* Output target has a node
*/
- else if(0 != outputTarget.getNode())
+ else if(outputTarget.hasDOMTarget() == true)
{
- switch(outputTarget.getNode()->getNodeType())
+ if (outputTarget.getDocument() != 0)
{
- case XalanNode::DOCUMENT_NODE:
- flistener =
- executionContext.createFormatterToDOM(static_cast<XalanDocument*>(outputTarget.getNode()));
- break;
-
- case XalanNode::DOCUMENT_FRAGMENT_NODE:
- flistener =
- executionContext.createFormatterToDOM(executionContext.createDocument(),
- static_cast<XalanDocumentFragment*>(outputTarget.getNode()));
- break;
-
- case XalanNode::ELEMENT_NODE:
- flistener =
- executionContext.createFormatterToDOM(executionContext.createDocument(),
- static_cast<XalanElement*>(outputTarget.getNode()));
- break;
+ flistener = executionContext.createFormatterToDOM(outputTarget.getDocument(), 0);
+ }
+ else if (outputTarget.getDocumentFragment() != 0)
+ {
+ XalanDocumentFragment* const theFragment =
+ outputTarget.getDocumentFragment();
+
+ flistener = executionContext.createFormatterToDOM(
+ theFragment->getOwnerDocument(),
+ theFragment,
+ 0);
+ }
+ else if (outputTarget.getElement() != 0)
+ {
+ XalanElement* const theElement =
+ outputTarget.getElement();
- default:
- executionContext.error("Can only output to an Element, DocumentFragment, Document, or PrintWriter.");
+ flistener = executionContext.createFormatterToDOM(
+ theElement->getOwnerDocument(),
+ theElement);
}
+ else
+ {
+ assert(0);
+ }
}
/*
* Create an empty document and set the output target node to this
*/
else
{
- outputTarget.setNode(executionContext.createDocument());
+ XalanDocument* const theDocument = executionContext.createDocument();
+
+ outputTarget.setDocument(theDocument);
- flistener =
- executionContext.createFormatterToDOM(static_cast<XalanDocument*>(outputTarget.getNode()));
+ flistener = executionContext.createFormatterToDOM(theDocument, 0);
}
executionContext.setFormatterListener(flistener);
executionContext.resetCurrentState(sourceTree, sourceTree);
- executionContext.setRootDocument(static_cast<XalanDocument*>(sourceTree));
+ executionContext.setRootDocument(sourceTree);
if(executionContext.doDiagnosticsOutput())
{
@@ -362,8 +368,6 @@
executionContext.diag(XALAN_STATIC_UCODE_STRING("Transforming..."));
executionContext.pushTime(&sourceTree);
}
-
- executionContext.pushContextMarker(0, 0);
try
{
@@ -379,11 +383,10 @@
// Output the action of the found root rule. All processing
// occurs from here. buildResultFromTemplate is highly recursive.
- // java: rootRule->execute(*m_processor, sourceTree, sourceTree, 0);
rootRule->execute(executionContext, sourceTree, sourceTree, QName());
executionContext.endDocument();
-
+
// Reset the top-level params for the next round.
executionContext.clearTopLevelParams();
1.2 +2 -2 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.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- VariablesStack.cpp 2000/07/21 19:46:11 1.1
+++ VariablesStack.cpp 2000/07/21 19:52:57 1.2
@@ -132,9 +132,9 @@
void
VariablesStack::popContextMarker()
{
- const unsigned int nElems = m_stack.size();
+ const int nElems = m_stack.size();
- for(unsigned int i = (nElems - 1); i > 0 && m_stack.empty() == false; --i)
+ for(int i = (nElems - 1); i >= 0 && m_stack.empty() == false; --i)
{
const StackEntry& theEntry = m_stack[i];
assert(theEntry == back());
1.50 +20 -752 xml-xalan/c/src/XSLT/XSLTEngineImpl.cpp
Index: XSLTEngineImpl.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTEngineImpl.cpp,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -r1.49 -r1.50
--- XSLTEngineImpl.cpp 2000/07/19 20:52:31 1.49
+++ XSLTEngineImpl.cpp 2000/07/21 19:52:57 1.50
@@ -121,12 +121,8 @@
-#include "Arg.hpp"
#include "Constants.hpp"
-#include "ContextMarker.hpp"
#include "ElemWithParam.hpp"
-#include "ElementFrameMarker.hpp"
-#include "ElementMarker.hpp"
#include "FunctionCurrent.hpp"
#include "FunctionDocument.hpp"
#include "FunctionElementAvailable.hpp"
@@ -190,7 +186,6 @@
XPathFactory& xpathFactory) :
XSLTProcessor(),
DocumentHandler(),
- m_rootDoc(),
m_outputCarriageReturns(false),
m_outputLinefeeds(false),
m_resultTreeFactory(0),
@@ -208,8 +203,8 @@
m_xpathProcessor(new XPathProcessorImpl),
m_cdataStack(),
m_stylesheetLocatorStack(),
- m_variableStacks(*this),
- m_problemListener(new ProblemListenerDefault()),
+ m_defaultProblemListener(),
+ m_problemListener(&m_defaultProblemListener),
m_stylesheetRoot(0),
m_XSLDirectiveLookup(),
m_traceSelects(false),
@@ -224,12 +219,7 @@
m_xpathSupport(xpathSupport),
m_xpathEnvSupport(xpathEnvSupport),
m_flistener(0),
- m_contextNodeList(&xpathSupport),
- m_topLevelVariables(),
- m_executionContext(0),
- m_needToCheckForInfiniteLoops(false),
- m_stackGuard(*this),
- m_attrSetStack()
+ m_executionContext(0)
{
}
@@ -247,6 +237,16 @@
+void
+XSLTEngineImpl::Terminate()
+{
+ s_XSLT4JElementKeys.clear();
+ s_elementKeys.clear();
+ s_attributeKeys.clear();
+}
+
+
+
/**
* Reset the state. This needs to be called after a process() call
* is invoked, if the processor is to be used again.
@@ -254,8 +254,6 @@
void
XSLTEngineImpl::reset()
{
- m_rootDoc = 0;
-
m_topLevelParams.clear();
m_durationsTable.clear();
m_stylesheetLocatorStack.clear();
@@ -263,14 +261,11 @@
m_pendingAttributes.clear();
m_cdataStack.clear();
m_resultTreeFactory = 0;
- m_contextNodeList.clear();
m_currentNode = 0;
- m_needToCheckForInfiniteLoops = false;
- m_variableStacks.reset();
+
m_hasPendingStartDocument = false;
m_mustFlushStartDocument = false;
- m_stackGuard.clear();
m_xpathSupport.reset();
m_xpathEnvSupport.reset();
m_xpathFactory.reset();
@@ -281,8 +276,6 @@
XSLTEngineImpl::~XSLTEngineImpl()
{
- delete m_problemListener;
-
reset();
}
@@ -294,22 +287,6 @@
-XalanDocument*
-XSLTEngineImpl::getRootDoc() const
-{
- return m_rootDoc;
-}
-
-
-
-void
-XSLTEngineImpl::setRootDoc(XalanDocument* doc)
-{
- m_rootDoc = doc;
-}
-
-
-
AttributeListImpl&
XSLTEngineImpl::getPendingAttributes()
{
@@ -1477,8 +1454,6 @@
fireGenerateEvent(ge);
}
-
- m_variableStacks.popCurrentContext();
}
@@ -3143,37 +3118,6 @@
/**
- * Given a name, locate a variable in the current context, and return
- * the Object.
- */
-XObject*
-XSLTEngineImpl::getVariable(const QName& qname) const
-{
- return m_variableStacks.getXObjectVariable(qname);
-}
-
-
-
-XObject*
-XSLTEngineImpl::getParamVariable(const QName& theName) const
-{
- return m_variableStacks.getXObjectParamVariable(theName);
-}
-
-
-
-void
-XSLTEngineImpl::pushVariable(
- const QName& name,
- XObject* val,
- const XalanNode* e)
-{
- m_variableStacks.pushVariable(name, val, e);
-}
-
-
-
-/**
* Create a document fragment. This function may return null.
*/
ResultTreeFragBase* XSLTEngineImpl::createDocFrag() const
@@ -3183,25 +3127,6 @@
-XObject*
-XSLTEngineImpl::getXObjectVariable(
- StylesheetExecutionContext& executionContext,
- const XalanDOMString& name) const
-{
- assert(m_stylesheetRoot != 0);
-
- XObject* theResult = m_variableStacks.getXObjectVariable(name);
-
- if(0 == theResult)
- {
- theResult = m_stylesheetRoot->getTopLevelVariable(name, executionContext);
- }
-
- return theResult;
-}
-
-
-
XLocator*
XSLTEngineImpl::getXLocatorFromNode(const XalanNode* node) const
{
@@ -3220,26 +3145,6 @@
-XObject*
-XSLTEngineImpl::getTopLevelVariable(const XalanDOMString& theName) const
-{
- TopLevelVariablesMapType::const_iterator i =
- m_topLevelVariables.find(theName);
-
- if (i == m_topLevelVariables.end())
- {
- return 0;
- }
- else
- {
- assert((*i).second != 0);
-
- return (*i).second;
- }
-}
-
-
-
ResultTreeFragBase*
XSLTEngineImpl::createResultTreeFrag() const
{
@@ -3255,7 +3160,7 @@
{
const QName qname(theName, 0, m_xpathEnvSupport, m_xpathSupport);
- m_topLevelParams.push_back(Arg(qname, expression, true));
+ m_topLevelParams.push_back(ParamVectorType::value_type(qname, expression));
}
@@ -3267,7 +3172,7 @@
{
const QName qname(theName, 0, m_xpathEnvSupport, m_xpathSupport);
- m_topLevelParams.push_back(Arg(qname, theValue, true));
+ m_topLevelParams.push_back(ParamVectorType::value_type(qname, theValue));
}
@@ -3275,9 +3180,7 @@
void
XSLTEngineImpl::resolveTopLevelParams(StylesheetExecutionContext& executionContext)
{
- m_stylesheetRoot->pushTopLevelVariables(executionContext, m_topLevelParams);
-
- getVariableStacks().markGlobalStackFrame();
+ executionContext.pushTopLevelVariables(m_topLevelParams);
}
@@ -3477,647 +3380,12 @@
-//@@ JMD: NOTE: java implementation of these classes does not pass reference
-//to processor
-
-//////////////////////////////////////////////////////////////////////////////
-// CLASS XSLTEngineImpl::StackGuard
-//////////////////////////////////////////////////////////////////////////////
-
-XSLTEngineImpl::StackGuard::StackGuard(
- XSLTEngineImpl& processor,
- const XalanElement* xslTemplate,
- const XalanNode* sourceXML) :
- m_processor(&processor),
- m_xslRule(xslTemplate),
- m_sourceXML(sourceXML),
- m_stack()
-{
-}
-
-
-
-XSLTEngineImpl::StackGuard::~StackGuard()
-{
-}
-
-
-
-void
-XSLTEngineImpl::StackGuard::print(PrintWriter& pw) const
-{
- // for the moment, these diagnostics are really bad...
- const XalanNode::NodeType theType = m_sourceXML->getNodeType();
-
- if(theType == XalanNode::TEXT_NODE)
- {
-#if defined(XALAN_OLD_STYLE_CASTS)
- const XalanText* const tx =
- (const XalanText*)m_sourceXML;
-#else
- const XalanText* const tx =
- static_cast<const XalanText*>(m_sourceXML);
-#endif
- pw.println(tx->getData());
- }
- else if(theType == XalanNode::ELEMENT_NODE)
- {
- pw.println(m_sourceXML->getNodeName());
- }
-}
-
-
-
-void
-XSLTEngineImpl::StackGuard::checkForInfiniteLoop(const StackGuard& guard) const
-{
- const int nRules = m_stack.size();
-
- int loopCount = 0;
-
- for(int i = (nRules - 1); i >= 0; --i)
- {
- if(m_stack[i] == guard)
- {
- loopCount++;
- }
-
- if(loopCount >= 4)
- {
- DOMStringPrintWriter pw;
-
- pw.println(XalanDOMString("Infinite loop diagnosed! Stack trace:"));
-
- int k = 0;
-
- for(; k < nRules; k++)
- {
- pw.println(XalanDOMString("Source Elem #") +
- LongToDOMString(k) +
- XalanDOMString(" "));
-
- m_stack[i].print(pw);
- }
-
- pw.println(XalanDOMString("Source Elem #") +
- LongToDOMString(k) +
- XalanDOMString(" "));
-
- guard.print(pw);
-
- pw.println(XalanDOMString("End of infinite loop diagnosis."));
-
- m_processor->diag(pw.getString());
-
- throw XSLTEngineImpl::XSLInfiniteLoopException();
- }
- }
-}
-
-
-
-void
-XSLTEngineImpl::StackGuard::push(
- const XalanElement* xslTemplate,
- const XalanNode* sourceXML)
-{
- const StackGuard guard(*m_processor, xslTemplate, sourceXML);
-
- checkForInfiniteLoop(guard);
-
- m_stack.push_back(guard);
-}
-
-
-
-void
-XSLTEngineImpl::StackGuard::pop()
-{
- m_stack.pop_back();
-}
-
-
-
-
-XSLTEngineImpl::XSLInfiniteLoopException::XSLInfiniteLoopException() :
- XSLTProcessorException("XSLT infinite loop occurred!")
-{
-}
-
-
-
-XSLTEngineImpl::XSLInfiniteLoopException::~XSLInfiniteLoopException()
-{
-}
-
-
-
-//////////////////////////////////////////////////////////////////////////////
-// CLASS XSLTEngineImpl::VariableStack
-//////////////////////////////////////////////////////////////////////////////
-
-
-XSLTEngineImpl::VariableStack::VariableStack(XSLTEngineImpl& theProcessor) :
- m_caller(),
- m_stack(),
- m_stackEntries(),
- m_processor(theProcessor),
- m_globalStackFrameIndex(-1),
- m_currentStackFrameIndex(0)
-{
- m_stack.reserve(eDefaultVectorSize);
-
- pushContextMarker(0, 0);
-}
-
-
-
-XSLTEngineImpl::VariableStack::~VariableStack()
-{
- reset();
-}
-
-
-
-void
-XSLTEngineImpl::VariableStack::reset()
-{
-#if !defined(XALAN_NO_NAMESPACES)
- using std::for_each;
-#endif
-
- m_stack.clear();
-
- // Delete all entries that we created...
- for_each(m_stackEntries.begin(),
- m_stackEntries.end(),
- DeleteFunctor<StackEntry>());
-
- m_stackEntries.clear();
-
- // If the stack has grown past the default size,
- // shrink it down...
- if (m_stack.capacity() > eDefaultVectorSize)
- {
- VariableStackStackType temp;
-
- temp.reserve(eDefaultVectorSize);
-
- m_stack.swap(temp);
- }
-
- pushContextMarker(0, 0);
-}
-
-
-
-void
-XSLTEngineImpl::VariableStack::pushElementMarker(const XalanNode* elem)
-{
- StackEntry* const theEntry = new ElementMarker(elem);
-
- m_stackEntries.insert(theEntry);
-
- push(theEntry);
-}
-
-
-
-void
-XSLTEngineImpl::VariableStack::popElementMarker(const XalanNode* elem)
-{
- if(elementMarkerAlreadyPushed(elem) == true)
- {
- const int nElems = m_stack.size();
-
- bool fFound = false;
-
- // Sub 1 extra for the context marker.
- for(int i = (nElems - 1); i >= 0 && fFound == false; i--)
- {
- const StackEntry* const theEntry = m_stack[i];
- assert(theEntry != 0);
-
- if(theEntry->getType() == StackEntry::eElementMarker)
- {
- pop();
- fFound = true;
- }
- else
- {
- pop();
- }
-
- }
- }
-}
-
-
-
bool
-XSLTEngineImpl::VariableStack::elementMarkerAlreadyPushed(const XalanNode* elem) const
+XSLTEngineImpl::destroyXObject(XObject* theXObject) const
{
- const int nElems = m_stack.size();
- // Sub 1 extra for the context marker.
- for(int i = (nElems - 1); i >= 0; i--)
- {
- const StackEntry* const theEntry = m_stack[i];
- assert(theEntry != 0);
+ assert(theXObject != 0);
- if(theEntry->getType() == StackEntry::eElementMarker)
- {
- const ElementMarker* const theElementMarkerEntry =
- static_cast<const ElementMarker*>(theEntry);
-
- if(theElementMarkerEntry->getElement() == elem)
- {
- return true;
- }
- }
- }
-
- return false;
-}
-
-
-
-void
-XSLTEngineImpl::VariableStack::pushContextMarker(
- const XalanNode* caller,
- const XalanNode* sourceNode)
-{
- StackEntry* const theEntry = new ContextMarker(caller, sourceNode);
-
- m_stackEntries.insert(theEntry);
-
- push(theEntry);
-}
-
-
-
-void
-XSLTEngineImpl::VariableStack::popCurrentContext()
-{
- const int nElems = m_stack.size();
- bool fFound = false;
-
- // Sub 1 extra for the context marker.
- for(int i = (nElems - 1); i >= 0 && fFound == false; i--)
- {
- const StackEntry* const theEntry = m_stack[i];
- assert(theEntry != 0 && theEntry == back());
-
- const StackEntry::eStackEntryType type = theEntry->getType();
- assert(type < StackEntry::eNextValue && type >= 0);
-
- fFound = type == StackEntry::eContextMarker ? true : false;
-
- pop();
- }
-}
-
-
-
-class PopPushStackEntry
-{
-public:
-
- PopPushStackEntry(
- XSLTEngineImpl::VariableStack& theVariableStack) :
- m_variableStack(theVariableStack),
- m_stackEntry(theVariableStack.back())
- {
- theVariableStack.pop();
- }
-
- ~PopPushStackEntry()
- {
- m_variableStack.push(m_stackEntry);
- }
-
-private:
-
- XSLTEngineImpl::VariableStack& m_variableStack;
-
- StackEntry* const m_stackEntry;
-};
-
-
-
-class CommitPushElementMarker
-{
-public:
-
- CommitPushElementMarker(
- XSLTEngineImpl::VariableStack& theVariableStack,
- const XalanNode* targetTemplate) :
- m_variableStack(&theVariableStack),
- m_targetTemplate(targetTemplate)
- {
- theVariableStack.pushElementMarker(targetTemplate);
- }
-
- ~CommitPushElementMarker()
- {
- if (m_variableStack != 0)
- {
- m_variableStack->popElementMarker(m_targetTemplate);
- }
- }
-
- void
- commit()
- {
- m_variableStack = 0;
- }
-
-private:
-
- XSLTEngineImpl::VariableStack* m_variableStack;
-
- const XalanNode* const m_targetTemplate;
-};
-
-
-
-void
-XSLTEngineImpl::VariableStack::pushParams(
- StylesheetExecutionContext& executionContext,
- const ElemTemplateElement& xslCallTemplateElement,
- XalanNode* sourceTree,
- XalanNode* sourceNode,
- const QName& mode,
- const XalanNode* targetTemplate)
-{
- StackEntry* const theStackEntry = m_stack.back();
-
- if (theStackEntry->getType() != StackEntry::eContextMarker)
- {
- throw InvalidStackContextException();
- }
-
- VariableStackStackType tempStack;
-
- const ElemTemplateElement* child =
- xslCallTemplateElement.getFirstChildElem();
-
- if (0 != child)
- {
- // This object will take care of popping, then
- // pushing the context marker at the top of the
- // stack, even if an exception is thrown...
- PopPushStackEntry thePopPush(*this);
-
- while(0 != child)
- {
- if(Constants::ELEMNAME_WITHPARAM == child->getXSLToken())
- {
- const ElemWithParam* const xslParamElement =
-#if defined(XALAN_OLD_STYLE_CASTS)
- (ElemWithParam*)child;
-#else
- static_cast<const ElemWithParam*>(child);
-#endif
-
- Arg* theArg = 0;
-
- const XPath* const pxpath = xslParamElement->getSelectPattern();
-
- if(0 != pxpath)
- {
- XObject* const theXObject =
- pxpath->execute(sourceNode,
- *xslParamElement,
- executionContext);
-
- theArg = new Arg(xslParamElement->getQName(), theXObject, true);
- }
- else
- {
- ResultTreeFragBase* const theDocFragment =
- m_processor.createResultTreeFrag(executionContext,
- *xslParamElement,
- sourceTree,
- sourceNode,
- mode);
- assert(theDocFragment != 0);
-
-#if !defined(XALAN_NO_NAMESPACES)
- using std::auto_ptr;
-#endif
-
- // Make sure this sucker gets cleaned up...
- auto_ptr<ResultTreeFragBase> theGuard(theDocFragment);
-
- XObject* const var = m_processor.createXResultTreeFrag(*theDocFragment);
-
- theArg = new Arg(xslParamElement->getQName(), var, true);
- }
- assert(theArg != 0);
-
- m_stackEntries.insert(theArg);
-
- tempStack.push_back(theArg);
- }
-
- child = child->getNextSiblingElem();
- }
- }
-
- // This object will push an element marker, and pop it
- // if we don't call it's commit() member function. So
- // if an exception is thrown will transferring the
- // parameters, the element marker will be popped.
- // This keeps the stack in a consistent state.
- CommitPushElementMarker thePusher(*this,
- targetTemplate);
-
- const VariableStackStackType::size_type nParams = tempStack.size();
-
- for(VariableStackStackType::size_type i = 0; i < nParams; ++i)
- {
- push(tempStack[i]);
- }
-
- thePusher.commit();
-}
-
-
-
-void
-XSLTEngineImpl::VariableStack::pushVariable(
- const QName& name,
- XObject* val,
- const XalanNode* e)
-{
- if(elementMarkerAlreadyPushed(e) == false)
- {
- pushElementMarker(e);
- }
-
- StackEntry* const theEntry = new Arg(name, val, false);
-
- m_stackEntries.insert(theEntry);
-
- push(theEntry);
-}
-
-
-
-
-XObject*
-XSLTEngineImpl::VariableStack::findXObject(
- const QName& name,
- bool fSearchGlobalSpace) const
-{
- XObject* theXObject = 0;
-
- const Arg* const theArg = findArg(name, fSearchGlobalSpace);
-
- if (theArg != 0)
- {
- if (theArg->getArgType() == Arg::eXObject)
- {
- theXObject = theArg->getXObjectPtr();
- }
- }
-
- return theXObject;
-}
-
-
-
-
-
-const Arg*
-XSLTEngineImpl::VariableStack::findArg(
- const QName& qname,
- bool fSearchGlobalSpace) const
-{
- const Arg* theResult = 0;
-
- const int nElems = getCurrentStackFrameIndex();
-
- // Sub 1 extra for the context marker.
- for(int i = nElems - 1; i >= 0; --i)
- {
- const StackEntry* const theEntry =
- m_stack[i];
- assert(theEntry != 0);
-
- if(theEntry->getType() == StackEntry::eArgument)
- {
- const Arg* const theArg =
- static_cast<const Arg*>(theEntry);
-
- if(theArg->getName().equals(qname))
- {
- theResult = theArg;
- break;
- }
- }
- else if(theEntry->getType() == StackEntry::eContextMarker)
- {
- break;
- }
- }
-
- if(0 == theResult && true == fSearchGlobalSpace)
- {
- // Look in the global space
- for(int i = m_globalStackFrameIndex - 1; i >= 2; i--)
- {
- const StackEntry* const theEntry = m_stack[i];
- assert(theEntry != 0);
-
- if(theEntry->getType() == StackEntry::eArgument)
- {
- const Arg* const theArg =
- static_cast<const Arg*>(theEntry);
-
- if(theArg->getName().equals(qname))
- {
- theResult = theArg;
- break;
- }
- }
- else if(theEntry->getType() == StackEntry::eContextMarker)
- {
- break;
- }
- }
- }
-
- return theResult;
-}
-
-
-
-void
-XSLTEngineImpl::VariableStack::pushElementFrame(const ElemTemplateElement* elem)
-{
- StackEntry* const theEntry = new ElementFrameMarker(elem);
-
- m_stackEntries.insert(theEntry);
-
- push(theEntry);
-}
-
-
-
-void
-XSLTEngineImpl::VariableStack::popElementFrame(const ElemTemplateElement* elem)
-{
- const int nElems = getCurrentStackFrameIndex();
-
- bool fFound = false;
-
- // Sub 1 extra for the context marker.
- for(int i = nElems - 1; i >= 0 && fFound == false; --i)
- {
- const StackEntry* const theEntry =
- m_stack[i];
- assert(theEntry != 0 && theEntry == back());
-
- // Pop it off the stack...
- pop();
-
- if(theEntry->getType() == StackEntry::eContextMarker)
- {
- // Didn't really find it, but quit anyway...
- // $$$ ToDo: Isn't this really a bad stack context???
- fFound = true;
- }
- else if (theEntry->getType() == StackEntry::eElementFrameMarker)
- {
- const ElementFrameMarker* const theMarker =
- static_cast<const ElementFrameMarker*>(theEntry);
-
- const ElemTemplateElement* const theElement =
- theMarker->getElement();
-
- fFound = true;
-
- if (theElement != elem)
- {
- throw InvalidStackContextException();
- }
- }
- }
-}
-
-
-
-XSLTEngineImpl::VariableStack::InvalidStackContextException::InvalidStackContextException() :
- XSLTProcessorException(XALAN_STATIC_UCODE_STRING("Invalid stack context"),
- XALAN_STATIC_UCODE_STRING("InvalidStackContextException"))
-{
-}
-
-
-
-XSLTEngineImpl::VariableStack::InvalidStackContextException::~InvalidStackContextException()
-{
+ return m_xobjectFactory.returnObject(theXObject);
}
1.38 +37 -542 xml-xalan/c/src/XSLT/XSLTEngineImpl.hpp
Index: XSLTEngineImpl.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTEngineImpl.hpp,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -r1.37 -r1.38
--- XSLTEngineImpl.hpp 2000/07/06 20:19:25 1.37
+++ XSLTEngineImpl.hpp 2000/07/21 19:52:58 1.38
@@ -93,14 +93,14 @@
#include <XPath/Function.hpp>
-#include <XPath/MutableNodeRefList.hpp>
+//#include <XPath/MutableNodeRefList.hpp>
#include <XPath/NameSpace.hpp>
-#include "Arg.hpp"
#include "KeyDeclaration.hpp"
-#include "ProblemListener.hpp"
+#include "ProblemListenerDefault.hpp"
+#include "StylesheetExecutionContext.hpp"
#include "XSLTProcessorException.hpp"
@@ -113,8 +113,6 @@
class InputSource;
class PrintWriter;
class ResultTreeFragBase;
-class StackEntry;
-class Stylesheet;
class StylesheetConstructionContext;
class StylesheetExecutionContext;
class StylesheetRoot;
@@ -124,7 +122,6 @@
class XMLParserLiaison;
class XMLURL;
class XObject;
-class XObjectObject;
class XPathEnvSupport;
class XPathFactory;
class XPathProcessor;
@@ -154,26 +151,20 @@
# define XALAN_STD std::
#endif
- typedef XALAN_STD auto_ptr<XPathProcessor> XPathProcessorPtrType;
- typedef XALAN_STD map<XalanDOMString, XObject*> TopLevelVariablesMapType;
- typedef XALAN_STD map<XalanDOMString, int> AttributeKeysMapType;
- typedef XALAN_STD map<XalanDOMString, int> ElementKeysMapType;
- typedef XALAN_STD map<const void*, clock_t> DurationsTableMapType;
- typedef XALAN_STD set<XalanDOMString> TranslateCSSSetType;
- typedef XALAN_STD vector<Arg> ParamVectorType;
- typedef XALAN_STD vector<ElemAttributeSet*> AttrStackType;
- typedef XALAN_STD vector<KeyDeclaration> KeyDeclarationVectorType;
- typedef XALAN_STD vector<const Locator*> LocatorStack;
- typedef XALAN_STD vector<NameSpace> NamespaceVectorType;
- typedef XALAN_STD vector<NamespaceVectorType> NamespacesStackType;
- typedef XALAN_STD vector<TraceListener*> TraceListenerVectorType;
- typedef XALAN_STD vector<bool> BoolVectorType;
-
-
- typedef XALAN_STD map<const XalanNode*, int> XSLDirectiveMapType;
+ typedef XALAN_STD auto_ptr<XPathProcessor> XPathProcessorPtrType;
+ typedef XALAN_STD map<XalanDOMString, int> AttributeKeysMapType;
+ typedef XALAN_STD map<XalanDOMString, int> ElementKeysMapType;
+ typedef XALAN_STD map<const void*, clock_t> DurationsTableMapType;
+ typedef XALAN_STD vector<const Locator*> LocatorStack;
+ typedef XALAN_STD vector<NameSpace> NamespaceVectorType;
+ typedef XALAN_STD vector<NamespaceVectorType> NamespacesStackType;
+ typedef XALAN_STD vector<TraceListener*> TraceListenerVectorType;
+ typedef XALAN_STD vector<bool> BoolVectorType;
+ typedef XALAN_STD map<const XalanNode*, int> XSLDirectiveMapType;
#undef XALAN_STD
- typedef Function::XObjectArgVectorType XObjectArgVectorType;
+ typedef Function::XObjectArgVectorType XObjectArgVectorType;
+ typedef StylesheetExecutionContext::ParamVectorType ParamVectorType;
// Public members
//---------------------------------------------------------------------
@@ -240,6 +231,13 @@
static void
Initialize();
+ /**
+ * Perform termination of statics -- can be called to make memory
+ * leak detection easier.
+ */
+ static void
+ Terminate();
+
// These methods are inherited from XSLTProcessor ...
virtual void
@@ -272,20 +270,11 @@
virtual void
outputToResultTree(const XObject& xobj);
- virtual XObject*
- getTopLevelVariable(const XalanDOMString& theName) const;
-
virtual void
resetCurrentState(
XalanNode* sourceTree,
XalanNode* xmlNode);
- virtual XalanDocument*
- getRootDoc() const;
-
- virtual void
- setRootDoc(XalanDocument* doc);
-
virtual XalanDOMString
evaluateAttrVal(
XalanNode* contextNode,
@@ -315,23 +304,23 @@
virtual XObject*
createXResultTreeFrag(const ResultTreeFragBase& r) const;
-
- virtual XObject*
- getVariable(const QName& qname) const;
- virtual XObject*
- getParamVariable(const QName& theName) const;
+ /**
+ * Function to destroy an XObject that was returned
+ * by executing. It is safe to call this function
+ * with any XObject.
+ *
+ * @param theXObject pointer to the XObject.
+ * @return true if the object was destroyed.
+ */
+ virtual bool
+ destroyXObject(XObject* theXObject) const;
virtual void
- pushVariable(
- const QName& name,
- XObject* var,
- const XalanNode* element);
-
- virtual void setStylesheetParam(
+ setStylesheetParam(
const XalanDOMString& key,
const XalanDOMString& expression);
-
+
virtual void
setStylesheetParam(
const XalanDOMString& key,
@@ -974,59 +963,6 @@
const XalanDocument& doc) const;
/**
- * Push a context marker onto the stack to let us know when to stop
- * searching for a var.
- *
- * @param caller caller node
- * @param sourceNode source node
- */
- void
- pushContextMarker(
- const XalanNode* caller,
- const XalanNode* sourceNode)
- {
- m_variableStacks.pushContextMarker(caller, sourceNode);
- }
-
- /**
- * Pop the current context from the current context stack.
- */
- void
- popCurrentContext()
- {
- m_variableStacks.popCurrentContext();
- }
-
- /**
- * Given a template, search for the arguments and push them on the stack.
- * Also, push default arguments on the stack. You <em>must</em> call
- * popContext() when you are done with the arguments.
- *
- * @param executionContext execution context
- * @param xslCallTemplateElement "call-template" element
- * @param sourceTree source tree
- * @param sourceNode source node
- * @param mode mode under which the template is operating
- * @param targetTemplate target template
- */
- void
- pushParams(
- StylesheetExecutionContext& executionContext,
- const ElemTemplateElement& xslCallTemplateElement,
- XalanNode* sourceTree,
- XalanNode* sourceNode,
- const QName& mode,
- const XalanNode* targetTemplate)
- {
- m_variableStacks.pushParams(executionContext,
- xslCallTemplateElement,
- sourceTree,
- sourceNode,
- mode,
- targetTemplate);
- }
-
- /**
* Given an element, return an attribute value in the form of a string.
*
* @param el element from where to get the attribute
@@ -1220,26 +1156,7 @@
return m_xpathEnvSupport;
}
- // $$$ ToDo: why isn't this just a NodeRefListBase?
- const MutableNodeRefList&
- getContextNodeList() const
- {
- return m_contextNodeList;
- }
-
/**
- * Set node list for current context.
- *
- * @param ref new node list
- */
- // $$$ ToDo: why isn't this just a NodeRefListBase?
- void
- setContextNodeList(const MutableNodeRefList& ref)
- {
- m_contextNodeList = ref;
- }
-
- /**
* Set the problem listener property. The XSL class can have a single
* listener that can be informed of errors and warnings, and can normally
* control if an exception is thrown or not (or the problem listeners can
@@ -1308,331 +1225,6 @@
}
/**
- * An class for exceptions that occur when a given stylesheet goes into an
- * infinite loop.
- */
- class XSLInfiniteLoopException : public XSLTProcessorException
- {
- public:
- XSLInfiniteLoopException();
-
- virtual
- ~XSLInfiniteLoopException();
- };
-
- /**
- * Defines a class to keep track of a stack for macro arguments.
- */
- class VariableStack
- {
- public:
-
- /**
- * Constructor for a variable stack.
- *
- * @param theProcessor XSL processor
- */
- VariableStack(XSLTEngineImpl& theProcessor);
-
- ~VariableStack();
-
-
- /**
- * Reset the stack.
- */
- virtual void
- reset();
-
- /**
- * Push a context marker onto the stack to let us know when
- * to stop searching for a var.
- *
- * @param elem element for context
- */
- void
- pushElementMarker(const XalanNode* elem);
-
- /**
- * Pop the current context from the current context stack.
- *
- * @param elem element for context
- */
- void
- popElementMarker(const XalanNode* elem);
-
- /**
- * Check to see if an element marker for the particular node has already
- * been pushed.
- *
- * @param elem node in question
- * @return true if it has been pushed already
- */
- bool
- elementMarkerAlreadyPushed(const XalanNode* elem) const;
-
- /**
- * Push a context marker onto the stack to let us know when to stop
- * searching for a var.
- *
- * @param caller caller node
- * @param sourceNode source node
- */
- void
- pushContextMarker(
- const XalanNode* caller,
- const XalanNode* sourceNode);
-
- /**
- * Pop the current context from the current context stack.
- */
- void
- popCurrentContext();
-
- /**
- * Given a template, search for the arguments and push them on the stack.
- * Also, push default arguments on the stack. You <em>must</em> call
- * popContext() when you are done with the arguments.
- *
- * @param executionContext execution context
- * @param xslCallTemplateElement "call-template" element
- * @param sourceTree source tree
- * @param sourceNode source node
- * @param mode mode under which the template is operating
- * @param targetTemplate target template
- */
- void
- pushParams(
- StylesheetExecutionContext& executionContext,
- const ElemTemplateElement& xslCallTemplateElement,
- XalanNode* sourceTree,
- XalanNode* sourceNode,
- const QName& mode,
- const XalanNode* targetTemplate);
-
- /**
- * Given a name, return a string representing the value, but don't look
- * in the global space.
- *
- * @param theName name of variable
- * @return pointer to XObject for variable
- */
- XObject*
- getXObjectParamVariable(const QName& qname) const
- {
- return findXObject(qname, false);
- }
-
- /**
- * Given a name, find the corresponding XObject.
- *
- * @param qname name of variable
- * @return pointer to the corresponding XObject
- */
- XObject*
- getXObjectVariable(const QName& name) const
- {
- return findXObject(name, true);
- }
-
- /**
- * Push a named variable onto the processor variable stack. Don't forget
- * to call startContext before pushing a series of arguments for a given
- * macro call.
- *
- * @param name name of variable
- * @param val pointer to XObject value
- * @param e element marker for variable
- */
- void
- pushVariable(
- const QName& name,
- XObject* val,
- const XalanNode* e);
-
- /**
- * Mark the top of the global stack frame.
- */
- void
- markGlobalStackFrame()
- {
- m_globalStackFrameIndex = m_stack.size();
-
- pushContextMarker(0, 0);
- }
-
- /**
- * Set the top of the stack frame from where a search for a variable or
- * param should take place. Calling with no parameter will cause the
- * index to be set to the size of the stack.
- *
- * @param currentStackFrameIndex new value of index
- */
- void
- setCurrentStackFrameIndex(int currentStackFrameIndex = -1)
- {
- if (currentStackFrameIndex == -1)
- m_currentStackFrameIndex = m_stack.size();
- else
- m_currentStackFrameIndex = currentStackFrameIndex;
- }
-
- /**
- * Get the top of the stack frame from where a search
- * for a variable or param should take place.
- *
- * @return current value of index
- */
- int
- getCurrentStackFrameIndex() const
- {
- return m_currentStackFrameIndex;
- }
-
- /**
- * Push an entry onto the stack.
- *
- * @param stack entry to push
- */
- void
- push(StackEntry* theEntry)
- {
- assert(theEntry != 0);
- assert(theEntry->getType() < StackEntry::eNextValue && theEntry->getType() >= 0);
-
- if(m_currentStackFrameIndex == m_stack.size())
- {
- ++m_currentStackFrameIndex;
- }
-
- m_stack.push_back(theEntry);
- }
-
- /**
- * Override the pop in order to track the
- * m_currentStackFrameIndex correctly.
- *
- * @return stack entry popped
- */
- void
- pop()
- {
- assert(m_stack.empty() == false);
-
- if(m_currentStackFrameIndex == m_stack.size())
- {
- --m_currentStackFrameIndex;
- }
-
- // We can't really delete anything here, since
- // the caller may still be referring to the
- // stack entry...
- m_stack.pop_back();
- }
-
- StackEntry*
- back() const
- {
- assert(m_stack.empty() == false);
-
- return m_stack.back();
- }
-
- /**
- * Push a frame marker for an element.
- *
- * @param elem the element
- */
- void
- pushElementFrame(const ElemTemplateElement* elem);
-
- /**
- * Pop a frame marker for an element.
- *
- * @param elem the element
- */
- void
- popElementFrame(const ElemTemplateElement* elem);
-
-
- class InvalidStackContextException : public XSLTProcessorException
- {
- public:
-
- InvalidStackContextException();
-
- virtual
- ~InvalidStackContextException();
-
- private:
-
- };
-
- private:
-
- // Default stack vector allocation size.
- enum
- {
- eDefaultVectorSize = 200
- };
-
- XObject*
- findXObject(
- const QName& name,
- bool fSearchGlobalSpace) const;
-
- const Arg*
- findArg(
- const QName& name,
- bool fSearchGlobalSpace) const;
-
- // $$$ ToDo: Is this really used?
- /**
- * Holds caller, so that it may be searched for
- * xsl:params, in order to resolve xsl:param-arg.
- */
- const XalanElement* m_caller;
-
-
-#if defined(XALAN_NO_NAMESPACES)
- typedef vector<StackEntry*> VariableStackStackType;
- typedef set<StackEntry*> StackEntrySetType;
-#else
- typedef std::vector<StackEntry*> VariableStackStackType;
- typedef std::set<StackEntry*> StackEntrySetType;
-#endif
-
- VariableStackStackType m_stack;
-
- StackEntrySetType m_stackEntries;
-
- XSLTEngineImpl& m_processor;
-
- int m_globalStackFrameIndex;
-
- /**
- * This is the top of the stack frame from where a search
- * for a variable or param should take place. It may not
- * be the real stack top.
- */
- unsigned int m_currentStackFrameIndex;
-
- }; // end VariableStack
-
- // Give VariableStack access to stuff.
- friend class VariableStack;
-
- /**
- * Accessor method for variable stack.
- *
- * @return variable stack
- */
- VariableStack&
- getVariableStacks()
- {
- return m_variableStacks;
- }
-
- /**
* Create a document fragment. This function may return null.
*
* @return pointer to new document fragment
@@ -1673,17 +1265,6 @@
setPendingElementName(const XalanDOMString& elementName);
/**
- * Accessor method for stack that keeps track of the attribute elements.
- *
- * @return attribute stack
- */
- AttrStackType&
- getAttrSetStack()
- {
- return m_attrSetStack;
- }
-
- /**
* Get the locator from the top of the locator stack.
*
* @return A pointer to the Locator, or 0 if there is nothing on the stack.
@@ -1878,17 +1459,13 @@
LocatorStack m_stylesheetLocatorStack;
/**
- * The stack of Variable stacks. A VariableStack will be
- * pushed onto this stack for each template invocation.
- */
- VariableStack m_variableStacks;
-
- /**
* The XSL class can have a single listener that can be informed
* of errors and warnings, and can normally control if an exception
* is thrown or not (or the problem listeners can throw their
* own RuntimeExceptions).
*/
+ ProblemListenerDefault m_defaultProblemListener;
+
ProblemListener* m_problemListener;
/**
@@ -2003,19 +1580,6 @@
translateCSSAttrsToStyleAttr(AttributeListImpl& attList);
/**
- * Given a name, locate a variable in the current context, and return
- * the XObject.
- *
- * @param executionContext The current execution context.
- * @param name The name of the variable
- * @return a pointer to an XObject that represents the variable.
- */
- XObject*
- getXObjectVariable(
- StylesheetExecutionContext& executionContext,
- const XalanDOMString& name) const;
-
- /**
* Get an XLocator provider keyed by node. This gets the association
* based on the root of the tree that is the node's parent.
*
@@ -2143,79 +1707,10 @@
MutableNodeRefList m_contextNodeList;
/**
- * Table for defined constants, keyed on the names.
+ * Current execution context...
*/
- TopLevelVariablesMapType m_topLevelVariables;
-
StylesheetExecutionContext* m_executionContext;
- /**
- * The StackGuard class guard against infinite loops.
- */
- class StackGuard
- {
- public:
-
-#if defined(XALAN_NO_NAMESPACES)
- typedef vector<StackGuard> StackGuardStackType;
-#else
- typedef std::vector<StackGuard> StackGuardStackType;
-#endif
-
- StackGuard(
- XSLTEngineImpl& processor,
- const XalanElement* xslTemplate = 0,
- const XalanNode* sourceXML = 0);
-
- ~StackGuard();
-
- bool operator==(const StackGuard& theRHS) const
- {
- return m_xslRule == theRHS.m_xslRule &&
- m_sourceXML == theRHS.m_sourceXML;
- }
-
- void print(PrintWriter& pw) const;
-
- void push(
- const XalanElement* xslTemplate,
- const XalanNode* sourceXML);
-
- void pop();
-
- void clear()
- {
- m_stack.clear();
- }
-
- void
- checkForInfiniteLoop(const StackGuard& guard) const;
-
- private:
-
- XSLTEngineImpl* m_processor;
- const XalanElement* m_xslRule;
- const XalanNode* m_sourceXML;
-
- StackGuardStackType m_stack;
- };
-
-
- // This is set to true when the "ancestor" attribute of
- // the select element is encountered.
- bool m_needToCheckForInfiniteLoops;
-
- /**
- * Object to guard agains infinite recursion when
- * doing queries.
- */
- StackGuard m_stackGuard;
-
- /**
- * Stack for the purposes of flagging infinite recursion with
- * attribute sets.
- */
- AttrStackType m_attrSetStack;
static void
InstallFunctions();
1.12 +8 -55 xml-xalan/c/src/XSLT/XSLTProcessor.hpp
Index: XSLTProcessor.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTProcessor.hpp,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- XSLTProcessor.hpp 2000/06/01 16:28:37 1.11
+++ XSLTProcessor.hpp 2000/07/21 19:52:58 1.12
@@ -227,15 +227,6 @@
outputToResultTree(const XObject& xobj) = 0;
/**
- * Retrieve a top level variable corresponding to name.
- *
- * @param theName name of variable
- * @return pointer to XObject for variable
- */
- virtual XObject*
- getTopLevelVariable(const XalanDOMString& theName) const = 0;
-
- /**
* Reset the state of execution to node 'xmlNode' in source tree
* 'sourceTree.'
*
@@ -248,22 +239,6 @@
XalanNode* xmlNode) = 0;
/**
- * Retrieve root document for stylesheet.
- *
- * @return root document
- */
- virtual XalanDocument*
- getRootDoc() const = 0;
-
- /**
- * Set root document for stylesheet.
- *
- * @param doc root document
- */
- virtual void
- setRootDoc(XalanDocument* doc) = 0;
-
- /**
* Retrieve the root stylesheet.
*
* @return pointer to root stylesheet
@@ -358,7 +333,7 @@
getUniqueNSValue() const = 0;
/**
- * Convenience function to create an XObject that represents a Result tree
+ * Function to create an XObject that represents a Result tree
* fragment.
*
* @param r result tree fragment to use
@@ -367,38 +342,16 @@
virtual XObject*
createXResultTreeFrag(const ResultTreeFragBase& r) const = 0;
- /**
- * Given a name, locate a variable in the current context, and return
- * a pointer to the object.
- *
- * @param theName name of variable
- * @return pointer to an XObject if the variable was found, 0 if it was not
- */
- virtual XObject*
- getVariable(const QName& qname) const = 0;
-
/**
- * Given a name, return a string representing the value, but don't look in
- * the global space.
+ * Function to destroy an XObject that was returned
+ * by executing. It is safe to call this function
+ * with any XObject.
*
- * @param theName name of variable
- * @return pointer to XObject for variable
+ * @param theXObject pointer to the XObject.
+ * @return true if the object was destroyed.
*/
- virtual XObject*
- getParamVariable(const QName& theName) const = 0;
-
- /**
- * Push a named variable onto the processor variable stack
- *
- * @param name name of variable
- * @param var pointer to XObject value
- * @param element element marker for variable
- */
- virtual void
- pushVariable(
- const QName& name,
- XObject* var,
- const XalanNode* element) = 0;
+ virtual bool
+ destroyXObject(XObject* theXObject) const = 0;
/**
* Push a top-level stylesheet parameter. This value can be evaluated via
1.6 +0 -5 xml-xalan/c/src/XSLT/XSLTProcessorEnvSupport.hpp
Index: XSLTProcessorEnvSupport.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTProcessorEnvSupport.hpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- XSLTProcessorEnvSupport.hpp 2000/05/24 19:38:50 1.5
+++ XSLTProcessorEnvSupport.hpp 2000/07/21 19:52:58 1.6
@@ -106,11 +106,6 @@
const PrefixResolver& resolver,
XPathExecutionContext& executionContext) const = 0;
- virtual XObject*
- getVariable(
- XObjectFactory& factory,
- const QName& name) const = 0;
-
virtual XalanDocument*
parseXML(
const XalanDOMString& urlString,
1.14 +0 -18 xml-xalan/c/src/XSLT/XSLTProcessorEnvSupportDefault.cpp
Index: XSLTProcessorEnvSupportDefault.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTProcessorEnvSupportDefault.cpp,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- XSLTProcessorEnvSupportDefault.cpp 2000/05/29 22:43:47 1.13
+++ XSLTProcessorEnvSupportDefault.cpp 2000/07/21 19:52:58 1.14
@@ -251,24 +251,6 @@
-XObject*
-XSLTProcessorEnvSupportDefault::getVariable(
- XObjectFactory& factory,
- const QName& name) const
-{
- if (m_processor == 0)
- {
- return m_defaultSupport.getVariable(factory,
- name);
- }
- else
- {
- return m_processor->getVariable(name);
- }
-}
-
-
-
XalanDocument*
XSLTProcessorEnvSupportDefault::parseXML(
const XalanDOMString& urlString,
1.11 +0 -5 xml-xalan/c/src/XSLT/XSLTProcessorEnvSupportDefault.hpp
Index: XSLTProcessorEnvSupportDefault.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTProcessorEnvSupportDefault.hpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- XSLTProcessorEnvSupportDefault.hpp 2000/05/24 19:38:50 1.10
+++ XSLTProcessorEnvSupportDefault.hpp 2000/07/21 19:52:58 1.11
@@ -177,11 +177,6 @@
const PrefixResolver& resolver,
XPathExecutionContext& executionContext) const;
- virtual XObject*
- getVariable(
- XObjectFactory& factory,
- const QName& name) const;
-
virtual XalanDocument*
parseXML(
const XalanDOMString& urlString,
1.5 +49 -7 xml-xalan/c/src/XSLT/XSLTResultTarget.cpp
Index: XSLTResultTarget.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTResultTarget.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- XSLTResultTarget.cpp 2000/04/25 19:54:20 1.4
+++ XSLTResultTarget.cpp 2000/07/21 19:52:58 1.5
@@ -72,7 +72,9 @@
m_byteStream(0),
m_encoding(),
m_characterStream(0),
- m_node(),
+ m_document(0),
+ m_documentFragment(0),
+ m_element(0),
m_formatterListener(0)
{
}
@@ -84,7 +86,9 @@
m_byteStream(0),
m_encoding(),
m_characterStream(0),
- m_node(),
+ m_document(0),
+ m_documentFragment(0),
+ m_element(0),
m_formatterListener(0)
{
}
@@ -100,7 +104,9 @@
m_byteStream(theStream),
m_encoding(),
m_characterStream(0),
- m_node(),
+ m_document(0),
+ m_documentFragment(0),
+ m_element(0),
m_formatterListener(0)
{
assert(theStream != 0);
@@ -113,7 +119,9 @@
m_byteStream(0),
m_encoding(),
m_characterStream(characterStream),
- m_node(),
+ m_document(0),
+ m_documentFragment(0),
+ m_element(0),
m_formatterListener(0)
{
assert(characterStream != 0);
@@ -121,13 +129,47 @@
-XSLTResultTarget::XSLTResultTarget(XalanNode* n) :
+XSLTResultTarget::XSLTResultTarget(XalanDocument* document) :
m_fileName(),
m_byteStream(0),
m_encoding(),
m_characterStream(0),
- m_node(n),
+ m_document(document),
+ m_documentFragment(0),
+ m_element(0),
m_formatterListener(0)
{
- assert(n != 0);
+ assert(document != 0);
}
+
+
+
+XSLTResultTarget::XSLTResultTarget(XalanDocumentFragment* documentFragment) :
+ m_fileName(),
+ m_byteStream(0),
+ m_encoding(),
+ m_characterStream(0),
+ m_document(0),
+ m_documentFragment(documentFragment),
+ m_element(0),
+ m_formatterListener(0)
+{
+ assert(documentFragment != 0);
+}
+
+
+
+XSLTResultTarget::XSLTResultTarget(XalanElement* element) :
+ m_fileName(),
+ m_byteStream(0),
+ m_encoding(),
+ m_characterStream(0),
+ m_document(0),
+ m_documentFragment(0),
+ m_element(element),
+ m_formatterListener(0)
+{
+ assert(element != 0);
+}
+
+
1.9 +98 -19 xml-xalan/c/src/XSLT/XSLTResultTarget.hpp
Index: XSLTResultTarget.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTResultTarget.hpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- XSLTResultTarget.hpp 2000/05/31 17:01:19 1.8
+++ XSLTResultTarget.hpp 2000/07/21 19:52:59 1.9
@@ -82,7 +82,9 @@
-class XalanNode;
+class XalanDocument;
+class XalanDocumentFragment;
+class XalanElement;
class Writer;
@@ -121,13 +123,27 @@
XSLTResultTarget(Writer* characterStream);
/**
- * Create a new output target with a DOM node.
+ * Create a new output target with a DOM document.
*
* @param n root of DOM node tree that holds results
*/
- XSLTResultTarget(XalanNode* n);
+ XSLTResultTarget(XalanDocument* document);
/**
+ * Create a new output target with a DOM document fragment.
+ *
+ * @param n root of DOM node tree that holds results
+ */
+ XSLTResultTarget(XalanDocumentFragment* documentFragment);
+
+ /**
+ * Create a new output target with a DOM element.
+ *
+ * @param n root of DOM node tree that holds results
+ */
+ XSLTResultTarget(XalanElement* element);
+
+ /**
* Set the file name where the results will be written.
*
* @param fileName system identifier as a string
@@ -225,29 +241,88 @@
return m_characterStream;
}
+ bool
+ hasDOMTarget() const
+ {
+ return m_document != 0 || m_documentFragment != 0 || m_element != 0;
+ }
+
/**
- * Set the node that will contain the result nodes.
+ * Set the document node that will contain the result nodes.
*
* @param node DOM node to contain results
*/
void
- setNode(XalanNode* node)
+ setDocument(XalanDocument* document)
+ {
+ m_document = document;
+
+ m_documentFragment = 0;
+ m_element = 0;
+ }
+
+ /**
+ * Get the document node that will contain the result nodes.
+ *
+ * @return a pointer to the document node
+ */
+ XalanDocument*
+ getDocument() const
{
- m_node = node;
+ return m_document;
}
/**
- * Get the node that will contain the result nodes.
+ * Set the document fragment node that will contain the result nodes.
*
- * @return DOM node containing results
+ * @param node DOM node to contain results
*/
- XalanNode*
- getNode() const
+ void
+ setDocumentFragment(XalanDocumentFragment* documentFragment)
{
- return m_node;
+ m_documentFragment = documentFragment;
+
+ m_document = 0;
+ m_element = 0;
}
-
+
/**
+ * Get the document node that will contain the result nodes.
+ *
+ * @return a pointer to the document node
+ */
+ XalanDocumentFragment*
+ getDocumentFragment() const
+ {
+ return m_documentFragment;
+ }
+
+ /**
+ * Set the element node that will contain the result nodes.
+ *
+ * @param node DOM node to contain results
+ */
+ void
+ setElement(XalanElement* element)
+ {
+ m_element = element;
+
+ m_documentFragment = 0;
+ m_document = 0;
+ }
+
+ /**
+ * Get the document node that will contain the result nodes.
+ *
+ * @return a pointer to the document node
+ */
+ XalanElement*
+ getElement() const
+ {
+ return m_element;
+ }
+
+ /**
* Set a SAX DocumentHandler to process the result tree events.
*
* @param handler pointer to new handler
@@ -293,21 +368,25 @@
private:
- XalanDOMString m_fileName;
+ XalanDOMString m_fileName;
#if defined(XALAN_NO_NAMESPACES)
- ostream* m_byteStream;
+ ostream* m_byteStream;
#else
- std::ostream* m_byteStream;
+ std::ostream* m_byteStream;
#endif
+
+ XalanDOMString m_encoding;
+
+ Writer* m_characterStream;
- XalanDOMString m_encoding;
+ XalanDocument* m_document;
- Writer* m_characterStream;
+ XalanDocumentFragment* m_documentFragment;
- XalanNode* m_node;
+ XalanElement* m_element;
- FormatterListener* m_formatterListener;
+ FormatterListener* m_formatterListener;
};