private static final int NO_CODE = -1;
private static final int FINISHED = -2;
-
- private final CPGen cp;
+
+ private final ClassFile owner;
+ private final ConstantPool cp;
private final String name;
private final Type ret;
private final Type[] args;
// FIXME: attrs, body
}
- MethodGen(CPGen cp, DataInput in) throws IOException {
+ MethodGen(ConstantPool cp, DataInput in, ClassFile owner) throws IOException {
this.cp = cp;
+ this.owner = owner;
flags = in.readShort();
name = cp.getUtf8ByIndex(in.readShort());
String descriptor = cp.getUtf8ByIndex(in.readShort());
this.ret = ret;
this.args = args;
this.flags = flags;
+ this.owner = owner;
attrs = new ClassFile.AttrGen(cp);
codeAttrs = new ClassFile.AttrGen(cp);
cp.addUtf8(name);
- cp.addUtf8(getDescriptor());
+ cp.addUtf8(owner.getType().method(name, ret, args).getDescriptor());
if((owner.flags & ACC_INTERFACE) != 0 || (flags & (ACC_ABSTRACT|ACC_NATIVE)) != 0) size = capacity = -1;
maxLocals = Math.max(args.length + (flags&ACC_STATIC)==0 ? 1 : 0, 4);
}
- /** Returns the descriptor string for this method */
- public String getDescriptor() { return new MethodRef(null, name, ret, args).getDescriptor(); }
-
private class ExnTableEnt {
public int start;
public int end;
public int handler;
- public CPGen.Ent typeEnt;
- public ExnTableEnt(int start, int end, int handler, CPGen.Ent typeEnt) {
+ public ConstantPool.Ent typeEnt;
+ public ExnTableEnt(int start, int end, int handler, ConstantPool.Ent typeEnt) {
this.start = start;
this.end = end;
this.handler = handler;
if(arg instanceof Long || arg instanceof Double) op = LDC2_W;
break;
case INVOKEINTERFACE: {
- MethodRef mr = (MethodRef)arg;
- if(arg instanceof MethodRef) arg = new MethodRef.I(mr.klass, mr.name, mr.returnType, mr.argTypes);
break;
}
}
int opdata = OP_DATA[op&0xff];
- if((opdata&OP_CPENT_FLAG) != 0 && !(arg instanceof CPGen.Ent))
- arg = cp.add(arg);
+ if((opdata&OP_CPENT_FLAG) != 0 && !(arg instanceof ConstantPool.Ent)) {
+ if (op==INVOKEINTERFACE) arg = cp.add(arg, true);
+ else arg = cp.add(arg);
+ }
else if((opdata&OP_VALID_FLAG) == 0)
throw new IllegalArgumentException("unknown bytecode");
this.op[pos] = op;
break;
}
case LDC:
- j = cp.getIndex((CPGen.Ent)arg[i]);
+ j = cp.getIndex((ConstantPool.Ent)arg[i]);
if(j >= 256) this.op[i] = op = LDC_W;
break;
default:
throw new Error("should never happen");
}
} else if((opdata & OP_CPENT_FLAG) != 0) {
- int v = cp.getIndex((CPGen.Ent)arg);
+ int v = cp.getIndex((ConstantPool.Ent)arg);
if(argLength == 1) o.writeByte(v);
else if(argLength == 2) o.writeShort(v);
else throw new Error("should never happen");
baos.reset();
o.writeShort(thrownExceptions.size());
for(Enumeration e = thrownExceptions.keys();e.hasMoreElements();)
- o.writeShort(cp.getIndex((CPGen.Ent)thrownExceptions.get(e.nextElement())));
+ o.writeShort(cp.getIndex((ConstantPool.Ent)thrownExceptions.get(e.nextElement())));
attrs.add("Exceptions", baos.toByteArray());
size = capacity = FINISHED;
void dump(DataOutput o) throws IOException {
o.writeShort(flags);
o.writeShort(cp.getUtf8Index(name));
- o.writeShort(cp.getUtf8Index(getDescriptor()));
+ o.writeShort(cp.getUtf8Index(owner.getType().method(name, ret, args).getDescriptor()));
o.writeShort(attrs.size());
attrs.dump(o);
}