package reflect; import icecaptools.IcecapCVar; import icecaptools.IcecapCompileMe; import vm.Address; import vm.Machine; import vm.HardwareObject; public abstract class MethodInfo extends HardwareObject { public short classIndex; public short maxStack; public short maxLocals; public short codeSize; public byte numExceptionHandlers; public byte numArgs; public byte minfo; @IcecapCVar(expression = "NUMBEROFMETHODS", requiredIncludes = "") private static short NUMBEROFMETHODS_var; private static String[] names; private static MethodInfo[] infos; public MethodInfo(Address address) { super(address); } @IcecapCompileMe public static short getNumberOfMethods() { return NUMBEROFMETHODS_var; } protected abstract Address getNameRef(); @IcecapCompileMe public static MethodInfo getMethodInfo(short index) { MethodInfo mi = getCachedInfo(index); if (mi == null) { switch (Machine.architecture) { case Machine.X86_64: mi = new MethodInfoX86_64(index); break; default: mi = new MethodInfoX86_32(index); } setCachedInfo(mi, index); } return mi; } private static void setCachedInfo(MethodInfo mi, short index) { if (infos == null) { infos = new MethodInfo[getNumberOfMethods()]; } infos[index] = mi; } private static MethodInfo getCachedInfo(short index) { if (infos == null) { return null; } else { return infos[index]; } } public String getName(short index) { String name = getCachedName(index); if (name == null) { StringBuffer buffer = new StringBuffer(); CString cstring = new CString(getNameRef()); while (cstring.hasNext()) { buffer.append(cstring.next()); } name = buffer.toString(); setCachedName(name, index); } return name; } private void setCachedName(String name, short index) { if (names == null) { names = new String[getNumberOfMethods()]; } names[index] = name; } private String getCachedName(short index) { if (names == null) { return null; } else { return names[index]; } } }