sboag 00/10/17 12:30:56
Modified: java/src/org/apache/xpath VariableStack.java
Log:
Use a side index instead of pushing element frame objects. Big improvement.
Revision Changes Path
1.5 +14 -21 xml-xalan/java/src/org/apache/xpath/VariableStack.java
Index: VariableStack.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/VariableStack.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- VariableStack.java 2000/09/14 21:03:36 1.4
+++ VariableStack.java 2000/10/17 19:30:55 1.5
@@ -59,6 +59,7 @@
import java.util.Stack;
import java.util.Vector;
import org.apache.xalan.utils.QName;
+import org.apache.xalan.utils.IntStack;
import org.apache.xpath.XPathContext;
import org.apache.xpath.objects.XObject;
import org.apache.xpath.objects.XRTreeFrag;
@@ -95,7 +96,6 @@
}
private static final Integer contextMarker = new Integer(0);
- private static final Arg m_elemFrameBoundry = new Arg();
private int m_globalStackFrameIndex = -1;
/**
@@ -104,6 +104,11 @@
* be the real stack top.
*/
private int m_currentStackFrameIndex = 0;
+
+ /**
+ * Hold the position of the start of the current element frame.
+ */
+ private IntStack m_elemFramePos = new IntStack();
/**
* Mark the top of the global stack frame.
@@ -170,7 +175,7 @@
boolean b = (m_currentStackFrameIndex == this.size());
setSize(sz);
if(b)
- m_currentStackFrameIndex = this.size();
+ m_currentStackFrameIndex = sz;
}
/**
@@ -262,7 +267,7 @@
return null;
}
-
+
/**
* Push an argument onto the stack. Don't forget
* to call startContext before pushing a series of
@@ -270,7 +275,7 @@
*/
public void pushElemFrame()
{
- push(m_elemFrameBoundry);
+ m_elemFramePos.push(this.size());
}
/**
@@ -278,23 +283,11 @@
*/
public void popElemFrame()
{
- int nElems = size();
- // Sub 1 extra for the context marker.
- for(int i = (nElems - 1); i >= 0; i--)
- {
- Object obj = this.elementAt(i);
- if(obj == contextMarker)
- {
- break;
- }
- else if(obj == m_elemFrameBoundry)
- {
- this.setStackSize(i);
- break;
- }
- }
+ int newSize = m_elemFramePos.pop();
+ boolean b = (m_currentStackFrameIndex == this.size());
+ setSize(newSize);
+ if(b)
+ m_currentStackFrameIndex = newSize;
}
-
-
} // end XSLArgStack