santiagopg    2003/12/19 07:26:49

  Modified:    java/src/org/apache/xalan/xsltc/compiler ApplyTemplates.java
                        BooleanCall.java CastExpr.java CopyOf.java
                        DocumentCall.java EqualityExpr.java Expression.java
                        FilterExpr.java ForEach.java FunctionCall.java
                        Key.java KeyCall.java NameBase.java NumberCall.java
                        RelationalExpr.java StringCall.java
                        VariableBase.java WithParam.java
  Log:
  Patch for XSLTC's parameter optimization introduced in 2.5.2. The problem is 
that a param's default value can now be compiled multiple times, once for every 
call to the template for which that param is not specified. This essentially 
turns the AST into a graph, which requires the state of a param subtree to be 
reset after the each compilation. In particular, the variable 
Expression._startReset was not reset and this resulted in calls to 
setStartNode() to be generated only the first time the param's default value 
was compiled. After some analysis, I realized that _startReset was no longer 
necessary, so I removed it. I also renamed Expression.startResetIterator() to 
Expression.startIterator() since calls to reset() are no longer generated 
within this method.
  
  Revision  Changes    Path
  1.18      +2 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/ApplyTemplates.java
  
  Index: ApplyTemplates.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/ApplyTemplates.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- ApplyTemplates.java       30 Jan 2003 18:45:59 -0000      1.17
  +++ ApplyTemplates.java       19 Dec 2003 15:26:48 -0000      1.18
  @@ -216,7 +216,7 @@
        }
   
        if (_select != null && !setStartNodeCalled) {
  -         _select.startResetIterator(classGen, methodGen);
  +         _select.startIterator(classGen, methodGen);
        }
   
        //!!! need to instantiate all needed modes
  
  
  
  1.6       +2 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/BooleanCall.java
  
  Index: BooleanCall.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/BooleanCall.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- BooleanCall.java  30 Jan 2003 18:45:59 -0000      1.5
  +++ BooleanCall.java  19 Dec 2003 15:26:48 -0000      1.6
  @@ -88,7 +88,7 @@
        _arg.translate(classGen, methodGen);
        final Type targ = _arg.getType();
        if (!targ.identicalTo(Type.Boolean)) {
  -         _arg.startResetIterator(classGen, methodGen);
  +         _arg.startIterator(classGen, methodGen);
            targ.translateTo(classGen, methodGen, Type.Boolean);
        }
       }
  
  
  
  1.20      +3 -3      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/CastExpr.java
  
  Index: CastExpr.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/CastExpr.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- CastExpr.java     17 Oct 2003 17:15:15 -0000      1.19
  +++ CastExpr.java     19 Dec 2003 15:26:48 -0000      1.20
  @@ -251,7 +251,7 @@
   
            _left.translate(classGen, methodGen);
            if (_type != ltype) {
  -             _left.startResetIterator(classGen, methodGen);
  +             _left.startIterator(classGen, methodGen);
                if (_type instanceof BooleanType) {
                    fl = ltype.translateToDesynthesized(classGen, methodGen,
                                                        _type);
  @@ -270,7 +270,7 @@
        final Type ltype = _left.getType();
        _left.translate(classGen, methodGen);
        if (_type.identicalTo(ltype) == false) {
  -         _left.startResetIterator(classGen, methodGen);
  +         _left.startIterator(classGen, methodGen);
            ltype.translateTo(classGen, methodGen, _type);
        }
       }
  
  
  
  1.14      +2 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/CopyOf.java
  
  Index: CopyOf.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/CopyOf.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- CopyOf.java       1 Apr 2003 21:08:59 -0000       1.13
  +++ CopyOf.java       19 Dec 2003 15:26:48 -0000      1.14
  @@ -132,7 +132,7 @@
   
            // push NodeIterator
            _select.translate(classGen, methodGen);     
  -         _select.startResetIterator(classGen, methodGen);
  +         _select.startIterator(classGen, methodGen);
   
            // call copy from the DOM 'library'
            il.append(methodGen.loadHandler());
  
  
  
  1.18      +3 -3      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/DocumentCall.java
  
  Index: DocumentCall.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/DocumentCall.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- DocumentCall.java 16 Apr 2003 20:58:24 -0000      1.17
  +++ DocumentCall.java 19 Dec 2003 15:26:48 -0000      1.18
  @@ -174,13 +174,13 @@
           // The URI can be either a node-set or something else cast to a 
string
           _arg1.translate(classGen, methodGen);
           if (_arg1Type == Type.NodeSet) {
  -            _arg1.startResetIterator(classGen, methodGen);
  +            _arg1.startIterator(classGen, methodGen);
           }
   
           if (ac == 2) {
               //_arg2 == null was tested in typeChec()
               _arg2.translate(classGen, methodGen);
  -            _arg2.startResetIterator(classGen, methodGen);       
  +            _arg2.startIterator(classGen, methodGen);       
           }
       
           // Feck the rest of the parameters on the stack
  
  
  
  1.13      +5 -5      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/EqualityExpr.java
  
  Index: EqualityExpr.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/EqualityExpr.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- EqualityExpr.java 30 Jan 2003 18:46:00 -0000      1.12
  +++ EqualityExpr.java 19 Dec 2003 15:26:48 -0000      1.13
  @@ -337,7 +337,7 @@
   
        if (tleft instanceof NodeSetType && tright instanceof BooleanType) {
            _left.translate(classGen, methodGen);
  -         _left.startResetIterator(classGen, methodGen);
  +         _left.startIterator(classGen, methodGen);
            Type.NodeSet.translateTo(classGen, methodGen, Type.Boolean);
            _right.translate(classGen, methodGen);
   
  @@ -351,7 +351,7 @@
   
        if (tleft instanceof NodeSetType && tright instanceof StringType) {
            _left.translate(classGen, methodGen);
  -         _left.startResetIterator(classGen, methodGen); // needed ?
  +         _left.startIterator(classGen, methodGen); // needed ?
            _right.translate(classGen, methodGen);
            il.append(new PUSH(cpg, _op));
            il.append(methodGen.loadDOM());
  @@ -369,9 +369,9 @@
   
        // Next, node-set/t for t in {real, string, node-set, result-tree}
        _left.translate(classGen, methodGen);
  -     _left.startResetIterator(classGen, methodGen);
  +     _left.startIterator(classGen, methodGen);
        _right.translate(classGen, methodGen);
  -     _right.startResetIterator(classGen, methodGen);
  +     _right.startIterator(classGen, methodGen);
   
        // Cast a result tree to a string to use an existing compare
        if (tright instanceof ResultTreeType) {
  
  
  
  1.19      +12 -25    
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Expression.java
  
  Index: Expression.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Expression.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- Expression.java   11 Jun 2003 21:26:35 -0000      1.18
  +++ Expression.java   19 Dec 2003 15:26:48 -0000      1.19
  @@ -90,12 +90,6 @@
       protected Type _type;
   
       /**
  -     * True if this expression is of node-set type and its corresponding
  -     * iterator has been started or reset.
  -     */
  -    protected boolean _startReset = false;
  -
  -    /**
        * Instruction handles that comprise the true list.
        */
       protected FlowList _trueList = new FlowList();
  @@ -169,30 +163,23 @@
       }
   
       /**
  -     * Expects an object on the stack and if this object can be proven
  -     * to be a node iterator then the iterator is reset or started
  -     * depending on the type of this expression.
  -     * If this expression is a var reference then the iterator 
  -     * is reset, otherwise it is started.
  +     * If this expression is of type node-set and it is not a variable
  +     * reference, then call setStartNode() passing the context node.
        */
  -    public void startResetIterator(ClassGenerator classGen,
  +    public void startIterator(ClassGenerator classGen,
                                   MethodGenerator methodGen) {
  -     final ConstantPoolGen cpg = classGen.getConstantPool();
  -     final InstructionList il = methodGen.getInstructionList();
  -
  -     if (_startReset) {
  -         return;                     // already started
  -     }
  -     _startReset = true;
  -
  +     // Ignore if type is not node-set
        if (_type instanceof NodeSetType == false) {
  -         return;             // nothing to do
  +         return;
        }
   
  +     // setStartNode() should not be called if expr is a variable ref
        Expression expr = this;
  -     if (expr instanceof CastExpr)
  -         expr = ((CastExpr)expr).getExpr();
  -     if ( (expr instanceof VariableRefBase) == false ) {
  +     if (expr instanceof CastExpr) {
  +         expr = ((CastExpr) expr).getExpr();
  +     }
  +     if (expr instanceof VariableRefBase == false) {
  +         final InstructionList il = methodGen.getInstructionList();
            il.append(methodGen.loadContextNode());
            il.append(methodGen.setStartNode());
        }
  
  
  
  1.9       +2 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/FilterExpr.java
  
  Index: FilterExpr.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/FilterExpr.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- FilterExpr.java   30 Jan 2003 18:46:00 -0000      1.8
  +++ FilterExpr.java   19 Dec 2003 15:26:48 -0000      1.9
  @@ -148,7 +148,7 @@
        }
        else {
            _primary.translate(classGen, methodGen);
  -         _primary.startResetIterator(classGen, methodGen);
  +         _primary.startIterator(classGen, methodGen);
        }
       }
   
  
  
  
  1.17      +2 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/ForEach.java
  
  Index: ForEach.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/ForEach.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- ForEach.java      1 Apr 2003 21:08:59 -0000       1.16
  +++ ForEach.java      19 Dec 2003 15:26:48 -0000      1.17
  @@ -177,7 +177,7 @@
            }
   
            if (_type instanceof ReferenceType == false) {
  -             _select.startResetIterator(classGen, methodGen);
  +             _select.startIterator(classGen, methodGen);
            }
        }
   
  
  
  
  1.33      +4 -4      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/FunctionCall.java
  
  Index: FunctionCall.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/FunctionCall.java,v
  retrieving revision 1.32
  retrieving revision 1.33
  diff -u -r1.32 -r1.33
  --- FunctionCall.java 17 Oct 2003 17:15:15 -0000      1.32
  +++ FunctionCall.java 19 Dec 2003 15:26:48 -0000      1.33
  @@ -741,7 +741,7 @@
            for (int i = 0; i < n; i++) {
                final Expression exp = argument(i);
                exp.translate(classGen, methodGen);
  -             exp.startResetIterator(classGen, methodGen);
  +             exp.startIterator(classGen, methodGen);
            }
   
            // append "F" to the function's name
  @@ -788,7 +788,7 @@
                final Expression exp = argument(i);
                exp.translate(classGen, methodGen);
                // Convert the argument to its Java type
  -             exp.startResetIterator(classGen, methodGen);
  +             exp.startIterator(classGen, methodGen);
                exp.getType().translateTo(classGen, methodGen, paramTypes[i]);
            }
   
  @@ -824,7 +824,7 @@
                final Expression exp = argument(i);
                exp.translate(classGen, methodGen);
                // Convert the argument to its Java type
  -             exp.startResetIterator(classGen, methodGen);
  +             exp.startIterator(classGen, methodGen);
                exp.getType().translateTo(classGen, methodGen, paramTypes[i]);
            }
   
  
  
  
  1.16      +2 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Key.java
  
  Index: Key.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Key.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- Key.java  1 Apr 2003 21:08:59 -0000       1.15
  +++ Key.java  19 Dec 2003 15:26:48 -0000      1.16
  @@ -205,7 +205,7 @@
   
        // Overwrite current iterator with one that gives us only what we want
        _use.translate(classGen, methodGen);
  -     _use.startResetIterator(classGen, methodGen);
  +     _use.startIterator(classGen, methodGen);
        il.append(methodGen.storeIterator());
   
        final BranchHandle nextNode = il.append(new GOTO(null));
  
  
  
  1.14      +2 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/KeyCall.java
  
  Index: KeyCall.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/KeyCall.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- KeyCall.java      1 Apr 2003 21:08:59 -0000       1.13
  +++ KeyCall.java      19 Dec 2003 15:26:48 -0000      1.14
  @@ -280,7 +280,7 @@
   
            // Get new iterator from 2nd parameter node-set & store in variable
            _value.translate(classGen, methodGen);
  -         _value.startResetIterator(classGen, methodGen);
  +         _value.startIterator(classGen, methodGen);
            il.append(methodGen.storeIterator());
   
            // Create the KeyIndex object (the iterator) we'll return
  
  
  
  1.11      +2 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/NameBase.java
  
  Index: NameBase.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/NameBase.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- NameBase.java     1 Apr 2003 21:08:59 -0000       1.10
  +++ NameBase.java     19 Dec 2003 15:26:48 -0000      1.11
  @@ -159,7 +159,7 @@
        // Function was called with node-set parameter
        else {
            _param.translate(classGen, methodGen);
  -         _param.startResetIterator(classGen, methodGen);
  +         _param.startIterator(classGen, methodGen);
            il.append(methodGen.nextNode());
        }
       }
  
  
  
  1.5       +2 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/NumberCall.java
  
  Index: NumberCall.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/NumberCall.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- NumberCall.java   30 Jan 2003 18:46:01 -0000      1.4
  +++ NumberCall.java   19 Dec 2003 15:26:48 -0000      1.5
  @@ -95,7 +95,7 @@
        else {
            final Expression arg = argument();
            arg.translate(classGen, methodGen);
  -         arg.startResetIterator(classGen, methodGen);
  +         arg.startIterator(classGen, methodGen);
            targ = arg.getType();
        }
   
  
  
  
  1.18      +3 -3      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/RelationalExpr.java
  
  Index: RelationalExpr.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/RelationalExpr.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- RelationalExpr.java       15 Oct 2003 21:01:51 -0000      1.17
  +++ RelationalExpr.java       19 Dec 2003 15:26:48 -0000      1.18
  @@ -241,9 +241,9 @@
   
            // Call compare() from the BasisLibrary
            _left.translate(classGen, methodGen);
  -         _left.startResetIterator(classGen, methodGen);
  +         _left.startIterator(classGen, methodGen);
            _right.translate(classGen, methodGen);
  -         _right.startResetIterator(classGen, methodGen);
  +         _right.startIterator(classGen, methodGen);
   
            il.append(new PUSH(cpg, _op));
            il.append(methodGen.loadDOM());
  
  
  
  1.6       +2 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/StringCall.java
  
  Index: StringCall.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/StringCall.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- StringCall.java   30 Jan 2003 18:46:02 -0000      1.5
  +++ StringCall.java   19 Dec 2003 15:26:48 -0000      1.6
  @@ -101,7 +101,7 @@
        else {
            final Expression arg = argument();
            arg.translate(classGen, methodGen);
  -         arg.startResetIterator(classGen, methodGen);
  +         arg.startIterator(classGen, methodGen);
            targ = arg.getType();
        }
   
  
  
  
  1.20      +2 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/VariableBase.java
  
  Index: VariableBase.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/VariableBase.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- VariableBase.java 25 Jun 2003 17:08:31 -0000      1.19
  +++ VariableBase.java 19 Dec 2003 15:26:48 -0000      1.20
  @@ -306,7 +306,7 @@
   
                il.append(new INVOKESPECIAL(initCNI));
            }
  -         _select.startResetIterator(classGen, methodGen);
  +         _select.startIterator(classGen, methodGen);
        }
        // If not, compile result tree from parameter body if present.
        else if (hasContents()) {
  
  
  
  1.14      +2 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/WithParam.java
  
  Index: WithParam.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/WithParam.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- WithParam.java    23 Jun 2003 18:23:15 -0000      1.13
  +++ WithParam.java    19 Dec 2003 15:26:48 -0000      1.14
  @@ -164,7 +164,7 @@
        // Compile expression is 'select' attribute if present
        if (_select != null) {
            _select.translate(classGen, methodGen);
  -         _select.startResetIterator(classGen, methodGen);
  +         _select.startIterator(classGen, methodGen);
        }
        // If not, compile result tree from parameter body if present.
        else if (hasContents()) {
  
  
  

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

Reply via email to