00001 package de.fub.bytecode.generic;
00002
00003 import de.fub.bytecode.Constants;
00004 import de.fub.bytecode.classfile.*;
00005 import java.util.StringTokenizer;
00006
00007
00008
00009
00010
00011
00012
00013 public abstract class InvokeInstruction extends FieldOrMethod implements ExceptionThrower {
00014
00015
00016
00017
00018 InvokeInstruction() {}
00019
00020
00021
00022 protected InvokeInstruction(short tag, int index) {
00023 super(tag, index);
00024 }
00025
00026
00027
00028
00029
00030 public int consumeStack(ConstantPoolGen cpg) {
00031 String signature = getSignature(cpg);
00032 Type[] args = Type.getArgumentTypes(signature);
00033 int sum;
00034
00035 if(tag == Constants.INVOKESTATIC)
00036 sum = 0;
00037 else
00038 sum = 1;
00039
00040 int n = args.length;
00041 for (int i = 0; i < n; i++)
00042 sum += args[i].getSize();
00043
00044 return sum;
00045 }
00046
00047
00048 public Type[] getArgumentTypes(ConstantPoolGen cpg) {
00049 return Type.getArgumentTypes(getSignature(cpg));
00050 }
00051
00052
00053 public String getMethodName(ConstantPoolGen cpg) {
00054 return getName(cpg);
00055 }
00056
00057
00058 public Type getReturnType(ConstantPoolGen cpg) {
00059 return Type.getReturnType(getSignature(cpg));
00060 }
00061
00062
00063 public Type getType(ConstantPoolGen cpg) {
00064 return getReturnType(cpg);
00065 }
00066
00067
00068
00069
00070
00071 public int produceStack(ConstantPoolGen cpg) {
00072 return getReturnType(cpg).getSize();
00073 }
00074
00075
00076
00077 public String toString(ConstantPool cp) {
00078 Constant c = cp.getConstant(index);
00079 StringTokenizer tok = new StringTokenizer(cp.constantToString(c));
00080
00081 return OPCODE_NAMES[tag] + " " +
00082 tok.nextToken().replace('.', '/') + tok.nextToken();
00083 }
00084 }