1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * https://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, 13 * software distributed under the License is distributed on an 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 * KIND, either express or implied. See the License for the 16 * specific language governing permissions and limitations 17 * under the License. 18 */ 19 package org.apache.bcel.generic; 20 21 import java.io.DataOutputStream; 22 import java.io.IOException; 23 24 import org.apache.bcel.Const; 25 import org.apache.bcel.ExceptionConst; 26 27 /** 28 * INVOKEVIRTUAL - Invoke instance method; dispatch based on class 29 * 30 * <PRE> 31 * Stack: ..., objectref, [arg1, [arg2 ...]] -> ... 32 * </PRE> 33 * 34 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokevirtual"> The 35 * invokevirtual instruction in The Java Virtual Machine Specification</a> 36 */ 37 public class INVOKEVIRTUAL extends InvokeInstruction { 38 39 /** 40 * Empty constructor needed for Instruction.readInstruction. Not to be used otherwise. 41 */ 42 INVOKEVIRTUAL() { 43 } 44 45 public INVOKEVIRTUAL(final int index) { 46 super(Const.INVOKEVIRTUAL, index); 47 } 48 49 /** 50 * Call corresponding visitor method(s). The order is: Call visitor methods of implemented interfaces first, then call 51 * methods according to the class hierarchy in descending order, i.e., the most specific visitXXX() call comes last. 52 * 53 * @param v Visitor object 54 */ 55 @Override 56 public void accept(final Visitor v) { 57 v.visitExceptionThrower(this); 58 v.visitTypedInstruction(this); 59 v.visitStackConsumer(this); 60 v.visitStackProducer(this); 61 v.visitLoadClass(this); 62 v.visitCPInstruction(this); 63 v.visitFieldOrMethod(this); 64 v.visitInvokeInstruction(this); 65 v.visitINVOKEVIRTUAL(this); 66 } 67 68 /** 69 * Dump instruction as byte code to stream out. 70 * 71 * @param out Output stream 72 */ 73 @Override 74 public void dump(final DataOutputStream out) throws IOException { 75 out.writeByte(super.getOpcode()); 76 out.writeShort(super.getIndex()); 77 } 78 79 @Override 80 public Class<?>[] getExceptions() { 81 return ExceptionConst.createExceptions(ExceptionConst.EXCS.EXCS_FIELD_AND_METHOD_RESOLUTION, ExceptionConst.NULL_POINTER_EXCEPTION, 82 ExceptionConst.INCOMPATIBLE_CLASS_CHANGE_ERROR, ExceptionConst.ABSTRACT_METHOD_ERROR, ExceptionConst.UNSATISFIED_LINK_ERROR); 83 } 84 }