1 /* 2 * reserved comment block 3 * DO NOT REMOVE OR ALTER! 4 */ 5 /* 6 * Licensed to the Apache Software Foundation (ASF) under one or more 7 * contributor license agreements. See the NOTICE file distributed with 8 * this work for additional information regarding copyright ownership. 9 * The ASF licenses this file to You under the Apache License, Version 2.0 10 * (the "License"); you may not use this file except in compliance with 11 * the License. You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 */ 21 22 package com.sun.org.apache.xalan.internal.xsltc.compiler; 23 24 import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen; 25 import com.sun.org.apache.bcel.internal.generic.ILOAD; 26 import com.sun.org.apache.bcel.internal.generic.INVOKEINTERFACE; 27 import com.sun.org.apache.bcel.internal.generic.InstructionList; 28 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator; 29 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.CompareGenerator; 30 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator; 31 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.TestGenerator; 32 33 /** 34 * @author Jacek Ambroziak 35 * @author Santiago Pericas-Geertsen 36 * @author Morten Jorgensen 37 */ 38 final class PositionCall extends FunctionCall { 39 40 public PositionCall(QName fname) { 41 super(fname); 42 } 43 44 public boolean hasPositionCall() { 45 return true; 46 } 47 48 public void translate(ClassGenerator classGen, MethodGenerator methodGen) { 49 final InstructionList il = methodGen.getInstructionList(); 50 51 if (methodGen instanceof CompareGenerator) { 52 il.append(((CompareGenerator)methodGen).loadCurrentNode()); 53 } 54 else if (methodGen instanceof TestGenerator) { 55 il.append(new ILOAD(POSITION_INDEX)); 56 } 57 else { 58 final ConstantPoolGen cpg = classGen.getConstantPool(); 59 final int index = cpg.addInterfaceMethodref(NODE_ITERATOR, 60 "getPosition", 61 "()I"); 62 63 il.append(methodGen.loadIterator()); 64 il.append(new INVOKEINTERFACE(index,1)); 65 } 66 } 67 }