* ILParser.jay: Use type instead of params for calli signatures.
[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
31                 public FieldDef (PEAPI.FieldAttr attr, string name,
32                                 ITypeRef type)
33                 {
34                         this.attr = attr;
35                         this.name = name;
36                         this.type = type;
37
38                         offset_set = false;
39                         datavalue_set = false;
40                         value_set = false;
41
42                         is_resolved = false;
43                 }
44
45                 public string Name {
46                         get { return name; }
47                 }
48
49                 public PEAPI.FieldDef PeapiFieldDef {
50                         get { return field_def; }
51                 }
52
53                 public void SetOffset (uint val)
54                 {
55                         offset_set = true;
56                         offset = val;
57                 }
58
59                 public void SetValue (PEAPI.Constant constant)
60                 {
61                         value_set = true;
62                         this.constant = constant;
63                 }
64
65                 public PEAPI.FieldDef Resolve (CodeGen code_gen)
66                 {
67                         if (is_resolved)
68                                 return field_def;
69
70                         type.Resolve (code_gen);
71                         field_def = code_gen.PEFile.AddField (attr, name, type.PeapiType);
72
73                         is_resolved = true;
74
75                         return field_def;
76                 }
77
78                 public PEAPI.FieldDef Resolve (CodeGen code_gen, PEAPI.ClassDef classdef)
79                 {
80                         if (is_resolved)
81                                 return field_def;
82
83                         type.Resolve (code_gen);
84                         field_def = classdef.AddField (attr, name, type.PeapiType);
85
86                         is_resolved = true;
87
88                         return field_def;
89                 }
90
91                 /// <summary>
92                 ///  Define a global field
93                 /// </summary>
94                 public void Define (CodeGen code_gen)
95                 {
96                         Resolve (code_gen);
97                         WriteCode (field_def);
98                 }
99
100                 /// <summary>
101                 ///  Define a field member of the specified class
102                 /// </summary>
103                 public void Define (CodeGen code_gen, PEAPI.ClassDef class_def)
104                 {
105                         Resolve (code_gen, class_def);
106                         WriteCode (field_def);
107                 }
108
109                 protected void WriteCode (PEAPI.FieldDef field_def)
110                 {
111                         if (offset_set)
112                                 field_def.SetOffset (offset);
113
114                         if (value_set)
115                                 field_def.AddValue (constant);
116                 }
117         }
118
119 }
120