You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by sa...@apache.org on 2002/05/06 22:34:17 UTC

cvs commit: xml-xalan/java/src/org/apache/xalan/xsltc/compiler AbsolutePathPattern.java AncestorPattern.java ParentPattern.java

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: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org