[corlib] Assume UTC if no $TZ set. Fixes #30360
[mono.git] / mcs / ilasm / codegen / Class.cs
1 // Class.cs\r
2 // (C) Sergey Chaban (serge@wildwestsoftware.com)\r
3 \r
4 using System;\r
5 using System.Collections;\r
6 using System.Reflection;\r
7 using System.Reflection.Emit;\r
8 \r
9 namespace Mono.ILASM {\r
10 \r
11         /// <summary>\r
12         /// </summary>\r
13         public class ClassName {\r
14 \r
15                 private string name;\r
16                 private string assembly;\r
17                 private string module;\r
18 \r
19 \r
20                 /// <summary>\r
21                 /// </summary>\r
22                 /// <param name="name"></param>\r
23                 public ClassName (string name) {\r
24                         this.name = name;\r
25                         this.assembly = String.Empty;\r
26                         this.module = String.Empty;\r
27                 }\r
28 \r
29 \r
30                 public string Name {\r
31                         get {\r
32                                 return name;\r
33                         }\r
34                 }\r
35 \r
36 \r
37         }\r
38 \r
39 \r
40         /// <summary>\r
41         /// </summary>\r
42         public class Class {\r
43 \r
44                 private string name;\r
45 \r
46                 // extends clause\r
47                 private ClassName baseClass;\r
48 \r
49                 // implements clause\r
50                 private ArrayList interfaces;\r
51 \r
52                 private ArrayList methods;\r
53 \r
54                 private TypeBuilder tb;\r
55 \r
56                 private CodeGen codgen;\r
57 \r
58                 private TypeAttributes attrs;\r
59 \r
60 \r
61 \r
62                 /// <summary>\r
63                 /// </summary>\r
64                 /// <param name="name"></param>\r
65                 public Class (string name)\r
66                 {\r
67                         this.name = name;\r
68                 }\r
69 \r
70 \r
71 \r
72                 /// <summary>\r
73                 /// </summary>\r
74                 /// <param name="m"></param>\r
75                 public void AddMethod (Method m)\r
76                 {\r
77                         if (methods == null) methods = new ArrayList ();\r
78                         methods.Add (m);\r
79                 }\r
80 \r
81 \r
82                 /// <summary>\r
83                 /// </summary>\r
84                 public CodeGen CodeGen {\r
85                         get {\r
86                                 return codgen;\r
87                         }\r
88                 }\r
89 \r
90 \r
91                 /// <summary>\r
92                 /// </summary>\r
93                 public TypeAttributes Attrs {\r
94                         get {\r
95                                 return attrs;\r
96                         }\r
97                         set {\r
98                                 attrs = value;\r
99                         }\r
100                 }\r
101 \r
102 \r
103                 /// <summary>\r
104                 /// </summary>\r
105                 public TypeBuilder TypeBuilder {\r
106                         get {\r
107                                 if (tb == null && codgen != null) {\r
108                                         tb = codgen.ModBuilder.DefineType (name, Attrs);\r
109                                 }\r
110                                 return tb;\r
111                         }\r
112                 }\r
113 \r
114                 /// <summary>\r
115                 /// </summary>\r
116                 /// <param name="cg"></param>\r
117                 public void Emit (CodeGen cg)\r
118                 {\r
119                         codgen = cg;\r
120                         \r
121                         TypeBuilder.CreateType();\r
122                         cg.TypeManager[name] = TypeBuilder;\r
123 \r
124                         if (methods != null) {\r
125                                 foreach (Method m in methods) \r
126                                         m.Resolve (this);\r
127                         }\r
128 \r
129                         if (methods != null) {\r
130                                 foreach (Method m in methods) {\r
131                                         m.Emit (this);\r
132                                         if (m.IsEntryPoint)\r
133                                                 cg.SetEntryPoint (m.Builder);\r
134                                 }\r
135                         }       \r
136                 }\r
137                 \r
138                 // This can be removed when System.Reflection.Emit.TypeBuilder.GetMethod is implemented\r
139                 // TODO: This function needs allot of work\r
140                 public MethodInfo GetMethod (string method_name, BindingFlags binding_flags,\r
141                         Type[] param_type_list)\r
142                 {\r
143                         foreach (Method method in methods) {\r
144                                 if (method.Name != method_name)\r
145                                         continue;\r
146                                 ParameterInfo[] param_info = method.Builder.GetParameters ();\r
147                                 if (param_info == null) {\r
148                                         if (param_type_list.Length == 0)\r
149                                                 return method.Builder;\r
150                                         else\r
151                                                 continue;\r
152                                 }\r
153                                 int size = param_info.Length;\r
154                                 if (param_type_list.Length != size)\r
155                                         continue;\r
156                                 for (int i=0; i<size; i++) {\r
157                                         if (param_type_list[i] != param_info[i].ParameterType)\r
158                                                 goto end;       \r
159                                 }\r
160 \r
161                                 return method.Builder;\r
162                                 end: continue;\r
163                         }\r
164         \r
165                         return null;\r
166                 }\r
167         }\r
168 }\r
169 \r