jycli 2005/02/04 10:26:12
Modified: java/src/org/apache/xalan/xsltc/compiler Number.java
java/src/org/apache/xalan/xsltc/dom AnyNodeCounter.java
MultipleNodeCounter.java NodeCounter.java
SingleNodeCounter.java
Log:
Implement Errata E24 for XSLTC, when the value attribute of xsl:number is
NaN, infinite or less than 0.5. More details please refer to bug report
XALANJ-1979.
Patch is reviewed by Morris Kwan ([EMAIL PROTECTED])
Revision Changes Path
1.15 +7 -6
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Number.java
Index: Number.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Number.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- Number.java 24 Feb 2004 02:58:42 -0000 1.14
+++ Number.java 4 Feb 2005 18:26:12 -0000 1.15
@@ -34,7 +34,7 @@
import org.apache.bcel.generic.INVOKESTATIC;
import org.apache.bcel.generic.INVOKEVIRTUAL;
import org.apache.bcel.generic.InstructionList;
-import org.apache.bcel.generic.L2I;
+import org.apache.bcel.generic.D2I;
import org.apache.bcel.generic.LocalVariableGen;
import org.apache.bcel.generic.NEW;
import org.apache.bcel.generic.PUSH;
@@ -511,15 +511,16 @@
compileDefault(classGen, methodGen);
_value.translate(classGen, methodGen);
- // Round the number to the nearest integer
- index = cpg.addMethodref(MATH_CLASS, "round", "(D)J");
+ // Using java.lang.Math.floor(number + 0.5) to return a double value
+ il.append(new PUSH(cpg, 0.5));
+ il.append(DADD);
+ index = cpg.addMethodref(MATH_CLASS, "floor", "(D)D");
il.append(new INVOKESTATIC(index));
- il.append(new L2I());
// Call setValue on the node counter
index = cpg.addMethodref(NODE_COUNTER,
"setValue",
- "(I)" + NODE_COUNTER_SIG);
+ "(D)" + NODE_COUNTER_SIG);
il.append(new INVOKEVIRTUAL(index));
}
else if (isDefault()) {
1.5 +13 -3
xml-xalan/java/src/org/apache/xalan/xsltc/dom/AnyNodeCounter.java
Index: AnyNodeCounter.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/AnyNodeCounter.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- AnyNodeCounter.java 16 Feb 2004 22:54:59 -0000 1.4
+++ AnyNodeCounter.java 4 Feb 2005 18:26:12 -0000 1.5
@@ -42,7 +42,12 @@
public String getCounter() {
int result;
if (_value != Integer.MIN_VALUE) {
- result = _value;
+ //See Errata E24
+ if (_value == 0) return "0";
+ else if (Double.isNaN(_value)) return "NaN";
+ else if (_value < 0 && Double.isInfinite(_value)) return
"-Infinity";
+ else if (Double.isInfinite(_value)) return "Infinity";
+ else return formatNumbers((int)_value);
}
else {
int next = _node;
@@ -83,7 +88,12 @@
public String getCounter() {
int result;
if (_value != Integer.MIN_VALUE) {
- result = _value;
+ //See Errata E24
+ if (_value == 0) return "0";
+ else if (Double.isNaN(_value)) return "NaN";
+ else if (_value < 0 && Double.isInfinite(_value)) return
"-Infinity";
+ else if (Double.isInfinite(_value)) return "Infinity";
+ else result = (int) _value;
}
else {
int next = _node;
1.6 +7 -2
xml-xalan/java/src/org/apache/xalan/xsltc/dom/MultipleNodeCounter.java
Index: MultipleNodeCounter.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/MultipleNodeCounter.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- MultipleNodeCounter.java 15 Dec 2004 17:35:44 -0000 1.5
+++ MultipleNodeCounter.java 4 Feb 2005 18:26:12 -0000 1.6
@@ -46,7 +46,12 @@
public String getCounter() {
if (_value != Integer.MIN_VALUE) {
- return formatNumbers(_value);
+ //See Errata E24
+ if (_value == 0) return "0";
+ else if (Double.isNaN(_value)) return "NaN";
+ else if (_value < 0 && Double.isInfinite(_value)) return
"-Infinity";
+ else if (Double.isInfinite(_value)) return "Infinity";
+ else return formatNumbers((int)_value);
}
IntegerArray ancestors = new IntegerArray();
1.14 +3 -3
xml-xalan/java/src/org/apache/xalan/xsltc/dom/NodeCounter.java
Index: NodeCounter.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/NodeCounter.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- NodeCounter.java 15 Dec 2004 17:35:44 -0000 1.13
+++ NodeCounter.java 4 Feb 2005 18:26:12 -0000 1.14
@@ -37,7 +37,7 @@
protected int _node = END;
protected int _nodeType = DOM.FIRST_TYPE - 1;
- protected int _value = Integer.MIN_VALUE;
+ protected double _value = Integer.MIN_VALUE;
public final DOM _document;
public final DTMAxisIterator _iterator;
@@ -84,7 +84,7 @@
* If the user specified a value attribute, use this instead of
* counting nodes.
*/
- public NodeCounter setValue(int value) {
+ public NodeCounter setValue(double value) {
_value = value;
return this;
}
1.7 +13 -3
xml-xalan/java/src/org/apache/xalan/xsltc/dom/SingleNodeCounter.java
Index: SingleNodeCounter.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/SingleNodeCounter.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- SingleNodeCounter.java 15 Dec 2004 17:35:44 -0000 1.6
+++ SingleNodeCounter.java 4 Feb 2005 18:26:12 -0000 1.7
@@ -49,7 +49,12 @@
public String getCounter() {
int result;
if (_value != Integer.MIN_VALUE) {
- result = _value;
+ //See Errata E24
+ if (_value == 0) return "0";
+ else if (Double.isNaN(_value)) return "NaN";
+ else if (_value < 0 && Double.isInfinite(_value)) return
"-Infinity";
+ else if (Double.isInfinite(_value)) return "Infinity";
+ else result = (int) _value;
}
else {
int next = _node;
@@ -104,7 +109,12 @@
public String getCounter() {
int result;
if (_value != Integer.MIN_VALUE) {
- result = _value;
+ //See Errata E24
+ if (_value == 0) return "0";
+ else if (Double.isNaN(_value)) return "NaN";
+ else if (_value < 0 && Double.isInfinite(_value)) return
"-Infinity";
+ else if (Double.isInfinite(_value)) return "Infinity";
+ else result = (int) _value;
}
else {
int next;
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]