You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by sa...@apache.org on 2002/05/06 22:34:17 UTC
cvs commit: xml-xalan/java/src/org/apache/xalan/xsltc/compiler AbsolutePathPattern.java AncestorPattern.java ParentPattern.java
santiagopg 02/05/06 13:34:17
Modified: java/src/org/apache/xalan/xsltc/compiler
AbsolutePathPattern.java AncestorPattern.java
ParentPattern.java
Log:
Fix for Bugzilla 2836 (modes15).
Revision Changes Path
1.6 +20 -7 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/AbsolutePathPattern.java
Index: AbsolutePathPattern.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/AbsolutePathPattern.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- AbsolutePathPattern.java 1 Feb 2002 20:07:08 -0000 1.5
+++ AbsolutePathPattern.java 6 May 2002 20:34:17 -0000 1.6
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: AbsolutePathPattern.java,v 1.5 2002/02/01 20:07:08 tmiller Exp $
+ * @(#)$Id: AbsolutePathPattern.java,v 1.6 2002/05/06 20:34:17 santiagopg Exp $
*
* The Apache Software License, Version 1.1
*
@@ -123,31 +123,44 @@
else {
_left.translate(classGen, methodGen);
}
- _trueList.append(_left._trueList);
- _falseList.append(_left._falseList);
}
+
final int getParent = cpg.addInterfaceMethodref(DOM_INTF,
GET_PARENT,
GET_PARENT_SIG);
final int getType = cpg.addInterfaceMethodref(DOM_INTF,
"getType", "(I)I");
- il.append(methodGen.loadDOM());
+
+ InstructionHandle begin = il.append(methodGen.loadDOM());
il.append(SWAP);
il.append(new INVOKEINTERFACE(getParent, 2));
- if (_left instanceof AncestorPattern) {
+ if (_left instanceof AncestorPattern) {
il.append(methodGen.loadDOM());
il.append(SWAP);
}
il.append(new INVOKEINTERFACE(getType, 2));
il.append(new PUSH(cpg, DOM.ROOT));
- // long jump: _falseList.add(il.append(new IF_ICMPNE(null)));
final BranchHandle skip = il.append(new IF_ICMPEQ(null));
_falseList.add(il.append(new GOTO_W(null)));
skip.setTarget(il.append(NOP));
+
+ if (_left != null) {
+ _left.backPatchTrueList(begin);
+
+ /*
+ * If _left is an ancestor pattern, backpatch this pattern's false
+ * list to the loop that searches for more ancestors.
+ */
+ if (_left instanceof AncestorPattern) {
+ final AncestorPattern ancestor = (AncestorPattern) _left;
+ _falseList.backPatch(ancestor.getLoopHandle()); // clears list
+ }
+ _falseList.append(_left._falseList);
+ }
}
public String toString() {
- return "absolutePathPattern(" + (_left!=null ? _left.toString() : ")");
+ return "absolutePathPattern(" + (_left != null ? _left.toString() : ")");
}
}
1.6 +31 -15 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/AncestorPattern.java
Index: AncestorPattern.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/AncestorPattern.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- AncestorPattern.java 6 May 2002 13:53:22 -0000 1.5
+++ AncestorPattern.java 6 May 2002 20:34:17 -0000 1.6
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: AncestorPattern.java,v 1.5 2002/05/06 13:53:22 santiagopg Exp $
+ * @(#)$Id: AncestorPattern.java,v 1.6 2002/05/06 20:34:17 santiagopg Exp $
*
* The Apache Software License, Version 1.1
*
@@ -69,8 +69,10 @@
import org.apache.xalan.xsltc.compiler.util.*;
final class AncestorPattern extends RelativePathPattern {
+
private final Pattern _left; // may be null
private final RelativePathPattern _right;
+ private InstructionHandle _loop;
public AncestorPattern(RelativePathPattern right) {
this(null, right);
@@ -84,6 +86,10 @@
}
}
+ public InstructionHandle getLoopHandle() {
+ return _loop;
+ }
+
public void setParser(Parser parser) {
super.setParser(parser);
if (_left != null) {
@@ -94,7 +100,6 @@
public boolean isWildcard() {
//!!! can be wildcard
- // return _right.isWildcard();
return false;
}
@@ -114,12 +119,16 @@
}
public void translate(ClassGenerator classGen, MethodGenerator methodGen) {
- InstructionHandle loop, eloop;
+ InstructionHandle parent;
final ConstantPoolGen cpg = classGen.getConstantPool();
final InstructionList il = methodGen.getInstructionList();
+
+ /*
+ * The scope of this local var must be the entire method since
+ * a another pattern may decide to jump back into the loop
+ */
final LocalVariableGen local =
- methodGen.addLocalVariable2("app",
- Util.getJCRefType(NODE_SIG),
+ methodGen.addLocalVariable2("app", Util.getJCRefType(NODE_SIG),
il.getEnd());
final org.apache.bcel.generic.Instruction loadLocal =
@@ -147,7 +156,7 @@
final int getParent = cpg.addInterfaceMethodref(DOM_INTF,
GET_PARENT,
GET_PARENT_SIG);
- loop = il.append(new INVOKEINTERFACE(getParent, 2));
+ parent = il.append(new INVOKEINTERFACE(getParent, 2));
il.append(DUP);
il.append(storeLocal);
@@ -156,11 +165,10 @@
_left.translate(classGen, methodGen);
-
final SyntaxTreeNode p = getParent();
- if ((p == null) ||
- (p instanceof Instruction) ||
- (p instanceof TopLevelElement)) {
+ if (p == null || p instanceof Instruction ||
+ p instanceof TopLevelElement)
+ {
// do nothing
}
else {
@@ -168,19 +176,27 @@
}
final BranchHandle exit = il.append(new GOTO(null));
- eloop = il.append(methodGen.loadDOM());
+ _loop = il.append(methodGen.loadDOM());
il.append(loadLocal);
- local.setEnd(eloop);
- il.append(new GOTO(loop));
+ local.setEnd(_loop);
+ il.append(new GOTO(parent));
exit.setTarget(il.append(NOP));
- _left.backPatchFalseList(eloop);
+ _left.backPatchFalseList(_loop);
_trueList.append(_left._trueList);
}
else {
il.append(POP2);
}
- methodGen.removeLocalVariable(local);
+
+ /*
+ * If _right is an ancestor pattern, backpatch this pattern's false
+ * list to the loop that searches for more ancestors.
+ */
+ if (_right instanceof AncestorPattern) {
+ final AncestorPattern ancestor = (AncestorPattern) _right;
+ _falseList.backPatch(ancestor.getLoopHandle()); // clears list
+ }
_trueList.append(_right._trueList);
_falseList.append(_right._falseList);
1.5 +13 -6 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/ParentPattern.java
Index: ParentPattern.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/ParentPattern.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- ParentPattern.java 6 May 2002 13:53:22 -0000 1.4
+++ ParentPattern.java 6 May 2002 20:34:17 -0000 1.5
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: ParentPattern.java,v 1.4 2002/05/06 13:53:22 santiagopg Exp $
+ * @(#)$Id: ParentPattern.java,v 1.5 2002/05/06 20:34:17 santiagopg Exp $
*
* The Apache Software License, Version 1.1
*
@@ -117,8 +117,6 @@
il.append(SWAP);
}
else if (_right instanceof StepPattern) {
- //!!! check this
-
il.append(DUP);
il.append(storeLocal);
@@ -142,9 +140,9 @@
il.append(new INVOKEINTERFACE(getParent, 2));
final SyntaxTreeNode p = getParent();
- if ((p == null) ||
- (p instanceof Instruction) ||
- (p instanceof TopLevelElement)) {
+ if (p == null || p instanceof Instruction ||
+ p instanceof TopLevelElement)
+ {
_left.translate(classGen, methodGen);
}
else {
@@ -159,6 +157,15 @@
methodGen.removeLocalVariable(local);
+ /*
+ * If _right is an ancestor pattern, backpatch _left false
+ * list to the loop that searches for more ancestors.
+ */
+ if (_right instanceof AncestorPattern) {
+ final AncestorPattern ancestor = (AncestorPattern) _right;
+ _left.backPatchFalseList(ancestor.getLoopHandle()); // clears list
+ }
+
_trueList.append(_right._trueList.append(_left._trueList));
_falseList.append(_right._falseList.append(_left._falseList));
}
---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org