* CodeGen.cs: Add methods for adding data. CodeGen now takes a
[mono.git] / mcs / ilasm / codegen / FieldDef.cs
1 //
2 // Mono.ILASM.FieldDef
3 //
4 // Author(s):
5 //  Jackson Harper (Jackson@LatitudeGeo.com)
6 //
7 // (C) 2003 Jackson Harper, All rights reserved
8 //
9
10
11 using System;
12
13 namespace Mono.ILASM {
14
15         public class FieldDef {
16
17                 private string name;
18                 private ITypeRef type;
19                 private PEAPI.FieldAttr attr;
20                 private PEAPI.FieldDef field_def;
21
22                 private bool offset_set;
23                 private bool datavalue_set;
24                 private bool value_set;
25
26                 private bool is_resolved;
27
28                 private uint offset;
29                 private PEAPI.Constant constant;
30                 private string at_data_id;
31
32                 public FieldDef (PEAPI.FieldAttr attr, string name,
33                                 ITypeRef type)
34                 {
35                         this.attr = attr;
36                         this.name = name;
37                         this.type = type;
38
39                         offset_set = false;
40                         datavalue_set = false;
41                         value_set = false;
42
43                         at_data_id = null;
44
45                         is_resolved = false;
46                 }
47
48                 public string Name {
49                         get { return name; }
50                 }
51
52                 public PEAPI.FieldDef PeapiFieldDef {
53                         get { return field_def; }
54                 }
55
56                 public void SetOffset (uint val)
57                 {
58                         offset_set = true;
59                         offset = val;
60                 }
61
62                 public void SetValue (PEAPI.Constant constant)
63                 {
64                         value_set = true;
65                         this.constant = constant;
66                 }
67
68                 public void AddDataValue (string at_data_id)
69                 {
70                         this.at_data_id = at_data_id;
71                 }
72
73                 public PEAPI.FieldDef Resolve (CodeGen code_gen)
74                 {
75                         if (is_resolved)
76                                 return field_def;
77
78                         type.Resolve (code_gen);
79                         field_def = code_gen.PEFile.AddField (attr, name, type.PeapiType);
80
81                         is_resolved = true;
82
83                         return field_def;
84                 }
85
86                 public PEAPI.FieldDef Resolve (CodeGen code_gen, PEAPI.ClassDef classdef)
87                 {
88                         if (is_resolved)
89                                 return field_def;
90
91                         type.Resolve (code_gen);
92                         field_def = classdef.AddField (attr, name, type.PeapiType);
93
94                         is_resolved = true;
95
96                         return field_def;
97                 }
98
99                 /// <summary>
100                 ///  Define a global field
101                 /// </summary>
102                 public void Define (CodeGen code_gen)
103                 {
104                         Resolve (code_gen);
105                         WriteCode (code_gen, field_def);
106                 }
107
108                 /// <summary>
109                 ///  Define a field member of the specified class
110                 /// </summary>
111                 public void Define (CodeGen code_gen, PEAPI.ClassDef class_def)
112                 {
113                         Resolve (code_gen, class_def);
114                         WriteCode (code_gen, field_def);
115                 }
116
117                 protected void WriteCode (CodeGen code_gen, PEAPI.FieldDef field_def)
118                 {
119                         if (offset_set)
120                                 field_def.SetOffset (offset);
121
122                         if (value_set)
123                                 field_def.AddValue (constant);
124
125                         if (at_data_id != null) {
126                                 PEAPI.DataConstant dc = code_gen.GetDataConst (at_data_id);
127                                 field_def.AddDataValue (dc);
128                         }
129                 }
130         }
131
132 }
133