X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fclassgen%2FFieldGen.java;h=b6573428f6327ceeab309b6bb02b215344fc8568;hb=069115fd4de6720de0a4a1ee37f05fec438fc325;hp=e2371d02a3e3e985bf9e8c776566774c0c9ee28c;hpb=0087af3d283954bbeeaaa857914ce9e06c39fcc7;p=org.ibex.classgen.git diff --git a/src/org/ibex/classgen/FieldGen.java b/src/org/ibex/classgen/FieldGen.java index e2371d0..b657342 100644 --- a/src/org/ibex/classgen/FieldGen.java +++ b/src/org/ibex/classgen/FieldGen.java @@ -2,31 +2,61 @@ package org.ibex.classgen; 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 ClassGen.AttrGen attrs; + private final ClassFile.AttrGen attrs; + + StringBuffer debugToString(StringBuffer sb) { + sb.append(ClassFile.flagsToString(flags,false)); + sb.append(type.debugToString()); + sb.append(" "); + sb.append(name); + if(attrs.contains("ConstantValue")) + sb.append(" = \"").append(attrs.get("ConstantValue")).append("\""); + sb.append(";"); + return sb; + } - 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) + FieldGen(DataInput in, ConstantPool cp) throws IOException { + flags = in.readShort(); + if((flags & ~(PUBLIC|PRIVATE|PROTECTED|VOLATILE|TRANSIENT|STATIC|FINAL)) != 0) + throw new ClassFile.ClassReadExn("invalid flags"); + name = cp.getUtf8KeyByIndex(in.readShort()); + type = Type.instance(cp.getUtf8KeyByIndex(in.readShort())); + attrs = new ClassFile.AttrGen(in,cp); + } + + FieldGen(ClassFile owner, String name, Type type, int flags) { + if((flags & ~(PUBLIC|PRIVATE|PROTECTED|VOLATILE|TRANSIENT|STATIC|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); - + this.attrs = new ClassFile.AttrGen(); + } + + /** 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 & STATIC) == 0) throw new IllegalStateException("field does not have the STATIC bit set"); + attrs.put("ConstantValue",val); + } + + void finish(ConstantPool cp) { cp.addUtf8(name); cp.addUtf8(type.getDescriptor()); + + attrs.finish(cp); } - public void dump(DataOutput o) throws IOException { + void dump(DataOutput o, ConstantPool cp) throws IOException { o.writeShort(flags); o.writeShort(cp.getUtf8Index(name)); o.writeShort(cp.getUtf8Index(type.getDescriptor())); - o.writeShort(attrs.size()); - attrs.dump(o); + attrs.dump(o,cp); } }