morten 01/11/05 07:47:35
Modified: java/src/org/apache/xalan/xsltc DOM.java
java/src/org/apache/xalan/xsltc/compiler PositionCall.java
StepPattern.java
java/src/org/apache/xalan/xsltc/dom DOMAdapter.java
DOMImpl.java MultiDOM.java NodeSortRecord.java
Removed: java/src/org/apache/xalan/xsltc/compiler Mode.java.old
Log:
Fix for patterns on the format "/foo/*/bar" and "/foo/*[n]/bar".
PR: bugzilla 4604
Obtained from: n/a
Submitted by: [EMAIL PROTECTED]
Reviewed by: [EMAIL PROTECTED]
Revision Changes Path
1.8 +3 -1 xml-xalan/java/src/org/apache/xalan/xsltc/DOM.java
Index: DOM.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/DOM.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- DOM.java 2001/10/16 10:58:59 1.7
+++ DOM.java 2001/11/05 15:47:34 1.8
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: DOM.java,v 1.7 2001/10/16 10:58:59 morten Exp $
+ * @(#)$Id: DOM.java,v 1.8 2001/11/05 15:47:34 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -129,4 +129,6 @@
public int getTypedLast(int type, int node);
public void setFilter(StripFilter filter);
public void setupMapping(String[] names, String[] namespaces);
+ public boolean isElement(final int node);
+ public boolean isAttribute(final int node);
}
1.6 +3 -5
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.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- PositionCall.java 2001/11/02 11:31:28 1.5
+++ PositionCall.java 2001/11/05 15:47:34 1.6
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: PositionCall.java,v 1.5 2001/11/02 11:31:28 morten Exp $
+ * @(#)$Id: PositionCall.java,v 1.6 2001/11/05 15:47:34 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -93,8 +93,6 @@
// type of node we want to be looking for
if ((parent instanceof Expression) && (granny instanceof Predicate)) {
_type = ((Predicate)granny).getPosType();
- if ((_type == DOM.ELEMENT) || (_type == DOM.ATTRIBUTE))
- _type = -1;
}
else {
while ((granny != null) && !(granny instanceof StepPattern)) {
@@ -102,7 +100,7 @@
granny = granny.getParent();
}
if ((parent instanceof Predicate) &&
- (granny instanceof StepPattern)){
+ (granny instanceof StepPattern)){
_type = ((StepPattern)granny).getNodeType();
}
}
@@ -123,7 +121,7 @@
}
else {
final ConstantPoolGen cpg = classGen.getConstantPool();
- // public int getTypedPosition(NodeIterator iterator, int type) {
+ // public int getTypedPosition(int type, int node)
final int pos = cpg.addInterfaceMethodref(DOM_INTF,
"getTypedPosition",
"(II)I");
1.10 +24 -8
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.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- StepPattern.java 2001/10/31 07:29:38 1.9
+++ StepPattern.java 2001/11/05 15:47:34 1.10
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: StepPattern.java,v 1.9 2001/10/31 07:29:38 morten Exp $
+ * @(#)$Id: StepPattern.java,v 1.10 2001/11/05 15:47:34 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -208,13 +208,29 @@
final ConstantPoolGen cpg = classGen.getConstantPool();
final InstructionList il = methodGen.getInstructionList();
- if ((_nodeType == DOM.ELEMENT) && (hasPredicates())) {
- // TODO: insert check to see if current node is element
- il.append(POP);
- }
- else if ((_nodeType == DOM.ATTRIBUTE) && (hasPredicates())) {
- // TODO: insert check to see if current node is attribute
- il.append(POP);
+ if (_nodeType == DOM.ELEMENT) {
+ final int check = cpg.addInterfaceMethodref(DOM_INTF,
+ "isElement", "(I)Z");
+ il.append(methodGen.loadDOM());
+ il.append(SWAP);
+ il.append(new INVOKEINTERFACE(check, 2));
+
+ // Need to allow for long jumps here
+ final BranchHandle icmp = il.append(new IFNE(null));
+ _falseList.add(il.append(new GOTO_W(null)));
+ icmp.setTarget(il.append(NOP));
+ }
+ else if (_nodeType == DOM.ATTRIBUTE) {
+ final int check = cpg.addInterfaceMethodref(DOM_INTF,
+ "isAttribute", "(I)Z");
+ il.append(methodGen.loadDOM());
+ il.append(SWAP);
+ il.append(new INVOKEINTERFACE(check, 2));
+
+ // Need to allow for long jumps here
+ final BranchHandle icmp = il.append(new IFNE(null));
+ _falseList.add(il.append(new GOTO_W(null)));
+ icmp.setTarget(il.append(NOP));
}
else {
// context node is on the stack
1.10 +9 -1
xml-xalan/java/src/org/apache/xalan/xsltc/dom/DOMAdapter.java
Index: DOMAdapter.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/DOMAdapter.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- DOMAdapter.java 2001/10/16 10:58:59 1.9
+++ DOMAdapter.java 2001/11/05 15:47:34 1.10
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: DOMAdapter.java,v 1.9 2001/10/16 10:58:59 morten Exp $
+ * @(#)$Id: DOMAdapter.java,v 1.10 2001/11/05 15:47:34 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -264,6 +264,14 @@
public String getDocumentURI(int node) {
return(_domImpl.getDocumentURI());
+ }
+
+ public boolean isElement(final int node) {
+ return(_domImpl.isElement(node));
+ }
+
+ public boolean isAttribute(final int node) {
+ return(_domImpl.isAttribute(node));
}
}
1.58 +50 -5
xml-xalan/java/src/org/apache/xalan/xsltc/dom/DOMImpl.java
Index: DOMImpl.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/DOMImpl.java,v
retrieving revision 1.57
retrieving revision 1.58
diff -u -r1.57 -r1.58
--- DOMImpl.java 2001/11/05 11:27:04 1.57
+++ DOMImpl.java 2001/11/05 15:47:35 1.58
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: DOMImpl.java,v 1.57 2001/11/05 11:27:04 morten Exp $
+ * @(#)$Id: DOMImpl.java,v 1.58 2001/11/05 15:47:35 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -172,13 +172,20 @@
/**
* Returns 'true' if a specific node is an element (of any type)
*/
- private boolean isElement(final int node) {
+ public boolean isElement(final int node) {
final int type = _type[node];
- if ((node < _firstAttributeNode) && (type >= NTYPES)) return true;
- return false;
+ return ((node < _firstAttributeNode) && (type >= NTYPES));
}
/**
+ * Returns 'true' if a specific node is an element (of any type)
+ */
+ public boolean isAttribute(final int node) {
+ final int type = _type[node];
+ return ((node >= _firstAttributeNode) && (type >= NTYPES));
+ }
+
+ /**
* Returns the number of nodes in the tree (used for indexing)
*/
public int getSize() {
@@ -1803,12 +1810,50 @@
return _parent[node];
}
+ public int getElementPosition(int node) {
+ // Initialize with the first sbiling of the current node
+ int match = 0;
+ int curr = _offsetOrChild[_parent[node]];
+ if (isElement(curr)) match++;
+
+ // Then traverse all other siblings up until the current node
+ while (curr != node) {
+ curr = _nextSibling[curr];
+ if (isElement(curr)) match++;
+ }
+
+ // And finally return number of matches
+ return match;
+ }
+
+ public int getAttributePosition(int attr) {
+ // Initialize with the first sbiling of the current node
+ int match = 1;
+ int curr = _lengthOrAttr[_parent[attr]];
+
+ // Then traverse all other siblings up until the current node
+ while (curr != attr) {
+ curr = _nextSibling[curr];
+ match++;
+ }
+
+ // And finally return number of matches
+ return match;
+ }
+
/**
* Returns a node's position amongst other nodes of the same type
*/
public int getTypedPosition(int type, int node) {
// Just return the basic position if no type is specified
- if (type == -1) type = _type[node];
+ switch(type) {
+ case ELEMENT:
+ return getElementPosition(node);
+ case ATTRIBUTE:
+ return getAttributePosition(node);
+ case -1:
+ type = _type[node];
+ }
// Initialize with the first sbiling of the current node
int match = 0;
1.13 +10 -1
xml-xalan/java/src/org/apache/xalan/xsltc/dom/MultiDOM.java
Index: MultiDOM.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/MultiDOM.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- MultiDOM.java 2001/10/30 15:49:32 1.12
+++ MultiDOM.java 2001/11/05 15:47:35 1.13
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: MultiDOM.java,v 1.12 2001/10/30 15:49:32 morten Exp $
+ * @(#)$Id: MultiDOM.java,v 1.13 2001/11/05 15:47:35 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -433,4 +433,13 @@
public String getDocumentURI(int node) {
return _adapters[node>>>24].getDocumentURI(0);
}
+
+ public boolean isElement(final int node) {
+ return(_adapters[node>>>24].isElement(node & CLR));
+ }
+
+ public boolean isAttribute(final int node) {
+ return(_adapters[node>>>24].isAttribute(node & CLR));
+ }
+
}
1.7 +2 -2
xml-xalan/java/src/org/apache/xalan/xsltc/dom/NodeSortRecord.java
Index: NodeSortRecord.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/NodeSortRecord.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- NodeSortRecord.java 2001/11/05 13:51:58 1.6
+++ NodeSortRecord.java 2001/11/05 15:47:35 1.7
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: NodeSortRecord.java,v 1.6 2001/11/05 13:51:58 morten Exp $
+ * @(#)$Id: NodeSortRecord.java,v 1.7 2001/11/05 15:47:35 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -82,8 +82,8 @@
public static int COMPARE_DESCENDING = 1;
protected static Collator _collator = Collator.getInstance();
- protected static int _levels = 1;
+ protected static int _levels = 1;
protected int[] _compareType;
protected int[] _sortOrder;
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]