X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fclassgen%2FMethodGen.java;h=bc80d75d731129bb116f3cc7156a95065318fb0b;hb=0b535cb6b45f0d8a1d43eee75a3fe187ed383ef8;hp=854b76a6b25635606dec35bddaac2361d2c2f5d1;hpb=76a1336320be6b7dbae29acd341659ed648f9487;p=org.ibex.classgen.git diff --git a/src/org/ibex/classgen/MethodGen.java b/src/org/ibex/classgen/MethodGen.java index 854b76a..bc80d75 100644 --- a/src/org/ibex/classgen/MethodGen.java +++ b/src/org/ibex/classgen/MethodGen.java @@ -5,14 +5,12 @@ import java.util.*; /** A class representing a method in a generated classfile @see ClassFile#addMethod */ -public class MethodGen extends Type.Class.Method.Body implements CGConst { +public class MethodGen extends Type.Class.Method.Body { private final static boolean EMIT_NOPS = false; private static final int NO_CODE = -1; public final Type.Class.Method method; - private final int flags; - private final ClassFile.AttrGen attrs; private final ClassFile.AttrGen codeAttrs; private final Vector exnTable = new Vector(); private final Hashtable thrownExceptions = new Hashtable(); @@ -30,16 +28,10 @@ public class MethodGen extends Type.Class.Method.Body implements CGConst { // Constructors ////////////////////////////////////////////////////////////////////////////// MethodGen(Type.Class.Method method, int flags) { - method.super(); - if ((flags & ~VALID_METHOD_FLAGS) != 0) throw new IllegalArgumentException("invalid flags"); + method.super(flags, new ClassFile.AttrGen()); this.method = method; - this.flags = flags; - - attrs = new ClassFile.AttrGen(); codeAttrs = new ClassFile.AttrGen(); - - if (((flags & INTERFACE) != 0) || (flags & (ABSTRACT|NATIVE)) != 0) size = capacity = -1; - + if (!isConcrete()) size = capacity = -1; maxLocals = Math.max(method.getNumArgs() + (flags&STATIC)==0 ? 1 : 0, 4); } @@ -50,13 +42,10 @@ public class MethodGen extends Type.Class.Method.Body implements CGConst { 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"); + m.super(flags, new ClassFile.AttrGen(in,cp)); this.method = m; - this.attrs = new ClassFile.AttrGen(in,cp); - if ((flags & (NATIVE|ABSTRACT))==0) { + if (isConcrete()) { byte[] codeAttr = (byte[]) attrs.get("Code"); if (codeAttr == null) throw new ClassFile.ClassReadExn("code attr expected"); DataInputStream ci = new DataInputStream(new ByteArrayInputStream(codeAttr)); @@ -579,7 +568,7 @@ public class MethodGen extends Type.Class.Method.Body implements CGConst { */ void finish(ConstantPool cp) { cp.addUtf8(method.name); - cp.addUtf8(method.getDescriptor()); + cp.addUtf8(method.getTypeDescriptor()); for(Enumeration e = thrownExceptions.keys();e.hasMoreElements();) cp.add(e.nextElement()); @@ -901,7 +890,7 @@ public class MethodGen extends Type.Class.Method.Body implements CGConst { o.writeShort(flags); o.writeShort(cp.getUtf8Index(method.name)); - o.writeShort(cp.getUtf8Index(method.getDescriptor())); + o.writeShort(cp.getUtf8Index(method.getTypeDescriptor())); attrs.dump(o,cp); } @@ -1008,7 +997,7 @@ public class MethodGen extends Type.Class.Method.Body implements CGConst { sb.append(OP_NAMES[op[i]&0xff]); String s = null; if (arg[i] instanceof Type) s = ((Type)arg[i]).debugToString(); - else if (arg[i] instanceof Type.Class.Member) s = ((Type.Class.Member)arg[i]).toString(); + else if (arg[i] instanceof Type.Class.Member) s = ((Type.Class.Member)arg[i]).debugToString(); else if (arg[i] instanceof String) s = "\"" + s + "\""; else if (arg[i] != null) s = arg[i].toString(); if (s != null) sb.append(" ").append(s);