santiagopg    2002/10/29 09:23:51

  Modified:    java/src/org/apache/xalan/xsltc/compiler
                        LocationPathPattern.java Mode.java Step.java
                        StepPattern.java xpath.cup
  Log:
  Distinguish between child::node() and attribute::node() both in patterns
  and expressions. This patch also fixes Bugzilla 11433.
  
  Revision  Changes    Path
  1.3       +7 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/LocationPathPattern.java
  
  Index: LocationPathPattern.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/LocationPathPattern.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- LocationPathPattern.java  6 Jun 2001 14:32:38 -0000       1.2
  +++ LocationPathPattern.java  29 Oct 2002 17:23:51 -0000      1.3
  @@ -64,6 +64,7 @@
   
   package org.apache.xalan.xsltc.compiler;
   
  +import org.apache.xalan.xsltc.dom.Axis;
   import org.apache.xalan.xsltc.compiler.util.Type;
   import org.apache.xalan.xsltc.compiler.util.*;
   
  @@ -125,12 +126,16 @@
        return false;
       }
       
  -    /** return last pattern (matching the current node) */
       public abstract StepPattern getKernelPattern();
        
       public abstract void reduceKernelPattern();
                
       public abstract boolean isWildcard();
  +
  +    public int getAxis() {
  +     final StepPattern sp = getKernelPattern();
  +     return (sp != null) ? sp.getAxis() : Axis.CHILD;
  +    }
   
       public String toString() {
        return "root()";
  
  
  
  1.25      +113 -62   
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Mode.java
  
  Index: Mode.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Mode.java,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- Mode.java 30 Jul 2002 12:46:14 -0000      1.24
  +++ Mode.java 29 Oct 2002 17:23:51 -0000      1.25
  @@ -70,11 +70,13 @@
   import java.util.Vector;
   import java.util.Hashtable;
   import java.util.Enumeration;
  -import org.apache.xalan.xsltc.compiler.util.Type;
  -import org.apache.bcel.generic.*;
  +
   import org.apache.bcel.util.*;
  -import org.apache.xalan.xsltc.compiler.util.*;
  +import org.apache.bcel.generic.*;
   import org.apache.xalan.xsltc.DOM;
  +import org.apache.xalan.xsltc.dom.Axis;
  +import org.apache.xalan.xsltc.compiler.util.*;
  +import org.apache.xalan.xsltc.compiler.util.Type;
   
   /**
    * Mode gathers all the templates belonging to a given mode; 
  @@ -104,16 +106,26 @@
       private Vector _templates; 
   
       /**
  -     * Group for patterns with node()-type kernel.
  +     * Group for patterns with node()-type kernel and child axis.
        */
  -    private Vector _nodeGroup = null;
  +    private Vector _childNodeGroup = null;
   
       /**
  -     * Test sequence for patterns with node()-type kernel.
  +     * Test sequence for patterns with node()-type kernel and child axis.
        */
  -    private TestSeq _nodeTestSeq = null;
  +    private TestSeq _childNodeTestSeq = null;
   
       /**
  +     * Group for patterns with node()-type kernel and attribute axis.
  +     */
  +    private Vector _attribNodeGroup = null;
  +
  +    /**
  +     * Test sequence for patterns with node()-type kernel and attribute axis.
  +     */
  +    private TestSeq _attribNodeTestSeq = null;
  +    
  +    /**
        * Group for patterns with id() or key()-type kernel.
        */
       private Vector _idxGroup = null;
  @@ -395,27 +407,31 @@
        // Find the vector to put this pattern into
        Vector patterns;
   
  -     // Use the vector for id()/key()/node() patterns if no kernel type
  -     patterns = (kernelType == -1) ? _nodeGroup : _patternGroups[kernelType];
  -
  -     // Create a new vector if needed and insert the very first pattern
  -     if (patterns == null) {
  -         patterns = new Vector(2);
  -         patterns.addElement(pattern);
  -
  -         if (kernelType == -1) {
  -             _nodeGroup = patterns;
  +     if (kernelType == DOM.NO_TYPE) {
  +         if (pattern.getAxis() == Axis.ATTRIBUTE) {
  +             patterns = (_attribNodeGroup == null) ?
  +                 (_attribNodeGroup = new Vector(2)) : _attribNodeGroup;
            }
            else {
  -             _patternGroups[kernelType] = patterns;
  +             patterns = (_childNodeGroup == null) ?
  +                 (_childNodeGroup = new Vector(2)) : _childNodeGroup;
            }
        }
  -     // Otherwise make sure patterns are ordered by precedence/priorities
  +     else {
  +         patterns = (_patternGroups[kernelType] == null) ?
  +             (_patternGroups[kernelType] = new Vector(2)) : 
  +             _patternGroups[kernelType];
  +     }
  +
  +     if (patterns == null) {
  +         patterns.addElement(pattern);
  +     }
        else {
            boolean inserted = false;
            for (int i = 0; i < patterns.size(); i++) {
                final LocationPathPattern lppToCompare =
                    (LocationPathPattern)patterns.elementAt(i);
  +
                if (pattern.noSmallerThan(lppToCompare)) {
                    inserted = true;
                    patterns.insertElementAt(pattern, i);
  @@ -429,47 +445,73 @@
       }
       
       /**
  +     * Complete test sequences of a given type by adding all patterns
  +     * from a given group.
  +     */
  +    private void completeTestSequences(int nodeType, Vector patterns) {
  +     if (patterns != null) {
  +         if (_patternGroups[nodeType] == null) {
  +             _patternGroups[nodeType] = patterns;
  +         }
  +         else {
  +             final int m = patterns.size();
  +             for (int j = 0; j < m; j++) {
  +                 addPattern(nodeType, 
  +                     (LocationPathPattern) patterns.elementAt(j));
  +             }
  +         }
  +     }
  +    }
  +
  +    /**
        * Build test sequences. The first step is to complete the test 
sequences 
        * by including patterns of "*" and "node()" kernel to all element test 
        * sequences, and of "@*" to all attribute test sequences.
        */
       private void prepareTestSequences() {
  -     final Vector names = _stylesheet.getXSLTC().getNamesIndex();
  -
        final Vector starGroup = _patternGroups[DOM.ELEMENT];
        final Vector atStarGroup = _patternGroups[DOM.ATTRIBUTE];
   
  -     // Complete test sequences with "*", "@*" and "node()"
  -     if (starGroup != null || atStarGroup != null || _nodeGroup != null) {
  +     // Complete test sequence for "text()" with "child::node()"
  +     completeTestSequences(DOM.TEXT, _childNodeGroup);
  +     
  +     // Complete test sequence for "*" with "child::node()"
  +     completeTestSequences(DOM.ELEMENT, _childNodeGroup);
  +     
  +     // Complete test sequence for "pi()" with "child::node()"
  +     completeTestSequences(DOM.PROCESSING_INSTRUCTION, _childNodeGroup);
  +     
  +     // Complete test sequence for "comment()" with "child::node()"
  +     completeTestSequences(DOM.COMMENT, _childNodeGroup);
  +     
  +     // Complete test sequence for "@*" with "attribute::node()"
  +     completeTestSequences(DOM.ATTRIBUTE, _attribNodeGroup);
  +
  +     final Vector names = _stylesheet.getXSLTC().getNamesIndex();
  +     if (starGroup != null || atStarGroup != null || 
  +         _childNodeGroup != null || _attribNodeGroup != null) 
  +     {
            final int n = _patternGroups.length;
   
  -         for (int m, i = DOM.NTYPES; i < n; i++) {
  +         // Complete test sequence for user-defined types
  +         for (int i = DOM.NTYPES; i < n; i++) {
                if (_patternGroups[i] == null) continue;
   
                final String name = (String) names.elementAt(i - DOM.NTYPES);
   
                if (isAttributeName(name)) {
                    // If an attribute then copy "@*" to its test sequence
  -                 m = (atStarGroup != null) ? atStarGroup.size() : 0;
  -                 for (int j = 0; j < m; j++) {
  -                     addPattern(i, 
  -                         (LocationPathPattern) atStarGroup.elementAt(j));
  -                 }
  +                 completeTestSequences(i, atStarGroup);
  +
  +                 // And also copy "attribute::node()" to its test sequence
  +                 completeTestSequences(i, _attribNodeGroup);
                }
                else {
                    // If an element then copy "*" to its test sequence
  -                 m = (starGroup != null) ? starGroup.size() : 0;
  -                 for (int j = 0; j < m; j++) {
  -                     addPattern(i, 
  -                         (LocationPathPattern) starGroup.elementAt(j));
  -                 }
  +                 completeTestSequences(i, starGroup);
   
  -                 // And also copy "node()" to its test sequence
  -                 m = (_nodeGroup != null) ? _nodeGroup.size() : 0;
  -                 for (int j = 0; j < m; j++) {
  -                     addPattern(i, 
  -                         (LocationPathPattern) _nodeGroup.elementAt(j));
  -                 }
  +                 // And also copy "child::node()" to its test sequence
  +                 completeTestSequences(i, _childNodeGroup);
                }
            }
        }
  @@ -481,19 +523,28 @@
            final Vector patterns = _patternGroups[i];
            if (patterns != null) {
                final TestSeq testSeq = new TestSeq(patterns, i, this);
  +// System.out.println("testSeq[" + i + "] = " + testSeq);
                testSeq.reduce();
                _testSeq[i] = testSeq;
                testSeq.findTemplates(_neededTemplates);
            }
        }
   
  -     if ((_nodeGroup != null) && (_nodeGroup.size() > 0)) {
  -         _nodeTestSeq = new TestSeq(_nodeGroup, -1, this);
  -         _nodeTestSeq.reduce();
  -         _nodeTestSeq.findTemplates(_neededTemplates);
  +     if (_childNodeGroup != null && _childNodeGroup.size() > 0) {
  +         _childNodeTestSeq = new TestSeq(_childNodeGroup, -1, this);
  +         _childNodeTestSeq.reduce();
  +         _childNodeTestSeq.findTemplates(_neededTemplates);
  +     }
  +
  +/*
  +     if (_attribNodeGroup != null && _attribNodeGroup.size() > 0) {
  +         _attribNodeTestSeq = new TestSeq(_attribNodeGroup, -1, this);
  +         _attribNodeTestSeq.reduce();
  +         _attribNodeTestSeq.findTemplates(_neededTemplates);
        }
  +*/
   
  -     if ((_idxGroup != null) && (_idxGroup.size() > 0)) {
  +     if (_idxGroup != null && _idxGroup.size() > 0) {
            _idxTestSeq = new TestSeq(_idxGroup, this);
            _idxTestSeq.reduce();
            _idxTestSeq.findTemplates(_neededTemplates);
  @@ -825,10 +876,10 @@
   
        // If there is a match on node() we need to replace ihElem
        // and ihText if the priority of node() is higher
  -     if (_nodeTestSeq != null) {
  +     if (_childNodeTestSeq != null) {
            // Compare priorities of node() and "*"
  -         double nodePrio = _nodeTestSeq.getPriority();
  -         int    nodePos  = _nodeTestSeq.getPosition();
  +         double nodePrio = _childNodeTestSeq.getPriority();
  +         int    nodePos  = _childNodeTestSeq.getPosition();
            double elemPrio = (0 - Double.MAX_VALUE);
            int    elemPos  = Integer.MIN_VALUE;
   
  @@ -839,7 +890,7 @@
            if (elemPrio == Double.NaN || elemPrio < nodePrio || 
                (elemPrio == nodePrio && elemPos < nodePos)) 
            {
  -             ihElem = _nodeTestSeq.compile(classGen, methodGen, ihLoop);
  +             ihElem = _childNodeTestSeq.compile(classGen, methodGen, ihLoop);
            }
   
            // Compare priorities of node() and text()
  @@ -854,8 +905,8 @@
            if (textPrio == Double.NaN || textPrio < nodePrio ||
                (textPrio == nodePrio && textPos < nodePos)) 
            {
  -             ihText = _nodeTestSeq.compile(classGen, methodGen, ihLoop);
  -             _testSeq[DOM.TEXT] = _nodeTestSeq;
  +             ihText = _childNodeTestSeq.compile(classGen, methodGen, ihLoop);
  +             _testSeq[DOM.TEXT] = _childNodeTestSeq;
            }
        }
   
  @@ -920,7 +971,7 @@
   
        // Match on processing instruction - default: process next node
        InstructionHandle ihPI = ihLoop;
  -     if (_nodeTestSeq != null) ihPI = ihElem;
  +     if (_childNodeTestSeq != null) ihPI = ihElem;
        if (_testSeq[DOM.PROCESSING_INSTRUCTION] != null)
            targets[DOM.PROCESSING_INSTRUCTION] =
                _testSeq[DOM.PROCESSING_INSTRUCTION].
  @@ -930,7 +981,7 @@
        
        // Match on comments - default: process next node
        InstructionHandle ihComment = ihLoop;
  -     if (_nodeTestSeq != null) ihComment = ihElem;
  +     if (_childNodeTestSeq != null) ihComment = ihElem;
        targets[DOM.COMMENT] = _testSeq[DOM.COMMENT] != null
            ? _testSeq[DOM.COMMENT].compile(classGen, methodGen, ihComment)
            : ihComment;
  @@ -1160,10 +1211,10 @@
   
        // If there is a match on node() we need to replace ihElem
        // and ihText if the priority of node() is higher
  -     if (_nodeTestSeq != null) {
  +     if (_childNodeTestSeq != null) {
            // Compare priorities of node() and "*"
  -         double nodePrio = _nodeTestSeq.getPriority();
  -         int    nodePos  = _nodeTestSeq.getPosition();
  +         double nodePrio = _childNodeTestSeq.getPriority();
  +         int    nodePos  = _childNodeTestSeq.getPosition();
            double elemPrio = (0 - Double.MAX_VALUE);
            int    elemPos  = Integer.MIN_VALUE;
   
  @@ -1175,7 +1226,7 @@
            if (elemPrio == Double.NaN || elemPrio < nodePrio || 
                (elemPrio == nodePrio && elemPos < nodePos)) 
            {
  -             ihElem = _nodeTestSeq.compile(classGen, methodGen, ihLoop);
  +             ihElem = _childNodeTestSeq.compile(classGen, methodGen, ihLoop);
            }
   
            // Compare priorities of node() and text()
  @@ -1191,8 +1242,8 @@
            if (textPrio == Double.NaN || textPrio < nodePrio ||
                (textPrio == nodePrio && textPos < nodePos)) 
            {
  -             ihText = _nodeTestSeq.compile(classGen, methodGen, ihLoop);
  -             _testSeq[DOM.TEXT] = _nodeTestSeq;
  +             ihText = _childNodeTestSeq.compile(classGen, methodGen, ihLoop);
  +             _testSeq[DOM.TEXT] = _childNodeTestSeq;
            }
        }
   
  @@ -1256,7 +1307,7 @@
   
        // Match on processing instruction - default: loop
        InstructionHandle ihPI = ihLoop;
  -     if (_nodeTestSeq != null) ihPI = ihElem;
  +     if (_childNodeTestSeq != null) ihPI = ihElem;
        if (_testSeq[DOM.PROCESSING_INSTRUCTION] != null) {
            targets[DOM.PROCESSING_INSTRUCTION] =
                _testSeq[DOM.PROCESSING_INSTRUCTION].
  @@ -1268,7 +1319,7 @@
        
        // Match on comments - default: process next node
        InstructionHandle ihComment = ihLoop;
  -     if (_nodeTestSeq != null) ihComment = ihElem;
  +     if (_childNodeTestSeq != null) ihComment = ihElem;
        targets[DOM.COMMENT] = _testSeq[DOM.COMMENT] != null
            ? _testSeq[DOM.COMMENT].compile(classGen, methodGen, ihComment)
            : ihComment;
  
  
  
  1.40      +6 -4      
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.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- Step.java 18 Oct 2002 20:07:34 -0000      1.39
  +++ Step.java 29 Oct 2002 17:23:51 -0000      1.40
  @@ -254,9 +254,11 @@
            translatePredicates(classGen, methodGen);
        }
        else {
  -         // If it is an attribute but not '@*' or '@attr' with a parent
  -         if ((_axis == Axis.ATTRIBUTE) &&
  -             (_nodeType != NodeTest.ATTRIBUTE) && (!hasParentPattern())) {
  +         // If it is an attribute but not '@*', '@attr' or '@node()' and
  +         // has no parent
  +         if (_axis == Axis.ATTRIBUTE && _nodeType != NodeTest.ATTRIBUTE &&
  +             _nodeType != NodeTest.ANODE && !hasParentPattern()) 
  +         {
                int iter = cpg.addInterfaceMethodref(DOM_INTF,
                                                     "getTypedAxisIterator",
                                                     "(II)"+NODE_ITERATOR_SIG);
  
  
  
  1.18      +5 -1      
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.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- StepPattern.java  29 Jul 2002 21:30:51 -0000      1.17
  +++ StepPattern.java  29 Oct 2002 17:23:51 -0000      1.18
  @@ -142,6 +142,10 @@
        }
       }
       
  +    public int getAxis() {
  +     return _axis;
  +    }
  +
       public void reduceKernelPattern() {
        _isEpsilon = true;
       }
  
  
  
  1.44      +6 -4      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/xpath.cup
  
  Index: xpath.cup
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/xpath.cup,v
  retrieving revision 1.43
  retrieving revision 1.44
  diff -u -r1.43 -r1.44
  --- xpath.cup 17 Sep 2002 14:20:59 -0000      1.43
  +++ xpath.cup 29 Oct 2002 17:23:51 -0000      1.44
  @@ -352,9 +352,11 @@
               {: RESULT = new AncestorPattern(sp, rpp); :};
   
   StepPattern ::= NodeTestPattern:nt
  -            {: RESULT = new StepPattern(Axis.CHILD,
  -                                        parser.findNodeType(Axis.CHILD, nt),
  -                                        null);
  +            {: 
  +             final int nodeType = parser.findNodeType(Axis.CHILD, nt);
  +             RESULT = new StepPattern(
  +                  (nodeType == NodeTest.ATTRIBUTE) ? Axis.ATTRIBUTE : 
Axis.CHILD,
  +                  nodeType, null);
               :}
   
               | NodeTestPattern:nt Predicates:pp
  
  
  

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

Reply via email to