You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by mo...@apache.org on 2001/11/06 14:42:05 UTC
cvs commit: xml-xalan/java/src/org/apache/xalan/xsltc/compiler BinOpExpr.java CastExpr.java EqualityExpr.java Expression.java LastCall.java LogicalExpr.java PositionCall.java Predicate.java RelationalExpr.java Step.java StepPattern.java UnaryOpExpr.java
morten 01/11/06 05:42:05
Modified: java/src/org/apache/xalan/xsltc/compiler BinOpExpr.java
CastExpr.java EqualityExpr.java Expression.java
LastCall.java LogicalExpr.java PositionCall.java
Predicate.java RelationalExpr.java Step.java
StepPattern.java UnaryOpExpr.java
Log:
Fix for compound predicates used in patterns.
Obtained from: n/a
Submitted by: morten@xml.apache.org
Reviewed by: morten@xml.apache.org
Revision Changes Path
1.6 +11 -1 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/BinOpExpr.java
Index: BinOpExpr.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/BinOpExpr.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- BinOpExpr.java 2001/10/30 08:42:55 1.5
+++ BinOpExpr.java 2001/11/06 13:42:04 1.6
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: BinOpExpr.java,v 1.5 2001/10/30 08:42:55 morten Exp $
+ * @(#)$Id: BinOpExpr.java,v 1.6 2001/11/06 13:42:04 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -85,6 +85,16 @@
_op = op;
(_left = left).setParent(this);
(_right = right).setParent(this);
+ }
+
+ /**
+ * Returns true if this expressions contains a call to position(). This is
+ * needed for context changes in node steps containing multiple predicates.
+ */
+ public boolean hasPositionCall() {
+ if (_left.hasPositionCall()) return true;
+ if (_right.hasPositionCall()) return true;
+ return false;
}
public void setParser(Parser parser) {
1.7 +9 -1 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.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- CastExpr.java 2001/10/09 12:08:09 1.6
+++ CastExpr.java 2001/11/06 13:42:04 1.7
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: CastExpr.java,v 1.6 2001/10/09 12:08:09 morten Exp $
+ * @(#)$Id: CastExpr.java,v 1.7 2001/11/06 13:42:04 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -160,6 +160,14 @@
public Expression getExpr() {
return _left;
+ }
+
+ /**
+ * Returns true if this expressions contains a call to position(). This is
+ * needed for context changes in node steps containing multiple predicates.
+ */
+ public boolean hasPositionCall() {
+ return(_left.hasPositionCall());
}
public String toString() {
1.6 +11 -1 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.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- EqualityExpr.java 2001/07/30 13:35:40 1.5
+++ EqualityExpr.java 2001/11/06 13:42:04 1.6
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: EqualityExpr.java,v 1.5 2001/07/30 13:35:40 morten Exp $
+ * @(#)$Id: EqualityExpr.java,v 1.6 2001/11/06 13:42:04 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -105,6 +105,16 @@
return false;
else
return true;
+ }
+
+ /**
+ * Returns true if this expressions contains a call to position(). This is
+ * needed for context changes in node steps containing multiple predicates.
+ */
+ public boolean hasPositionCall() {
+ if (_left.hasPositionCall()) return true;
+ if (_right.hasPositionCall()) return true;
+ return false;
}
private void swapArguments() {
1.8 +5 -1 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.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- Expression.java 2001/10/30 08:42:55 1.7
+++ Expression.java 2001/11/06 13:42:04 1.8
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: Expression.java,v 1.7 2001/10/30 08:42:55 morten Exp $
+ * @(#)$Id: Expression.java,v 1.8 2001/11/06 13:42:04 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -101,6 +101,10 @@
}
public abstract String toString();
+
+ public boolean hasPositionCall() {
+ return true;
+ }
/**
* Type check all the children of this node.
1.5 +5 -1 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/LastCall.java
Index: LastCall.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/LastCall.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- LastCall.java 2001/09/21 09:39:38 1.4
+++ LastCall.java 2001/11/06 13:42:04 1.5
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: LastCall.java,v 1.4 2001/09/21 09:39:38 morten Exp $
+ * @(#)$Id: LastCall.java,v 1.5 2001/11/06 13:42:04 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -80,6 +80,10 @@
public LastCall(QName fname, int type) {
this(fname);
_type = type;
+ }
+
+ public boolean hasPositionCall() {
+ return true;
}
public void translate(ClassGenerator classGen, MethodGenerator methodGen) {
1.8 +11 -1 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/LogicalExpr.java
Index: LogicalExpr.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/LogicalExpr.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- LogicalExpr.java 2001/10/22 09:33:38 1.7
+++ LogicalExpr.java 2001/11/06 13:42:04 1.8
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: LogicalExpr.java,v 1.7 2001/10/22 09:33:38 morten Exp $
+ * @(#)$Id: LogicalExpr.java,v 1.8 2001/11/06 13:42:04 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -89,6 +89,16 @@
_op = op;
(_left = left).setParent(this);
(_right = right).setParent(this);
+ }
+
+ /**
+ * Returns true if this expressions contains a call to position(). This is
+ * needed for context changes in node steps containing multiple predicates.
+ */
+ public boolean hasPositionCall() {
+ if (_left.hasPositionCall()) return true;
+ if (_right.hasPositionCall()) return true;
+ return false;
}
/**
1.7 +5 -1 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/PositionCall.java
Index: PositionCall.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/PositionCall.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- PositionCall.java 2001/11/05 15:47:34 1.6
+++ PositionCall.java 2001/11/06 13:42:04 1.7
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: PositionCall.java,v 1.6 2001/11/05 15:47:34 morten Exp $
+ * @(#)$Id: PositionCall.java,v 1.7 2001/11/06 13:42:04 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -80,6 +80,10 @@
public PositionCall(QName fname, int type) {
this(fname);
_type = type;
+ }
+
+ public boolean hasPositionCall() {
+ return true;
}
public void translate(ClassGenerator classGen, MethodGenerator methodGen) {
1.16 +40 -12 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Predicate.java
Index: Predicate.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Predicate.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- Predicate.java 2001/11/01 09:27:24 1.15
+++ Predicate.java 2001/11/06 13:42:04 1.16
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: Predicate.java,v 1.15 2001/11/01 09:27:24 morten Exp $
+ * @(#)$Id: Predicate.java,v 1.16 2001/11/06 13:42:04 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -78,6 +78,7 @@
private String _className; // Name of filter to generate
private boolean _nthPositionFilter = false;
private boolean _nthDescendant = false;
+ private boolean _canOptimize = true;
private int _ptype = -1;
public Predicate(Expression exp) {
@@ -96,7 +97,11 @@
public boolean isNthPositionFilter() {
return _nthPositionFilter;
}
-
+
+ public void dontOptimize() {
+ _canOptimize = false;
+ }
+
protected final boolean isClosureBoundary() {
return true;
}
@@ -177,10 +182,12 @@
_exp = new CastExpr(_exp, Type.Int);
}
+ SyntaxTreeNode parent = getParent();
+
// Expand [last()] into [position() = last()]
if ((_exp instanceof LastCall) ||
- (getParent() instanceof Pattern) ||
- (getParent() instanceof FilterExpr)) {
+ (parent instanceof Pattern) ||
+ (parent instanceof FilterExpr)) {
final QName position = getParser().getQName("position");
final PositionCall positionCall = new PositionCall(position);
@@ -191,12 +198,14 @@
if (_exp.typeCheck(stable) != Type.Boolean) {
_exp = new CastExpr(_exp, Type.Boolean);
}
- _nthPositionFilter = false;
+ if (parent instanceof Pattern)
+ _nthPositionFilter = true;
+ else
+ _nthPositionFilter = false;
return _type = Type.Boolean;
}
// Use NthPositionIterator to handle [position()] or [a]
else {
- SyntaxTreeNode parent = getParent();
if ((parent != null) && (parent instanceof Step)) {
parent = parent.getParent();
if ((parent != null) &&
@@ -210,8 +219,12 @@
return _type = Type.NodeSet;
}
}
+ else if (texp instanceof BooleanType) {
+ if (_exp.hasPositionCall())
+ _nthPositionFilter = true;
+ }
// All other types will be handled as boolean values
- else if (texp instanceof BooleanType == false) {
+ else {
_exp = new CastExpr(_exp, Type.Boolean);
}
_nthPositionFilter = false;
@@ -306,6 +319,7 @@
* very common in many stylesheets
*/
public boolean isNodeValueTest() {
+ if (!_canOptimize) return false;
if ((getStep() != null) && (getCompareValue() != null))
return true;
else
@@ -396,11 +410,25 @@
il.append(new PUSH(cpg, ((EqualityExpr)_exp).getOp()));
}
else {
- compileFilter(classGen, methodGen);
- il.append(new NEW(cpg.addClass(_className)));
- il.append(DUP);
- il.append(new INVOKESPECIAL(cpg.addMethodref(_className,
- "<init>", "()V")));
+ translateFilter(classGen, methodGen);
}
+ }
+
+ /**
+ * Translate a predicate expression. This translation pushes
+ * two references on the stack: a reference to a newly created
+ * filter object and a reference to the predicate's closure.
+ */
+ public void translateFilter(ClassGenerator classGen,
+ MethodGenerator methodGen) {
+
+ final ConstantPoolGen cpg = classGen.getConstantPool();
+ final InstructionList il = methodGen.getInstructionList();
+
+ compileFilter(classGen, methodGen);
+ il.append(new NEW(cpg.addClass(_className)));
+ il.append(DUP);
+ il.append(new INVOKESPECIAL(cpg.addMethodref(_className,
+ "<init>", "()V")));
}
}
1.11 +12 -2 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.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- RelationalExpr.java 2001/10/30 08:42:55 1.10
+++ RelationalExpr.java 2001/11/06 13:42:04 1.11
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: RelationalExpr.java,v 1.10 2001/10/30 08:42:55 morten Exp $
+ * @(#)$Id: RelationalExpr.java,v 1.11 2001/11/06 13:42:04 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -84,7 +84,17 @@
_left.setParser(parser);
_right.setParser(parser);
}
-
+
+ /**
+ * Returns true if this expressions contains a call to position(). This is
+ * needed for context changes in node steps containing multiple predicates.
+ */
+ public boolean hasPositionCall() {
+ if (_left.hasPositionCall()) return true;
+ if (_right.hasPositionCall()) return true;
+ return false;
+ }
+
public boolean hasReferenceArgs() {
return _left.getType() instanceof ReferenceType ||
_right.getType() instanceof ReferenceType;
1.27 +3 -2 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Step.java
Index: Step.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Step.java,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- Step.java 2001/11/05 18:47:51 1.26
+++ Step.java 2001/11/06 13:42:04 1.27
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: Step.java,v 1.26 2001/11/05 18:47:51 morten Exp $
+ * @(#)$Id: Step.java,v 1.27 2001/11/06 13:42:04 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -489,7 +489,7 @@
il.append(new NEW(cpg.addClass(CURRENT_NODE_LIST_ITERATOR)));
il.append(DUP);
translatePredicates(classGen, methodGen); // recursive call
- predicate.translate(classGen, methodGen);
+ predicate.translateFilter(classGen, methodGen);
il.append(methodGen.loadCurrentNode());
il.append(classGen.loadTranslet());
@@ -504,6 +504,7 @@
// See CurrentNodeListIterator's constructor(s) for details.
SyntaxTreeNode parent = getParent();
while (!(parent instanceof Template)) {
+ if (parent == null) break;
if (parent instanceof ApplyTemplates) {
idx = cpg.addMethodref(CURRENT_NODE_LIST_ITERATOR,
"forceNaturalOrder",
1.11 +7 -5 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/StepPattern.java
Index: StepPattern.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/StepPattern.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- StepPattern.java 2001/11/05 15:47:34 1.10
+++ StepPattern.java 2001/11/06 13:42:04 1.11
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: StepPattern.java,v 1.10 2001/11/05 15:47:34 morten Exp $
+ * @(#)$Id: StepPattern.java,v 1.11 2001/11/06 13:42:04 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -158,9 +158,9 @@
boolean noContext = true;
final int n = _predicates.size();
for (int i = 0; i < n && noContext; i++) {
- final Predicate exp = (Predicate)_predicates.elementAt(i);
- if (exp.isNthPositionFilter())
- noContext = false;
+ final Predicate pred = (Predicate)_predicates.elementAt(i);
+ final Expression exp = pred.getExpr();
+ if (exp.hasPositionCall()) noContext = false;
}
if (noContext) {
@@ -195,6 +195,9 @@
_step.typeCheck(stable);
}
else if (_contextCase == GENERAL_CONTEXT) {
+ final int len = _predicates.size();
+ for (int i = 0; i < len; i++)
+ ((Predicate)_predicates.elementAt(i)).dontOptimize();
_step = new Step(_axis, _nodeType, _predicates);
_step.setParser(getParser());
_step.typeCheck(stable);
@@ -336,7 +339,6 @@
il.append(methodGen.storeIterator());
il.append(new ILOAD(match.getIndex()));
il.append(methodGen.storeCurrentNode());
-
// Translate the expression of the predicate
Predicate pred = (Predicate) _predicates.elementAt(0);
1.3 +9 -1 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/UnaryOpExpr.java
Index: UnaryOpExpr.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/UnaryOpExpr.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- UnaryOpExpr.java 2001/06/06 10:45:36 1.2
+++ UnaryOpExpr.java 2001/11/06 13:42:04 1.3
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: UnaryOpExpr.java,v 1.2 2001/06/06 10:45:36 morten Exp $
+ * @(#)$Id: UnaryOpExpr.java,v 1.3 2001/11/06 13:42:04 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -72,6 +72,14 @@
public UnaryOpExpr(Expression left) {
(_left = left).setParent(this);
+ }
+
+ /**
+ * Returns true if this expressions contains a call to position(). This is
+ * needed for context changes in node steps containing multiple predicates.
+ */
+ public boolean hasPositionCall() {
+ return(_left.hasPositionCall());
}
public void setParser(Parser parser) {
---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org