IKVM11  11
Java SE 11 Virtual Machine for .NET
Loading...
Searching...
No Matches
TypeDefImpl.cs
Go to the documentation of this file.
1/*
2 Copyright (C) 2009-2011 Jeroen Frijters
3
4 This software is provided 'as-is', without any express or implied
5 warranty. In no event will the authors be held liable for any damages
6 arising from the use of this software.
7
8 Permission is granted to anyone to use this software for any purpose,
9 including commercial applications, and to alter it and redistribute it
10 freely, subject to the following restrictions:
11
12 1. The origin of this software must not be misrepresented; you must not
13 claim that you wrote the original software. If you use this software
14 in a product, an acknowledgment in the product documentation would be
15 appreciated but is not required.
16 2. Altered source versions must be plainly marked as such, and must not be
17 misrepresented as being the original software.
18 3. This notice may not be removed or altered from any source distribution.
19
20 Jeroen Frijters
21 jeroen@frijters.net
22
23*/
24using System;
25using System.Collections.Generic;
26using System.Text;
27
29
31{
32
33 sealed class TypeDefImpl : TypeInfo
34 {
35
36 readonly ModuleReader module;
37 readonly int index;
38 readonly string typeName;
39 readonly string typeNamespace;
40
41 Type[] typeArgs;
42
48 internal TypeDefImpl(ModuleReader module, int index)
49 {
50 this.module = module;
51 this.index = index;
52 this.typeName = module.GetString(module.TypeDefTable.records[index].TypeName);
53 this.typeNamespace = module.GetString(module.TypeDefTable.records[index].TypeNamespace);
54 MarkKnownType(typeNamespace, typeName);
55 }
56
57 public override Type BaseType
58 {
59 get
60 {
61 var extends = module.TypeDefTable.records[index].Extends;
62 if ((extends & 0xFFFFFF) == 0)
63 return null;
64
65 return module.ResolveType(extends, this);
66 }
67 }
68
69 public override TypeAttributes Attributes
70 {
71 get { return (TypeAttributes)module.TypeDefTable.records[index].Flags; }
72 }
73
74 public override EventInfo[] __GetDeclaredEvents()
75 {
76 foreach (var i in module.EventMapTable.Filter(this.MetadataToken))
77 {
78 var evt = module.EventMapTable.records[i].EventList - 1;
79 var end = module.EventMapTable.records.Length > i + 1 ? module.EventMapTable.records[i + 1].EventList - 1 : module.EventTable.records.Length;
80 var events = new EventInfo[end - evt];
81 if (module.EventPtrTable.RowCount == 0)
82 for (int j = 0; evt < end; evt++, j++)
83 events[j] = new EventInfoImpl(module, this, evt);
84 else
85 for (int j = 0; evt < end; evt++, j++)
86 events[j] = new EventInfoImpl(module, this, module.EventPtrTable.records[evt] - 1);
87
88 return events;
89 }
90
91 return Array.Empty<EventInfo>();
92 }
93
94 public override FieldInfo[] __GetDeclaredFields()
95 {
96 var field = module.TypeDefTable.records[index].FieldList - 1;
97 var end = module.TypeDefTable.records.Length > index + 1 ? module.TypeDefTable.records[index + 1].FieldList - 1 : module.FieldTable.records.Length;
98 var fields = new FieldInfo[end - field];
99 if (module.FieldPtrTable.RowCount == 0)
100 for (int i = 0; field < end; i++, field++)
101 fields[i] = module.GetFieldAt(this, field);
102 else
103 for (int i = 0; field < end; i++, field++)
104 fields[i] = module.GetFieldAt(this, module.FieldPtrTable.records[field] - 1);
105
106 return fields;
107 }
108
109 public override Type[] __GetDeclaredInterfaces()
110 {
111 List<Type> list = null;
112 foreach (int i in module.InterfaceImplTable.Filter(MetadataToken))
113 {
114 list ??= new List<Type>();
115 list.Add(module.ResolveType(module.InterfaceImplTable.records[i].Interface, this));
116 }
117
118 return Util.ToArray(list, Type.EmptyTypes);
119 }
120
121 public override MethodBase[] __GetDeclaredMethods()
122 {
123 var method = module.TypeDefTable.records[index].MethodList - 1;
124 var end = module.TypeDefTable.records.Length > index + 1 ? module.TypeDefTable.records[index + 1].MethodList - 1 : module.MethodDefTable.records.Length;
125 var methods = new MethodBase[end - method];
126 if (module.MethodPtrTable.RowCount == 0)
127 for (int i = 0; method < end; method++, i++)
128 methods[i] = module.GetMethodAt(this, method);
129 else
130 for (int i = 0; method < end; method++, i++)
131 methods[i] = module.GetMethodAt(this, module.MethodPtrTable.records[method] - 1);
132
133 return methods;
134 }
135
136 public override __MethodImplMap __GetMethodImplMap()
137 {
138 PopulateGenericArguments();
139
140 var bodies = new List<MethodInfo>();
141 var declarations = new List<List<MethodInfo>>();
142 foreach (int i in module.MethodImplTable.Filter(this.MetadataToken))
143 {
144 var body = (MethodInfo)module.ResolveMethod(module.MethodImplTable.records[i].MethodBody, typeArgs, null);
145 int index = bodies.IndexOf(body);
146 if (index == -1)
147 {
148 index = bodies.Count;
149 bodies.Add(body);
150 declarations.Add(new List<MethodInfo>());
151 }
152
153 var declaration = (MethodInfo)module.ResolveMethod(module.MethodImplTable.records[i].MethodDeclaration, typeArgs, null);
154 declarations[index].Add(declaration);
155 }
156
157 var map = new __MethodImplMap();
158 map.TargetType = this;
159 map.MethodBodies = bodies.ToArray();
160 map.MethodDeclarations = new MethodInfo[declarations.Count][];
161 for (var i = 0; i < map.MethodDeclarations.Length; i++)
162 map.MethodDeclarations[i] = declarations[i].ToArray();
163
164 return map;
165 }
166
167 public override Type[] __GetDeclaredTypes()
168 {
169 var token = this.MetadataToken;
170 var list = new List<Type>();
171
172 // note that the NestedClass table is sorted on NestedClass, so we can't use binary search
173 for (int i = 0; i < module.NestedClassTable.records.Length; i++)
174 if (module.NestedClassTable.records[i].EnclosingClass == token)
175 list.Add(module.ResolveType(module.NestedClassTable.records[i].NestedClass));
176
177 return list.ToArray();
178 }
179
180 public override PropertyInfo[] __GetDeclaredProperties()
181 {
182 foreach (var i in module.PropertyMapTable.Filter(this.MetadataToken))
183 {
184 var property = module.PropertyMapTable.records[i].PropertyList - 1;
185 var end = module.PropertyMapTable.records.Length > i + 1 ? module.PropertyMapTable.records[i + 1].PropertyList - 1 : module.PropertyTable.records.Length;
186 var properties = new PropertyInfo[end - property];
187 if (module.PropertyPtrTable.RowCount == 0)
188 for (int j = 0; property < end; property++, j++)
189 properties[j] = new PropertyInfoImpl(module, this, property);
190 else
191 for (int j = 0; property < end; property++, j++)
192 properties[j] = new PropertyInfoImpl(module, this, module.PropertyPtrTable.records[property] - 1);
193
194 return properties;
195 }
196
197 return Array.Empty<PropertyInfo>();
198 }
199
200 internal override TypeName TypeName
201 {
202 get { return new TypeName(typeNamespace, typeName); }
203 }
204
205 public override string Name
206 {
207 get { return TypeNameParser.Escape(typeName); }
208 }
209
210 public override string FullName
211 {
212 get { return GetFullName(); }
213 }
214
215 public override int MetadataToken
216 {
217 get { return (TypeDefTable.Index << 24) + index + 1; }
218 }
219
220 public override Type[] GetGenericArguments()
221 {
222 PopulateGenericArguments();
223 return Util.Copy(typeArgs);
224 }
225
226 private void PopulateGenericArguments()
227 {
228 if (typeArgs == null)
229 {
230 var token = this.MetadataToken;
231 var first = module.GenericParamTable.FindFirstByOwner(token);
232 if (first == -1)
233 {
234 typeArgs = Type.EmptyTypes;
235 }
236 else
237 {
238 var list = new List<Type>();
239 var len = module.GenericParamTable.records.Length;
240 for (int i = first; i < len && module.GenericParamTable.records[i].Owner == token; i++)
241 list.Add(new GenericTypeParameter(module, i, Signature.ELEMENT_TYPE_VAR));
242
243 typeArgs = list.ToArray();
244 }
245 }
246 }
247
248 internal override Type GetGenericTypeArgument(int index)
249 {
250 PopulateGenericArguments();
251 return typeArgs[index];
252 }
253
254 public override CustomModifiers[] __GetGenericArgumentsCustomModifiers()
255 {
256 PopulateGenericArguments();
257 return new CustomModifiers[typeArgs.Length];
258 }
259
260 public override bool IsGenericType
261 {
262 get { return IsGenericTypeDefinition; }
263 }
264
265 public override bool IsGenericTypeDefinition
266 {
267 get
268 {
269 if ((typeFlags & (TypeFlags.IsGenericTypeDefinition | TypeFlags.NotGenericTypeDefinition)) == 0)
270 typeFlags |= module.GenericParamTable.FindFirstByOwner(MetadataToken) == -1 ? TypeFlags.NotGenericTypeDefinition : TypeFlags.IsGenericTypeDefinition;
271
272 return (typeFlags & TypeFlags.IsGenericTypeDefinition) != 0;
273 }
274 }
275
276 public override Type GetGenericTypeDefinition()
277 {
278 return IsGenericTypeDefinition ? (Type)this : throw new InvalidOperationException();
279 }
280
281 public override string ToString()
282 {
283 var sb = new StringBuilder(this.FullName);
284 var sep = "[";
285
286 foreach (var arg in GetGenericArguments())
287 {
288 sb.Append(sep);
289 sb.Append(arg);
290 sep = ",";
291 }
292
293 if (sep != "[")
294 sb.Append(']');
295
296 return sb.ToString();
297 }
298
299 internal bool IsNestedByFlags
300 {
301 get { return (Attributes & TypeAttributes.VisibilityMask & ~TypeAttributes.Public) != 0; }
302 }
303
304 public override Type DeclaringType
305 {
306 get
307 {
308 // note that we cannot use Type.IsNested for this, because that calls DeclaringType
309 if (!IsNestedByFlags)
310 return null;
311
312 foreach (int i in module.NestedClassTable.Filter(MetadataToken))
313 return module.ResolveType(module.NestedClassTable.records[i].EnclosingClass, null, null);
314
315 throw new InvalidOperationException();
316 }
317 }
318
319 public override bool __GetLayout(out int packingSize, out int typeSize)
320 {
321 foreach (int i in module.ClassLayoutTable.Filter(MetadataToken))
322 {
323 packingSize = module.ClassLayoutTable.records[i].PackingSize;
324 typeSize = module.ClassLayoutTable.records[i].ClassSize;
325 return true;
326 }
327
328 packingSize = 0;
329 typeSize = 0;
330 return false;
331 }
332
333 public override Module Module
334 {
335 get { return module; }
336 }
337
338 internal override bool IsModulePseudoType
339 {
340 get { return index == 0; }
341 }
342
343 internal override bool IsBaked
344 {
345 get { return true; }
346 }
347
348 protected override bool IsValueTypeImpl
349 {
350 get
351 {
352 var baseType = BaseType;
353 if (baseType != null && baseType.IsEnumOrValueType && !IsEnumOrValueType)
354 {
355 typeFlags |= TypeFlags.ValueType;
356 return true;
357 }
358 else
359 {
360 typeFlags |= TypeFlags.NotValueType;
361 return false;
362 }
363 }
364 }
365
366 }
367
368}
IKVM.Reflection.Type Type
IKVM.Reflection.MethodInfo MethodInfo
global::java.lang.invoke.LambdaForm.Name Name
override TypeAttributes Attributes
override EventInfo[] __GetDeclaredEvents()
override __MethodImplMap __GetMethodImplMap()
override Type[] GetGenericArguments()
override PropertyInfo[] __GetDeclaredProperties()
override bool __GetLayout(out int packingSize, out int typeSize)
override MethodBase[] __GetDeclaredMethods()
override FieldInfo[] __GetDeclaredFields()
override Type[] __GetDeclaredInterfaces()
override CustomModifiers[] __GetGenericArgumentsCustomModifiers()