1 16 19 20 package com.sun.org.apache.xalan.internal.xsltc.compiler; 21 22 import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen; 23 import com.sun.org.apache.bcel.internal.generic.ILOAD; 24 import com.sun.org.apache.bcel.internal.generic.INVOKEINTERFACE; 25 import com.sun.org.apache.bcel.internal.generic.InstructionList; 26 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator; 27 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.CompareGenerator; 28 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator; 29 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.TestGenerator; 30 31 36 final class PositionCall extends FunctionCall { 37 38 public PositionCall(QName fname) { 39 super(fname); 40 } 41 42 public boolean hasPositionCall() { 43 return true; 44 } 45 46 public void translate(ClassGenerator classGen, MethodGenerator methodGen) { 47 final InstructionList il = methodGen.getInstructionList(); 48 49 if (methodGen instanceof CompareGenerator) { 50 il.append(((CompareGenerator)methodGen).loadCurrentNode()); 51 } 52 else if (methodGen instanceof TestGenerator) { 53 il.append(new ILOAD(POSITION_INDEX)); 54 } 55 else { 56 final ConstantPoolGen cpg = classGen.getConstantPool(); 57 final int index = cpg.addInterfaceMethodref(NODE_ITERATOR, 58 "getPosition", 59 "()I"); 60 61 il.append(methodGen.loadIterator()); 62 il.append(new INVOKEINTERFACE(index,1)); 63 } 64 } 65 } 66 | Popular Tags |