morten      01/11/05 10:47:51

  Modified:    java/src/org/apache/xalan/xsltc/compiler Step.java
               java/src/org/apache/xalan/xsltc/dom
                        CurrentNodeListIterator.java DOMImpl.java
  Log:
  Fixed the last() function for the typed and untyped ancestor iterators.
  I also updated our node list iterator (used to implement some predicates)
  to handle the last() function properly for reverse-order axes.
  PR:           bugzilla 4602
  Obtained from:        n/a
  Submitted by: [EMAIL PROTECTED]
  Reviewed by:  [EMAIL PROTECTED]
  
  Revision  Changes    Path
  1.26      +16 -21    
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.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- Step.java 2001/11/01 13:05:49     1.25
  +++ Step.java 2001/11/05 18:47:51     1.26
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: Step.java,v 1.25 2001/11/01 13:05:49 morten Exp $
  + * @(#)$Id: Step.java,v 1.26 2001/11/05 18:47:51 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -467,26 +467,6 @@
            }
            // Handle 'elem[n]' expression
            else if (predicate.isNthPositionFilter()) {
  -             // Special case for typed descendant / decendant-or-self axis
  -             /* Crap piece of code right here, I added it, and I am
  -                taking it away as well. Very wrong ideed. Morten
  -             if (((_axis == Axis.DESCENDANT) ||
  -                  (_axis == Axis.DESCENDANTORSELF)) &&
  -                 (_nodeType > DOM.ATTRIBUTE)) {
  -                 il.append(methodGen.loadDOM());
  -                 il.append(new PUSH(cpg, _nodeType));
  -                 predicate.translate(classGen, methodGen);
  -                 if (_axis == Axis.DESCENDANT)
  -                     il.append(new ICONST(0));
  -                 else
  -                     il.append(new ICONST(1));
  -                 idx = cpg.addInterfaceMethodref(DOM_INTF,
  -                                                 "getNthDescendant",
  -                                                 "(IIZ)"+NODE_ITERATOR_SIG);
  -                 il.append(new INVOKEINTERFACE(idx, 4));
  -             }
  -             else {
  -             */
                idx = cpg.addMethodref(NTH_ITERATOR_CLASS,
                                       "<init>",
                                       "("+NODE_ITERATOR_SIG+"I)V");
  @@ -518,6 +498,21 @@
                    il.append(new CHECKCAST(cpg.addClass(className)));
                }
                il.append(new INVOKESPECIAL(idx));
  +
  +             // Determine if the node set should be generated using the
  +             // natural order of the node set or document order.
  +             // See CurrentNodeListIterator's constructor(s) for details.
  +             SyntaxTreeNode parent = getParent();
  +             while (!(parent instanceof Template)) {
  +                 if (parent instanceof ApplyTemplates) {
  +                     idx = cpg.addMethodref(CURRENT_NODE_LIST_ITERATOR,
  +                                            "forceNaturalOrder",
  +                                            "()"+NODE_ITERATOR_SIG);
  +                     il.append(new INVOKEVIRTUAL(idx));
  +                     break;
  +                 }
  +                 parent = parent.getParent();
  +             }
            }
        }
       }
  
  
  
  1.3       +8 -3      
xml-xalan/java/src/org/apache/xalan/xsltc/dom/CurrentNodeListIterator.java
  
  Index: CurrentNodeListIterator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/CurrentNodeListIterator.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- CurrentNodeListIterator.java      2001/10/30 15:49:31     1.2
  +++ CurrentNodeListIterator.java      2001/11/05 18:47:51     1.3
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: CurrentNodeListIterator.java,v 1.2 2001/10/30 15:49:31 morten 
Exp $
  + * @(#)$Id: CurrentNodeListIterator.java,v 1.3 2001/11/05 18:47:51 morten 
Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -71,7 +71,7 @@
   
   public final class CurrentNodeListIterator extends NodeIteratorBase {
       private NodeIterator _source;
  -    private final boolean _docOrder;
  +    private boolean _docOrder;
       private final CurrentNodeListFilter _filter;
       private IntegerArray _nodes = new IntegerArray();
        
  @@ -98,7 +98,12 @@
        _docOrder = docOrder;
        _currentNode = currentNode;
       }
  -    
  +
  +    public NodeIterator forceNaturalOrder() {
  +     _docOrder = true;
  +     return this;
  +    }
  +
       public boolean isReverse() {
        return !_docOrder;
       }
  
  
  
  1.59      +17 -15    
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.58
  retrieving revision 1.59
  diff -u -r1.58 -r1.59
  --- DOMImpl.java      2001/11/05 15:47:35     1.58
  +++ DOMImpl.java      2001/11/05 18:47:51     1.59
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: DOMImpl.java,v 1.58 2001/11/05 15:47:35 morten Exp $
  + * @(#)$Id: DOMImpl.java,v 1.59 2001/11/05 18:47:51 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -1319,13 +1319,19 @@
       private class AncestorIterator extends NodeIteratorBase {
   
        protected int _index;
  +     protected int _last = -1;
   
        public final boolean isReverse() {
            return true;
        }
   
        public int getLast() {
  -         return(ROOT);
  +         if (_last > -1) return _last;
  +         int count = 1;
  +         int node = _startNode;
  +         while ((node = _parent[node]) != ROOT) count++;
  +         _last = count;
  +         return(count);
        }
            
        public NodeIterator cloneIterator() {
  @@ -1344,6 +1350,7 @@
                     
        public NodeIterator setStartNode(int node) {
            if (_isRestartable) {
  +             _last = -1;
                if (node >= _firstAttributeNode)
                    _startNode = node = _parent[node];
                else if (_includeSelf)
  @@ -1404,19 +1411,14 @@
        }
   
        public int getLast() {
  -         int last = _index;
  -         int curr = _index;
  -
  -         while (curr >= 0) {
  -             if (curr == 0)
  -                 curr = -1;
  -             else {
  -                 curr = _parent[curr];
  -                 if (_type[curr] == _nodeType)
  -                     last = curr;
  -             }
  -         }
  -         return(last);
  +         if (_last > -1) return _last;
  +         int count = 1;
  +         int node = _startNode;
  +         do {
  +             if (_type[node] == _nodeType) count++;
  +         } while ((node = _parent[node]) != ROOT);
  +         _last = count;
  +         return(count);
        }
   
       } // end of TypedAncestorIterator
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to