5 // Jackson Harper (Jackson@LatitudeGeo.com)
7 // (C) 2003 Jackson Harper, All rights reserved
13 namespace Mono.ILASM {
15 public class FieldDef {
18 private ITypeRef type;
19 private PEAPI.FieldAttr attr;
20 private PEAPI.FieldDef field_def;
22 private bool offset_set;
23 private bool datavalue_set;
24 private bool value_set;
26 private bool is_resolved;
29 private PEAPI.Constant constant;
30 private string at_data_id;
32 public FieldDef (PEAPI.FieldAttr attr, string name,
40 datavalue_set = false;
52 public PEAPI.FieldDef PeapiFieldDef {
53 get { return field_def; }
56 public void SetOffset (uint val)
62 public void SetValue (PEAPI.Constant constant)
65 this.constant = constant;
68 public void AddDataValue (string at_data_id)
70 this.at_data_id = at_data_id;
73 public PEAPI.FieldDef Resolve (CodeGen code_gen)
78 type.Resolve (code_gen);
79 field_def = code_gen.PEFile.AddField (attr, name, type.PeapiType);
86 public PEAPI.FieldDef Resolve (CodeGen code_gen, PEAPI.ClassDef classdef)
91 type.Resolve (code_gen);
92 field_def = classdef.AddField (attr, name, type.PeapiType);
100 /// Define a global field
102 public void Define (CodeGen code_gen)
105 WriteCode (code_gen, field_def);
109 /// Define a field member of the specified class
111 public void Define (CodeGen code_gen, PEAPI.ClassDef class_def)
113 Resolve (code_gen, class_def);
114 WriteCode (code_gen, field_def);
117 protected void WriteCode (CodeGen code_gen, PEAPI.FieldDef field_def)
120 field_def.SetOffset (offset);
123 PEAPI.DataConstant dc = constant as PEAPI.DataConstant;
125 dc.Type = type.PeapiType;
126 field_def.AddValue (constant);
129 if (at_data_id != null) {
130 PEAPI.DataConstant dc = code_gen.GetDataConst (at_data_id);
131 field_def.AddDataValue (dc);