X-Git-Url: http://git.megacz.com/?p=org.ibex.classgen.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fclassgen%2FMethodGen.java;h=854b76a6b25635606dec35bddaac2361d2c2f5d1;hp=3d59a12d0cb33e06f4fb32f8422225dc21d5dcfd;hb=76a1336320be6b7dbae29acd341659ed648f9487;hpb=80f8c407ea8a178bdef7dd351d2ece8719d85147 diff --git a/src/org/ibex/classgen/MethodGen.java b/src/org/ibex/classgen/MethodGen.java index 3d59a12..854b76a 100644 --- a/src/org/ibex/classgen/MethodGen.java +++ b/src/org/ibex/classgen/MethodGen.java @@ -5,12 +5,12 @@ import java.util.*; /** A class representing a method in a generated classfile @see ClassFile#addMethod */ -public class MethodGen implements CGConst { +public class MethodGen extends Type.Class.Method.Body implements CGConst { private final static boolean EMIT_NOPS = false; private static final int NO_CODE = -1; - private final Type.Class.Method method; + public final Type.Class.Method method; private final int flags; private final ClassFile.AttrGen attrs; private final ClassFile.AttrGen codeAttrs; @@ -25,10 +25,12 @@ public class MethodGen implements CGConst { private byte[] op; private Object[] arg; private ConstantPool.Ent[] cparg; - + + // Constructors ////////////////////////////////////////////////////////////////////////////// MethodGen(Type.Class.Method method, int flags) { + method.super(); if ((flags & ~VALID_METHOD_FLAGS) != 0) throw new IllegalArgumentException("invalid flags"); this.method = method; this.flags = flags; @@ -42,10 +44,16 @@ public class MethodGen implements CGConst { } MethodGen(Type.Class c, DataInput in, ConstantPool cp) throws IOException { - this.flags = in.readShort(); + this(in.readShort(), cp.getUtf8KeyByIndex(in.readShort()), c, in, cp); } + + private MethodGen(short flags, String name, Type.Class c, DataInput in, ConstantPool cp) throws IOException { + this(flags, name, c.method(name+cp.getUtf8KeyByIndex(in.readShort())), c, in, cp); } + private MethodGen(short flags, String name, Type.Class.Method m, + Type.Class c, DataInput in, ConstantPool cp) throws IOException { + m.super(); + this.flags = flags; if ((flags & ~VALID_METHOD_FLAGS) != 0) throw new ClassFile.ClassReadExn("invalid flags"); - String name = cp.getUtf8KeyByIndex(in.readShort()); - this.method = c.method(name+cp.getUtf8KeyByIndex(in.readShort())); + this.method = m; this.attrs = new ClassFile.AttrGen(in,cp); if ((flags & (NATIVE|ABSTRACT))==0) { @@ -316,6 +324,9 @@ public class MethodGen implements CGConst { // Accessors ////////////////////////////////////////////////////////////////////////////// + public int getFlags() { return flags; } + public Hashtable getThrownExceptions() { return thrownExceptions; } + /** Returns the size (in instructions) of this method @return The size of the method (in instructions) */ @@ -943,7 +954,7 @@ public class MethodGen implements CGConst { // Debugging ////////////////////////////////////////////////////////////////////////////// - public void debugToString(StringBuffer sb, String constructorName) { + public void debugBodyToString(StringBuffer sb) { // This is intentionally a local variable so it can be removed by gcclass final String[] OP_NAMES = new String[]{ "nop", "aconst_null", "iconst_m1", "iconst_0", "iconst_1", "iconst_2", @@ -990,34 +1001,18 @@ public class MethodGen implements CGConst { "", "", "", "", "", "", "", "", "", "" }; - - sb.append(" ").append(ClassFile.flagsToString(flags,false)); - sb.append(method.debugToString()); - if (thrownExceptions.size() > 0) { - sb.append("throws"); - for(Enumeration e = thrownExceptions.keys();e.hasMoreElements();) - sb.append(" ").append(((Type.Class)e.nextElement()).debugToString()).append(","); - sb.setLength(sb.length()-1); - sb.append(" "); - } - if ((flags & (NATIVE|ABSTRACT))==0) { - sb.append("{\n"); - for(int i=0;i