X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fclassgen%2FFieldGen.java;h=826eb7884c56f1efe674f353c3a104bfb7dd6be7;hb=b0c281117174062552c6470cc78b565163748a4d;hp=805a7278ce25596f133755ccf444345a15633333;hpb=cb0bae954e7dd0067e77c436c78ee19ace52d9e3;p=org.ibex.classgen.git diff --git a/src/org/ibex/classgen/FieldGen.java b/src/org/ibex/classgen/FieldGen.java index 805a727..826eb78 100644 --- a/src/org/ibex/classgen/FieldGen.java +++ b/src/org/ibex/classgen/FieldGen.java @@ -2,8 +2,47 @@ package org.ibex.classgen; import java.io.*; -public class FieldGen { - public void dump(DataOutput o) { - throw new Error("FIXME"); +/** Class representing a field in a generated classfile + @see ClassGen#addField */ +public class FieldGen implements CGConst { + private final CPGen cp; + private final String name; + private final Type type; + private final int flags; + private final ClassGen.AttrGen attrs; + + private Object constantValue; + + FieldGen(ClassGen 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 ClassGen.AttrGen(cp); + + cp.addUtf8(name); + cp.addUtf8(type.getDescriptor()); + } + + /** 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; + } + + void finish() { + if(constantValue != null && !attrs.contains("ConstantValue")) + attrs.add("ConstantValue",cp.add(constantValue)); + } + + 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); } }