X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fclassgen%2FFieldGen.java;h=3640834f87aa20f5e9eb05aafb418da46a800c02;hb=11cdbef43dc7391d2e1a7d38a38994934a504d34;hp=cf269d01973fc7502fa1d14cca605e709785ebb4;hpb=6c44a3470c1ae5c0e54153871805e24e394a96bb;p=org.ibex.classgen.git diff --git a/src/org/ibex/classgen/FieldGen.java b/src/org/ibex/classgen/FieldGen.java index cf269d0..3640834 100644 --- a/src/org/ibex/classgen/FieldGen.java +++ b/src/org/ibex/classgen/FieldGen.java @@ -4,63 +4,47 @@ import java.io.*; /** Class representing a field in a generated classfile @see ClassFile#addField */ -public class FieldGen implements CGConst { - private final CPGen cp; - private final String name; - private final Type type; - private final int flags; - private final ClassFile.AttrGen attrs; - - private Object constantValue; +public class FieldGen extends Type.Class.Field.Body { - public String toString() { StringBuffer sb = new StringBuffer(); toString(sb); return sb.toString(); } - public void toString(StringBuffer sb) { - sb.append(ClassFile.flagsToString(flags)); - sb.append(type); + StringBuffer debugToString(StringBuffer sb) { + sb.append(ClassFile.flagsToString(flags, false)); + sb.append(getField().getType().debugToString()); sb.append(" "); - sb.append(name); + sb.append(getField().getName()); + if (attrs.contains("ConstantValue")) sb.append(" = \"").append(attrs.get("ConstantValue")).append("\""); sb.append(";"); - // FIXME: attrs + return sb; } - FieldGen(CPGen cp, DataInput in) throws IOException { - this.cp = cp; - flags = in.readShort(); - name = cp.getUtf8ByIndex(in.readShort()); - type = cp.getType(in.readShort()); - attrs = new ClassFile.AttrGen(cp, in); + FieldGen(Type.Class c, DataInput in, ConstantPool cp) throws IOException { + this(in.readShort(), + c.field(cp.getUtf8KeyByIndex(in.readShort()), + Type.fromDescriptor(cp.getUtf8KeyByIndex(in.readShort()))), + new ClassFile.AttrGen(in, cp)); } - FieldGen(ClassFile owner, String name, Type type, int flags) { - if((flags & ~(ACC_PUBLIC|ACC_PRIVATE|ACC_PROTECTED|ACC_VOLATILE|ACC_TRANSIENT|ACC_STATIC|ACC_FINAL)) != 0) - throw new IllegalArgumentException("invalid flags"); - this.cp = owner.cp; - this.name = name; - this.type = type; - this.flags = flags; - this.attrs = new ClassFile.AttrGen(cp); - - cp.addUtf8(name); - cp.addUtf8(type.getDescriptor()); - } + private FieldGen(int flags, Type.Class.Field field, ClassFile.AttrGen attrs) { this(field, flags, attrs); } + FieldGen(Type.Class.Field field, int flags) { this(field, flags, new ClassFile.AttrGen()); } + FieldGen(Type.Class.Field field, int flags, ClassFile.AttrGen attrs) { field.super(flags, attrs); } /** Sets the ContantValue attribute for this field. @param val The value to set this field to. Must be an Integer, Long, Float, Double, or String */ public void setConstantValue(Object val) { - if((flags & ACC_STATIC) == 0) throw new IllegalStateException("field does not have the ACC_STATIC bit set"); - constantValue = val; + if (!isStatic()) throw new IllegalStateException("field does not have the STATIC bit set"); + attrs.put("ConstantValue",val); } - void finish() { - if(constantValue != null && !attrs.contains("ConstantValue")) - attrs.add("ConstantValue", cp.add(constantValue)); + void finish(ConstantPool cp) { + cp.addUtf8(getField().getName()); + cp.addUtf8(getField().getType().getDescriptor()); + + attrs.finish(cp); } - void dump(DataOutput o) throws IOException { - o.writeShort(flags); - o.writeShort(cp.getUtf8Index(name)); - o.writeShort(cp.getUtf8Index(type.getDescriptor())); - o.writeShort(attrs.size()); - attrs.dump(o); + void dump(DataOutput o, ConstantPool cp) throws IOException { + o.writeShort(getFlags()); + o.writeShort(cp.getUtf8Index(getField().getName())); + o.writeShort(cp.getUtf8Index(getField().getType().getDescriptor())); + attrs.dump(o,cp); } }