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/05/30 00:49:01 UTC
cvs commit: xml-xalan/c/src/XSLT ElemForEach.cpp FunctionDocument.cpp StylesheetExecutionContext.hpp StylesheetExecutionContextDefault.cpp StylesheetExecutionContextDefault.hpp
dbertoni 00/05/29 15:49:01
Modified: c/src/XSLT ElemForEach.cpp FunctionDocument.cpp
StylesheetExecutionContext.hpp
StylesheetExecutionContextDefault.cpp
StylesheetExecutionContextDefault.hpp
Log:
Created objects to help maintain execution state. Implemented new element stack frame marker.
Revision Changes Path
1.5 +11 -5 xml-xalan/c/src/XSLT/ElemForEach.cpp
Index: ElemForEach.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemForEach.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- ElemForEach.cpp 2000/04/12 19:40:58 1.4
+++ ElemForEach.cpp 2000/05/29 22:49:00 1.5
@@ -145,11 +145,17 @@
{
assert(m_pSelectPattern != 0);
- transformSelectedChildren(executionContext, getStylesheet(),
- *this,this,sourceTree,sourceNode,mode,
- m_pSelectPattern, Constants::ELEMNAME_FOREACH,
- executionContext.getCurrentStackFrameIndex()
- );
+ transformSelectedChildren(
+ executionContext,
+ getStylesheet(),
+ *this,
+ this,
+ sourceTree,
+ sourceNode,
+ mode,
+ m_pSelectPattern,
+ Constants::ELEMNAME_FOREACH,
+ executionContext.getCurrentStackFrameIndex());
}
else
{
1.8 +19 -4 xml-xalan/c/src/XSLT/FunctionDocument.cpp
Index: FunctionDocument.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/FunctionDocument.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- FunctionDocument.cpp 2000/05/11 21:32:01 1.7
+++ FunctionDocument.cpp 2000/05/29 22:49:00 1.8
@@ -119,9 +119,15 @@
{
XalanDOMString theMessage("Cannot load requested doc: ");
- theMessage += base;
theMessage += localURI;
+ if (length(base) > 0)
+ {
+ theMessage += " (Base URI: ";
+ theMessage += base;
+ theMessage += ")";
+ }
+
executionContext.warn(theMessage);
}
}
@@ -203,12 +209,19 @@
assert(XObject::eTypeNodeSet != arg->getType() ||
arg->nodeset().item(i) != 0);
- const XalanDOMString ref = XObject::eTypeNodeSet == arg->getType() ?
+ XalanDOMString ref = XObject::eTypeNodeSet == arg->getType() ?
executionContext.getNodeData(*arg->nodeset().item(i)) :
arg->str();
- if(! isEmpty(ref))
+ // This is the case where the function was called with
+ // an empty string, which refers to the stylesheet itself.
+ if (nRefs == 1 && isEmpty(ref) == true && args.size() == 1)
{
+ ref = base;
+ }
+
+ if(!isEmpty(ref))
+ {
if(docContext == 0)
{
executionContext.error("The context node does not have an owner document!");
@@ -237,7 +250,7 @@
if(indexOfColon < theLength && indexOfSlash < theLength && indexOfColon < indexOfSlash)
{
// The url (or filename, for that matter) is absolute.
- base = XalanDOMString();
+ clear(base);
}
XalanDocument* const newDoc = getDoc(executionContext, ref, base);
@@ -248,6 +261,8 @@
}
}
}
+
+ assert(mnl.checkForDuplicates() == false);
return executionContext.getXObjectFactory().createNodeSet(mnl);
}
1.17 +79 -0 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.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- StylesheetExecutionContext.hpp 2000/05/25 16:51:34 1.16
+++ StylesheetExecutionContext.hpp 2000/05/29 22:49:00 1.17
@@ -721,6 +721,51 @@
getParamVariable(const QName& theName) const = 0;
/**
+ * Push a frame marker for an element.
+ *
+ * @param elem the element
+ */
+ virtual void
+ pushElementFrame(const ElemTemplateElement* elem) = 0;
+
+ /**
+ * Pop a frame marker for an element.
+ *
+ * @param elem the element
+ */
+ virtual void
+ popElementFrame(const ElemTemplateElement* elem) = 0;
+
+ /*
+ * A class to manage pushing and popping an element's stack
+ * frame context.
+ */
+ class PushAndPopElementFrame
+ {
+ public:
+
+ PushAndPopElementFrame(
+ StylesheetExecutionContext& executionContext,
+ const ElemTemplateElement* element) :
+ m_executionContext(executionContext),
+ m_element(element)
+ {
+ executionContext.pushElementFrame(element);
+ }
+
+ ~PushAndPopElementFrame()
+ {
+ m_executionContext.popElementFrame(m_element);
+ }
+
+ private:
+
+ StylesheetExecutionContext& m_executionContext;
+
+ const ElemTemplateElement* m_element;
+ };
+
+ /**
* Get the top of the stack frame from where a search
* for a variable or param should take place.
*
@@ -737,6 +782,40 @@
*/
virtual void
setCurrentStackFrameIndex(int currentStackFrameIndex = -1) = 0;
+
+ /*
+ * A class to manage the state of the variable stacks frame index.
+ */
+ class SetAndRestoreCurrentStackFrameIndex
+ {
+ public:
+
+ SetAndRestoreCurrentStackFrameIndex(
+ StylesheetExecutionContext& executionContext,
+ int newIndex) :
+ m_executionContext(executionContext),
+ m_savedIndex(executionContext.getCurrentStackFrameIndex())
+ {
+ executionContext.setCurrentStackFrameIndex(newIndex);
+ }
+
+ ~SetAndRestoreCurrentStackFrameIndex()
+ {
+ m_executionContext.setCurrentStackFrameIndex(m_savedIndex);
+ }
+
+ int
+ getStackFrameIndex() const
+ {
+ return m_savedIndex;
+ }
+
+ private:
+
+ StylesheetExecutionContext& m_executionContext;
+
+ const int m_savedIndex;
+ };
/*
* A class to manage stack state during execution.
1.15 +16 -0 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.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- StylesheetExecutionContextDefault.cpp 2000/05/26 19:23:51 1.14
+++ StylesheetExecutionContextDefault.cpp 2000/05/29 22:49:00 1.15
@@ -547,6 +547,22 @@
+void
+StylesheetExecutionContextDefault::pushElementFrame(const ElemTemplateElement* elem)
+{
+ m_xsltProcessor.getVariableStacks().pushElementFrame(elem);
+}
+
+
+
+void
+StylesheetExecutionContextDefault::popElementFrame(const ElemTemplateElement* elem)
+{
+ m_xsltProcessor.getVariableStacks().popElementFrame(elem);
+}
+
+
+
int
StylesheetExecutionContextDefault::getCurrentStackFrameIndex() const
{
1.15 +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.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- StylesheetExecutionContextDefault.hpp 2000/05/25 16:51:36 1.14
+++ StylesheetExecutionContextDefault.hpp 2000/05/29 22:49:00 1.15
@@ -257,6 +257,12 @@
virtual XObject*
getParamVariable(const QName& theName) const;
+ virtual void
+ pushElementFrame(const ElemTemplateElement* elem);
+
+ virtual void
+ popElementFrame(const ElemTemplateElement* elem);
+
virtual int
getCurrentStackFrameIndex() const;