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]

Reply via email to