santiagopg    02/05/06 13:34:17

  Modified:    java/src/org/apache/xalan/xsltc/compiler
                        AbsolutePathPattern.java AncestorPattern.java
                        ParentPattern.java
  Log:
  Fix for Bugzilla 2836 (modes15).
  
  Revision  Changes    Path
  1.6       +20 -7     
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/AbsolutePathPattern.java
  
  Index: AbsolutePathPattern.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/AbsolutePathPattern.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- AbsolutePathPattern.java  1 Feb 2002 20:07:08 -0000       1.5
  +++ AbsolutePathPattern.java  6 May 2002 20:34:17 -0000       1.6
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: AbsolutePathPattern.java,v 1.5 2002/02/01 20:07:08 tmiller Exp $
  + * @(#)$Id: AbsolutePathPattern.java,v 1.6 2002/05/06 20:34:17 santiagopg Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -123,31 +123,44 @@
            else {
                _left.translate(classGen, methodGen);
            }
  -         _trueList.append(_left._trueList);
  -         _falseList.append(_left._falseList);
        }
  +
        final int getParent = cpg.addInterfaceMethodref(DOM_INTF,
                                                        GET_PARENT,
                                                        GET_PARENT_SIG);
        final int getType = cpg.addInterfaceMethodref(DOM_INTF,
                                                      "getType", "(I)I");
  -     il.append(methodGen.loadDOM());
  +
  +     InstructionHandle begin = il.append(methodGen.loadDOM());
        il.append(SWAP);
        il.append(new INVOKEINTERFACE(getParent, 2));
  -     if (_left instanceof AncestorPattern) {
  +     if (_left instanceof AncestorPattern) { 
            il.append(methodGen.loadDOM());
            il.append(SWAP);
        }
        il.append(new INVOKEINTERFACE(getType, 2));
        il.append(new PUSH(cpg, DOM.ROOT));
        
  -     // long jump: _falseList.add(il.append(new IF_ICMPNE(null)));
        final BranchHandle skip = il.append(new IF_ICMPEQ(null));
        _falseList.add(il.append(new GOTO_W(null)));
        skip.setTarget(il.append(NOP));
  +
  +     if (_left != null) {
  +         _left.backPatchTrueList(begin);
  +         
  +         /*
  +          * If _left is an ancestor pattern, backpatch this pattern's false
  +          * list to the loop that searches for more ancestors.
  +          */
  +         if (_left instanceof AncestorPattern) {
  +             final AncestorPattern ancestor = (AncestorPattern) _left;
  +             _falseList.backPatch(ancestor.getLoopHandle());         // clears list
  +         }
  +         _falseList.append(_left._falseList);
  +     }
       }
        
       public String toString() {
  -     return "absolutePathPattern(" + (_left!=null ? _left.toString() : ")");
  +     return "absolutePathPattern(" + (_left != null ? _left.toString() : ")");
       }
   }
  
  
  
  1.6       +31 -15    
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/AncestorPattern.java
  
  Index: AncestorPattern.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/AncestorPattern.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- AncestorPattern.java      6 May 2002 13:53:22 -0000       1.5
  +++ AncestorPattern.java      6 May 2002 20:34:17 -0000       1.6
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: AncestorPattern.java,v 1.5 2002/05/06 13:53:22 santiagopg Exp $
  + * @(#)$Id: AncestorPattern.java,v 1.6 2002/05/06 20:34:17 santiagopg Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -69,8 +69,10 @@
   import org.apache.xalan.xsltc.compiler.util.*;
   
   final class AncestorPattern extends RelativePathPattern {
  +
       private final Pattern _left;     // may be null
       private final RelativePathPattern _right;
  +    private InstructionHandle _loop;
                
       public AncestorPattern(RelativePathPattern right) {
        this(null, right);
  @@ -84,6 +86,10 @@
        }
       }
        
  +    public InstructionHandle getLoopHandle() {
  +     return _loop;
  +    }
  +
       public void setParser(Parser parser) {
        super.setParser(parser);
        if (_left != null) {
  @@ -94,7 +100,6 @@
       
       public boolean isWildcard() {
        //!!! can be wildcard
  -     // return _right.isWildcard();
        return false;
       }
        
  @@ -114,12 +119,16 @@
       }
   
       public void translate(ClassGenerator classGen, MethodGenerator methodGen) {
  -     InstructionHandle loop, eloop;
  +     InstructionHandle parent;
        final ConstantPoolGen cpg = classGen.getConstantPool();
        final InstructionList il = methodGen.getInstructionList();
  +
  +     /* 
  +      * The scope of this local var must be the entire method since
  +      * a another pattern may decide to jump back into the loop
  +      */
        final LocalVariableGen local =
  -         methodGen.addLocalVariable2("app", 
  -                                     Util.getJCRefType(NODE_SIG),
  +         methodGen.addLocalVariable2("app", Util.getJCRefType(NODE_SIG),
                                        il.getEnd());
   
        final org.apache.bcel.generic.Instruction loadLocal =
  @@ -147,7 +156,7 @@
            final int getParent = cpg.addInterfaceMethodref(DOM_INTF,
                                                            GET_PARENT,
                                                            GET_PARENT_SIG);
  -         loop = il.append(new INVOKEINTERFACE(getParent, 2));
  +         parent = il.append(new INVOKEINTERFACE(getParent, 2));
            
            il.append(DUP);
            il.append(storeLocal);
  @@ -156,11 +165,10 @@
   
            _left.translate(classGen, methodGen);
   
  -
            final SyntaxTreeNode p = getParent();
  -         if ((p == null) || 
  -             (p instanceof Instruction) ||
  -             (p instanceof TopLevelElement)) {
  +         if (p == null || p instanceof Instruction ||
  +             p instanceof TopLevelElement) 
  +         {
                // do nothing
            }
            else {
  @@ -168,19 +176,27 @@
            }
   
            final BranchHandle exit = il.append(new GOTO(null));
  -         eloop = il.append(methodGen.loadDOM());
  +         _loop = il.append(methodGen.loadDOM());
            il.append(loadLocal);
  -         local.setEnd(eloop);
  -         il.append(new GOTO(loop));
  +         local.setEnd(_loop);
  +         il.append(new GOTO(parent));
            exit.setTarget(il.append(NOP));
  -         _left.backPatchFalseList(eloop);
  +         _left.backPatchFalseList(_loop);
   
            _trueList.append(_left._trueList);  
        }
        else {
            il.append(POP2);
        }
  -     methodGen.removeLocalVariable(local);
  +     
  +     /* 
  +      * If _right is an ancestor pattern, backpatch this pattern's false
  +      * list to the loop that searches for more ancestors.
  +      */
  +     if (_right instanceof AncestorPattern) {
  +         final AncestorPattern ancestor = (AncestorPattern) _right;
  +         _falseList.backPatch(ancestor.getLoopHandle());    // clears list
  +     }
   
        _trueList.append(_right._trueList);
        _falseList.append(_right._falseList);
  
  
  
  1.5       +13 -6     
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/ParentPattern.java
  
  Index: ParentPattern.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/ParentPattern.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ParentPattern.java        6 May 2002 13:53:22 -0000       1.4
  +++ ParentPattern.java        6 May 2002 20:34:17 -0000       1.5
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: ParentPattern.java,v 1.4 2002/05/06 13:53:22 santiagopg Exp $
  + * @(#)$Id: ParentPattern.java,v 1.5 2002/05/06 20:34:17 santiagopg Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -117,8 +117,6 @@
            il.append(SWAP);
        }
        else if (_right instanceof StepPattern) {
  -         //!!! check this
  -
            il.append(DUP);
            il.append(storeLocal);
            
  @@ -142,9 +140,9 @@
        il.append(new INVOKEINTERFACE(getParent, 2));
   
        final SyntaxTreeNode p = getParent();
  -     if ((p == null) ||
  -         (p instanceof Instruction) ||
  -         (p instanceof TopLevelElement)) {
  +     if (p == null || p instanceof Instruction || 
  +         p instanceof TopLevelElement) 
  +     {
            _left.translate(classGen, methodGen);
        }
        else {
  @@ -159,6 +157,15 @@
   
        methodGen.removeLocalVariable(local);
        
  +     /*
  +      * If _right is an ancestor pattern, backpatch _left false
  +      * list to the loop that searches for more ancestors.
  +      */
  +     if (_right instanceof AncestorPattern) {
  +         final AncestorPattern ancestor = (AncestorPattern) _right;
  +         _left.backPatchFalseList(ancestor.getLoopHandle());    // clears list
  +     }
  +
        _trueList.append(_right._trueList.append(_left._trueList));
        _falseList.append(_right._falseList.append(_left._falseList));
       }
  
  
  

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

Reply via email to