5 // Jackson Harper (Jackson@LatitudeGeo.com)
7 // (C) 2003 Jackson Harper, All rights reserved
12 using System.Collections;
14 namespace Mono.ILASM {
16 public class FieldDef : ICustomAttrTarget {
19 private ITypeRef type;
20 private PEAPI.FieldAttr attr;
21 private PEAPI.FieldDef field_def;
22 private ArrayList customattr_list;
23 private PEAPI.NativeType native_type;
25 private bool offset_set;
26 private bool datavalue_set;
27 private bool value_set;
29 private bool is_resolved;
32 private PEAPI.Constant constant;
33 private string at_data_id;
35 public FieldDef (PEAPI.FieldAttr attr, string name,
43 datavalue_set = false;
55 public PEAPI.FieldDef PeapiFieldDef {
56 get { return field_def; }
59 public bool IsStatic {
60 get { return (attr & PEAPI.FieldAttr.Static) != 0; }
63 public PEAPI.FieldAttr Attributes {
68 public void SetOffset (uint val)
74 public void SetValue (PEAPI.Constant constant)
77 this.constant = constant;
80 public void AddDataValue (string at_data_id)
82 this.at_data_id = at_data_id;
85 public void AddCustomAttribute (CustomAttr customattr)
87 if (customattr_list == null)
88 customattr_list = new ArrayList ();
90 customattr_list.Add (customattr);
93 public void AddMarshalInfo (PEAPI.NativeType native_type)
95 this.native_type = native_type;
98 public PEAPI.FieldDef Resolve (CodeGen code_gen)
103 type.Resolve (code_gen);
104 field_def = code_gen.PEFile.AddField (attr, name, type.PeapiType);
111 public PEAPI.FieldDef Resolve (CodeGen code_gen, PEAPI.ClassDef classdef)
116 type.Resolve (code_gen);
117 field_def = classdef.AddField (attr, name, type.PeapiType);
119 if (customattr_list != null)
120 foreach (CustomAttr customattr in customattr_list)
121 customattr.AddTo (code_gen, field_def);
123 if (native_type != null)
124 field_def.SetMarshalInfo (native_type);
132 /// Define a global field
134 public void Define (CodeGen code_gen)
137 WriteCode (code_gen, field_def);
141 /// Define a field member of the specified class
143 public void Define (CodeGen code_gen, PEAPI.ClassDef class_def)
145 Resolve (code_gen, class_def);
146 WriteCode (code_gen, field_def);
149 protected void WriteCode (CodeGen code_gen, PEAPI.FieldDef field_def)
152 field_def.SetOffset (offset);
155 PEAPI.ByteArrConst dc = constant as PEAPI.ByteArrConst;
157 dc.Type = type.PeapiType;
158 field_def.AddValue (constant);
161 if (at_data_id != null) {
162 PEAPI.DataConstant dc = code_gen.GetDataConst (at_data_id);
163 field_def.AddDataValue (dc);