You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by mm...@apache.org on 2001/11/06 20:25:53 UTC

cvs commit: xml-xalan/java/src/org/apache/xpath/axes LocPathIterator.java OneStepIterator.java PredicatedNodeTest.java

mmidy       01/11/06 11:25:53

  Modified:    java/src/org/apache/xpath/axes LocPathIterator.java
                        OneStepIterator.java PredicatedNodeTest.java
  Log:
  Bugzilla 4638: When we are in a subcontext we need to clip off the predicate when evaluating. If not, we end up with the wrong nodeset. This also relates to test position68.
  
  Revision  Changes    Path
  1.33      +26 -6     xml-xalan/java/src/org/apache/xpath/axes/LocPathIterator.java
  
  Index: LocPathIterator.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/axes/LocPathIterator.java,v
  retrieving revision 1.32
  retrieving revision 1.33
  diff -u -r1.32 -r1.33
  --- LocPathIterator.java	2001/08/07 19:16:43	1.32
  +++ LocPathIterator.java	2001/11/06 19:25:53	1.33
  @@ -536,7 +536,7 @@
         return m_last;
       else if(null == m_cachedNodes || !m_foundLast)
       {
  -      m_last = getLastPos(m_execContext);
  +      m_last = findLastPos(m_execContext);
       }
       else
       {
  @@ -906,8 +906,8 @@
     {
       m_last = last;
     }
  -
  -  /**
  +  
  +   /**
      * Get the index of the last node that can be itterated to.
      * This probably will need to be overridded by derived classes.
      *
  @@ -917,6 +917,19 @@
      */
     public int getLastPos(XPathContext xctxt)
     {
  +    return getLength();
  +  }
  +    
  +  /**
  +   * Get the index of the last node that can be itterated to.
  +   * This probably will need to be overridded by derived classes.
  +   *
  +   * @param xctxt XPath runtime context.
  +   *
  +   * @return the index of the last node that can be itterated to.
  +   */
  +  public int findLastPos(XPathContext xctxt)
  +  {
       int savedPos;
       if(null != m_cachedNodes)
         savedPos = m_cachedNodes.getCurrentPos();
  @@ -939,10 +952,17 @@
       catch (CloneNotSupportedException cnse)
       {
         return -1;
  +    }
  +
  +    // We want to clip off the last predicate, but only if we are a sub 
  +    // context node list, NOT if we are a context list.  See pos68 test, 
  +    // also test against bug4638.
  +    int predCount = clone.getPredicateCount();
  +    if(predCount > 0 && this == m_execContext.getSubContextList())
  +    {
  +      // Don't call setPredicateCount, because it clones and is slower.
  +      clone.m_predCount = predCount - 1;
       }
  -    // %REVIEW% Commented this out, as it was messing up pos68 test. count-1?
  -    // System.out.println("clone.getPredicateCount(): "+clone.getPredicateCount());
  -    // clone.setPredicateCount(clone.getPredicateCount() - 1);
   
       int next;
   
  
  
  
  1.7       +9 -3      xml-xalan/java/src/org/apache/xpath/axes/OneStepIterator.java
  
  Index: OneStepIterator.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/axes/OneStepIterator.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- OneStepIterator.java	2001/08/07 19:16:43	1.6
  +++ OneStepIterator.java	2001/11/06 19:25:53	1.7
  @@ -152,7 +152,8 @@
           xctxt.pushCurrentNode(root);
           clone.setRoot(root, xctxt);
   
  -        clone.setPredicateCount(predicateIndex);
  +        // clone.setPredicateCount(predicateIndex);
  +        clone.m_predCount = predicateIndex;
   
           // Count 'em all
           int count = 1;
  @@ -201,7 +202,7 @@
      *
      * @return the number of nodes in this node list.
      */
  -  public int getLastPos(XPathContext xctxt)
  +  public int findLastPos(XPathContext xctxt)
     {
       if(!isReverseAxes())
         return super.getLastPos(xctxt);
  @@ -216,7 +217,12 @@
         xctxt.pushCurrentNode(root);
         clone.setRoot(root, xctxt);
   
  -      clone.setPredicateCount(this.getPredicateCount() - 1);
  +      int predCount = clone.getPredicateCount();
  +      if(predCount > 0 && this == m_execContext.getSubContextList())
  +      {
  +        // Don't call setPredicateCount, because it clones and is slower.
  +        clone.m_predCount = predCount - 1;
  +      }
   
         // Count 'em all
         // count = 1;
  
  
  
  1.9       +7 -1      xml-xalan/java/src/org/apache/xpath/axes/PredicatedNodeTest.java
  
  Index: PredicatedNodeTest.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/axes/PredicatedNodeTest.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- PredicatedNodeTest.java	2001/07/30 17:32:32	1.8
  +++ PredicatedNodeTest.java	2001/11/06 19:25:53	1.9
  @@ -87,6 +87,9 @@
   
       return clone;
     }
  +  
  +  // Only for clones for findLastPos.  See bug4638.
  +  protected int m_predCount = -1;
   
     /**
      * Get the number of predicates that this walker has.
  @@ -95,7 +98,10 @@
      */
     public int getPredicateCount()
     {
  -    return (null == m_predicates) ? 0 : m_predicates.length;
  +    if(-1 == m_predCount)
  +      return (null == m_predicates) ? 0 : m_predicates.length;
  +    else
  +      return m_predCount;
     }
   
     /**
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org