santiagopg 2003/12/19 07:26:49
Modified: java/src/org/apache/xalan/xsltc/compiler ApplyTemplates.java
BooleanCall.java CastExpr.java CopyOf.java
DocumentCall.java EqualityExpr.java Expression.java
FilterExpr.java ForEach.java FunctionCall.java
Key.java KeyCall.java NameBase.java NumberCall.java
RelationalExpr.java StringCall.java
VariableBase.java WithParam.java
Log:
Patch for XSLTC's parameter optimization introduced in 2.5.2. The problem is
that a param's default value can now be compiled multiple times, once for every
call to the template for which that param is not specified. This essentially
turns the AST into a graph, which requires the state of a param subtree to be
reset after the each compilation. In particular, the variable
Expression._startReset was not reset and this resulted in calls to
setStartNode() to be generated only the first time the param's default value
was compiled. After some analysis, I realized that _startReset was no longer
necessary, so I removed it. I also renamed Expression.startResetIterator() to
Expression.startIterator() since calls to reset() are no longer generated
within this method.
Revision Changes Path
1.18 +2 -2
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/ApplyTemplates.java
Index: ApplyTemplates.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/ApplyTemplates.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- ApplyTemplates.java 30 Jan 2003 18:45:59 -0000 1.17
+++ ApplyTemplates.java 19 Dec 2003 15:26:48 -0000 1.18
@@ -216,7 +216,7 @@
}
if (_select != null && !setStartNodeCalled) {
- _select.startResetIterator(classGen, methodGen);
+ _select.startIterator(classGen, methodGen);
}
//!!! need to instantiate all needed modes
1.6 +2 -2
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/BooleanCall.java
Index: BooleanCall.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/BooleanCall.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- BooleanCall.java 30 Jan 2003 18:45:59 -0000 1.5
+++ BooleanCall.java 19 Dec 2003 15:26:48 -0000 1.6
@@ -88,7 +88,7 @@
_arg.translate(classGen, methodGen);
final Type targ = _arg.getType();
if (!targ.identicalTo(Type.Boolean)) {
- _arg.startResetIterator(classGen, methodGen);
+ _arg.startIterator(classGen, methodGen);
targ.translateTo(classGen, methodGen, Type.Boolean);
}
}
1.20 +3 -3
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/CastExpr.java
Index: CastExpr.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/CastExpr.java,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- CastExpr.java 17 Oct 2003 17:15:15 -0000 1.19
+++ CastExpr.java 19 Dec 2003 15:26:48 -0000 1.20
@@ -251,7 +251,7 @@
_left.translate(classGen, methodGen);
if (_type != ltype) {
- _left.startResetIterator(classGen, methodGen);
+ _left.startIterator(classGen, methodGen);
if (_type instanceof BooleanType) {
fl = ltype.translateToDesynthesized(classGen, methodGen,
_type);
@@ -270,7 +270,7 @@
final Type ltype = _left.getType();
_left.translate(classGen, methodGen);
if (_type.identicalTo(ltype) == false) {
- _left.startResetIterator(classGen, methodGen);
+ _left.startIterator(classGen, methodGen);
ltype.translateTo(classGen, methodGen, _type);
}
}
1.14 +2 -2
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/CopyOf.java
Index: CopyOf.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/CopyOf.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- CopyOf.java 1 Apr 2003 21:08:59 -0000 1.13
+++ CopyOf.java 19 Dec 2003 15:26:48 -0000 1.14
@@ -132,7 +132,7 @@
// push NodeIterator
_select.translate(classGen, methodGen);
- _select.startResetIterator(classGen, methodGen);
+ _select.startIterator(classGen, methodGen);
// call copy from the DOM 'library'
il.append(methodGen.loadHandler());
1.18 +3 -3
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/DocumentCall.java
Index: DocumentCall.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/DocumentCall.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- DocumentCall.java 16 Apr 2003 20:58:24 -0000 1.17
+++ DocumentCall.java 19 Dec 2003 15:26:48 -0000 1.18
@@ -174,13 +174,13 @@
// The URI can be either a node-set or something else cast to a
string
_arg1.translate(classGen, methodGen);
if (_arg1Type == Type.NodeSet) {
- _arg1.startResetIterator(classGen, methodGen);
+ _arg1.startIterator(classGen, methodGen);
}
if (ac == 2) {
//_arg2 == null was tested in typeChec()
_arg2.translate(classGen, methodGen);
- _arg2.startResetIterator(classGen, methodGen);
+ _arg2.startIterator(classGen, methodGen);
}
// Feck the rest of the parameters on the stack
1.13 +5 -5
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/EqualityExpr.java
Index: EqualityExpr.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/EqualityExpr.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- EqualityExpr.java 30 Jan 2003 18:46:00 -0000 1.12
+++ EqualityExpr.java 19 Dec 2003 15:26:48 -0000 1.13
@@ -337,7 +337,7 @@
if (tleft instanceof NodeSetType && tright instanceof BooleanType) {
_left.translate(classGen, methodGen);
- _left.startResetIterator(classGen, methodGen);
+ _left.startIterator(classGen, methodGen);
Type.NodeSet.translateTo(classGen, methodGen, Type.Boolean);
_right.translate(classGen, methodGen);
@@ -351,7 +351,7 @@
if (tleft instanceof NodeSetType && tright instanceof StringType) {
_left.translate(classGen, methodGen);
- _left.startResetIterator(classGen, methodGen); // needed ?
+ _left.startIterator(classGen, methodGen); // needed ?
_right.translate(classGen, methodGen);
il.append(new PUSH(cpg, _op));
il.append(methodGen.loadDOM());
@@ -369,9 +369,9 @@
// Next, node-set/t for t in {real, string, node-set, result-tree}
_left.translate(classGen, methodGen);
- _left.startResetIterator(classGen, methodGen);
+ _left.startIterator(classGen, methodGen);
_right.translate(classGen, methodGen);
- _right.startResetIterator(classGen, methodGen);
+ _right.startIterator(classGen, methodGen);
// Cast a result tree to a string to use an existing compare
if (tright instanceof ResultTreeType) {
1.19 +12 -25
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Expression.java
Index: Expression.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Expression.java,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- Expression.java 11 Jun 2003 21:26:35 -0000 1.18
+++ Expression.java 19 Dec 2003 15:26:48 -0000 1.19
@@ -90,12 +90,6 @@
protected Type _type;
/**
- * True if this expression is of node-set type and its corresponding
- * iterator has been started or reset.
- */
- protected boolean _startReset = false;
-
- /**
* Instruction handles that comprise the true list.
*/
protected FlowList _trueList = new FlowList();
@@ -169,30 +163,23 @@
}
/**
- * Expects an object on the stack and if this object can be proven
- * to be a node iterator then the iterator is reset or started
- * depending on the type of this expression.
- * If this expression is a var reference then the iterator
- * is reset, otherwise it is started.
+ * If this expression is of type node-set and it is not a variable
+ * reference, then call setStartNode() passing the context node.
*/
- public void startResetIterator(ClassGenerator classGen,
+ public void startIterator(ClassGenerator classGen,
MethodGenerator methodGen) {
- final ConstantPoolGen cpg = classGen.getConstantPool();
- final InstructionList il = methodGen.getInstructionList();
-
- if (_startReset) {
- return; // already started
- }
- _startReset = true;
-
+ // Ignore if type is not node-set
if (_type instanceof NodeSetType == false) {
- return; // nothing to do
+ return;
}
+ // setStartNode() should not be called if expr is a variable ref
Expression expr = this;
- if (expr instanceof CastExpr)
- expr = ((CastExpr)expr).getExpr();
- if ( (expr instanceof VariableRefBase) == false ) {
+ if (expr instanceof CastExpr) {
+ expr = ((CastExpr) expr).getExpr();
+ }
+ if (expr instanceof VariableRefBase == false) {
+ final InstructionList il = methodGen.getInstructionList();
il.append(methodGen.loadContextNode());
il.append(methodGen.setStartNode());
}
1.9 +2 -2
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/FilterExpr.java
Index: FilterExpr.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/FilterExpr.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- FilterExpr.java 30 Jan 2003 18:46:00 -0000 1.8
+++ FilterExpr.java 19 Dec 2003 15:26:48 -0000 1.9
@@ -148,7 +148,7 @@
}
else {
_primary.translate(classGen, methodGen);
- _primary.startResetIterator(classGen, methodGen);
+ _primary.startIterator(classGen, methodGen);
}
}
1.17 +2 -2
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/ForEach.java
Index: ForEach.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/ForEach.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- ForEach.java 1 Apr 2003 21:08:59 -0000 1.16
+++ ForEach.java 19 Dec 2003 15:26:48 -0000 1.17
@@ -177,7 +177,7 @@
}
if (_type instanceof ReferenceType == false) {
- _select.startResetIterator(classGen, methodGen);
+ _select.startIterator(classGen, methodGen);
}
}
1.33 +4 -4
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/FunctionCall.java
Index: FunctionCall.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/FunctionCall.java,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- FunctionCall.java 17 Oct 2003 17:15:15 -0000 1.32
+++ FunctionCall.java 19 Dec 2003 15:26:48 -0000 1.33
@@ -741,7 +741,7 @@
for (int i = 0; i < n; i++) {
final Expression exp = argument(i);
exp.translate(classGen, methodGen);
- exp.startResetIterator(classGen, methodGen);
+ exp.startIterator(classGen, methodGen);
}
// append "F" to the function's name
@@ -788,7 +788,7 @@
final Expression exp = argument(i);
exp.translate(classGen, methodGen);
// Convert the argument to its Java type
- exp.startResetIterator(classGen, methodGen);
+ exp.startIterator(classGen, methodGen);
exp.getType().translateTo(classGen, methodGen, paramTypes[i]);
}
@@ -824,7 +824,7 @@
final Expression exp = argument(i);
exp.translate(classGen, methodGen);
// Convert the argument to its Java type
- exp.startResetIterator(classGen, methodGen);
+ exp.startIterator(classGen, methodGen);
exp.getType().translateTo(classGen, methodGen, paramTypes[i]);
}
1.16 +2 -2
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Key.java
Index: Key.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Key.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- Key.java 1 Apr 2003 21:08:59 -0000 1.15
+++ Key.java 19 Dec 2003 15:26:48 -0000 1.16
@@ -205,7 +205,7 @@
// Overwrite current iterator with one that gives us only what we want
_use.translate(classGen, methodGen);
- _use.startResetIterator(classGen, methodGen);
+ _use.startIterator(classGen, methodGen);
il.append(methodGen.storeIterator());
final BranchHandle nextNode = il.append(new GOTO(null));
1.14 +2 -2
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/KeyCall.java
Index: KeyCall.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/KeyCall.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- KeyCall.java 1 Apr 2003 21:08:59 -0000 1.13
+++ KeyCall.java 19 Dec 2003 15:26:48 -0000 1.14
@@ -280,7 +280,7 @@
// Get new iterator from 2nd parameter node-set & store in variable
_value.translate(classGen, methodGen);
- _value.startResetIterator(classGen, methodGen);
+ _value.startIterator(classGen, methodGen);
il.append(methodGen.storeIterator());
// Create the KeyIndex object (the iterator) we'll return
1.11 +2 -2
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/NameBase.java
Index: NameBase.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/NameBase.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- NameBase.java 1 Apr 2003 21:08:59 -0000 1.10
+++ NameBase.java 19 Dec 2003 15:26:48 -0000 1.11
@@ -159,7 +159,7 @@
// Function was called with node-set parameter
else {
_param.translate(classGen, methodGen);
- _param.startResetIterator(classGen, methodGen);
+ _param.startIterator(classGen, methodGen);
il.append(methodGen.nextNode());
}
}
1.5 +2 -2
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/NumberCall.java
Index: NumberCall.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/NumberCall.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- NumberCall.java 30 Jan 2003 18:46:01 -0000 1.4
+++ NumberCall.java 19 Dec 2003 15:26:48 -0000 1.5
@@ -95,7 +95,7 @@
else {
final Expression arg = argument();
arg.translate(classGen, methodGen);
- arg.startResetIterator(classGen, methodGen);
+ arg.startIterator(classGen, methodGen);
targ = arg.getType();
}
1.18 +3 -3
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/RelationalExpr.java
Index: RelationalExpr.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/RelationalExpr.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- RelationalExpr.java 15 Oct 2003 21:01:51 -0000 1.17
+++ RelationalExpr.java 19 Dec 2003 15:26:48 -0000 1.18
@@ -241,9 +241,9 @@
// Call compare() from the BasisLibrary
_left.translate(classGen, methodGen);
- _left.startResetIterator(classGen, methodGen);
+ _left.startIterator(classGen, methodGen);
_right.translate(classGen, methodGen);
- _right.startResetIterator(classGen, methodGen);
+ _right.startIterator(classGen, methodGen);
il.append(new PUSH(cpg, _op));
il.append(methodGen.loadDOM());
1.6 +2 -2
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/StringCall.java
Index: StringCall.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/StringCall.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- StringCall.java 30 Jan 2003 18:46:02 -0000 1.5
+++ StringCall.java 19 Dec 2003 15:26:48 -0000 1.6
@@ -101,7 +101,7 @@
else {
final Expression arg = argument();
arg.translate(classGen, methodGen);
- arg.startResetIterator(classGen, methodGen);
+ arg.startIterator(classGen, methodGen);
targ = arg.getType();
}
1.20 +2 -2
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/VariableBase.java
Index: VariableBase.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/VariableBase.java,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- VariableBase.java 25 Jun 2003 17:08:31 -0000 1.19
+++ VariableBase.java 19 Dec 2003 15:26:48 -0000 1.20
@@ -306,7 +306,7 @@
il.append(new INVOKESPECIAL(initCNI));
}
- _select.startResetIterator(classGen, methodGen);
+ _select.startIterator(classGen, methodGen);
}
// If not, compile result tree from parameter body if present.
else if (hasContents()) {
1.14 +2 -2
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/WithParam.java
Index: WithParam.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/WithParam.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- WithParam.java 23 Jun 2003 18:23:15 -0000 1.13
+++ WithParam.java 19 Dec 2003 15:26:48 -0000 1.14
@@ -164,7 +164,7 @@
// Compile expression is 'select' attribute if present
if (_select != null) {
_select.translate(classGen, methodGen);
- _select.startResetIterator(classGen, methodGen);
+ _select.startIterator(classGen, methodGen);
}
// If not, compile result tree from parameter body if present.
else if (hasContents()) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]