IKVM11  11
Java SE 11 Virtual Machine for .NET
Loading...
Searching...
No Matches
MethodDefImpl.cs
Go to the documentation of this file.
1/*
2 Copyright (C) 2009-2012 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;
26
28
30{
31
32 sealed class MethodDefImpl : MethodInfo
33 {
34
35 readonly ModuleReader module;
36 readonly int index;
37 readonly TypeDefImpl declaringType;
38 MethodSignature lazyMethodSignature;
39 ParameterInfo returnParameter;
40 ParameterInfo[] parameters;
41 Type[] typeArgs;
42
49 internal MethodDefImpl(ModuleReader module, TypeDefImpl declaringType, int index)
50 {
51 this.module = module;
52 this.index = index;
53 this.declaringType = declaringType;
54 }
55
56 public override MethodBody GetMethodBody()
57 {
58 return GetMethodBody(this);
59 }
60
61 internal MethodBody GetMethodBody(IGenericContext context)
62 {
63 if ((GetMethodImplementationFlags() & MethodImplAttributes.CodeTypeMask) != MethodImplAttributes.IL)
64 return null; // method is not IL
65
66 var rva = module.MethodDefTable.records[index].RVA;
67 return rva == 0 ? null : new MethodBody(module, rva, context);
68 }
69
70 public override int __MethodRVA
71 {
72 get { return module.MethodDefTable.records[index].RVA; }
73 }
74
75 public override CallingConventions CallingConvention
76 {
77 get { return MethodSignature.CallingConvention; }
78 }
79
80 public override MethodAttributes Attributes
81 {
82 get { return (MethodAttributes)module.MethodDefTable.records[index].Flags; }
83 }
84
85 public override MethodImplAttributes GetMethodImplementationFlags()
86 {
87 return (MethodImplAttributes)module.MethodDefTable.records[index].ImplFlags;
88 }
89
90 public override ParameterInfo[] GetParameters()
91 {
92 PopulateParameters();
93 return (ParameterInfo[])parameters.Clone();
94 }
95
96 void PopulateParameters()
97 {
98 if (parameters == null)
99 {
100 var methodSignature = MethodSignature;
101 parameters = new ParameterInfo[methodSignature.GetParameterCount()];
102
103 var parameter = module.MethodDefTable.records[index].ParamList - 1;
104 var end = module.MethodDefTable.records.Length > index + 1 ? module.MethodDefTable.records[index + 1].ParamList - 1 : module.ParamTable.records.Length;
105 for (; parameter < end; parameter++)
106 {
107 var seq = module.ParamTable.records[parameter].Sequence - 1;
108 if (seq == -1)
109 returnParameter = new ParameterInfoImpl(this, seq, parameter);
110 else
111 parameters[seq] = new ParameterInfoImpl(this, seq, parameter);
112 }
113
114 for (int i = 0; i < parameters.Length; i++)
115 if (parameters[i] == null)
116 parameters[i] = new ParameterInfoImpl(this, i, -1);
117
118 if (returnParameter == null)
119 returnParameter = new ParameterInfoImpl(this, -1, -1);
120 }
121 }
122
123 internal override Type[] GetParameterTypes()
124 {
125 var parameterTypes = new Type[MethodSignature.GetParameterCount()];
126 for (int i = 0; i < parameterTypes.Length; i++)
127 parameterTypes[i] = MethodSignature.GetParameterType(i);
128
129 return parameterTypes;
130 }
131
132 internal override int ParameterCount
133 {
134 get { return MethodSignature.GetParameterCount(); }
135 }
136
137 public override ParameterInfo ReturnParameter
138 {
139 get
140 {
141 PopulateParameters();
142 return returnParameter;
143 }
144 }
145
146 public override Type ReturnType
147 {
148 get
149 {
150 return MethodSignature.GetReturnType(this);
151 }
152 }
153
154 public override Type DeclaringType
155 {
156 get { return declaringType.IsModulePseudoType ? null : declaringType; }
157 }
158
159 public override string Name
160 {
161 get { return module.GetString(module.MethodDefTable.records[index].Name); }
162 }
163
164 public override int MetadataToken
165 {
166 get { return (MethodDefTable.Index << 24) + index + 1; }
167 }
168
169 public override bool IsGenericMethodDefinition
170 {
171 get
172 {
173 PopulateGenericArguments();
174 return typeArgs.Length > 0;
175 }
176 }
177
178 public override bool IsGenericMethod
179 {
180 get { return IsGenericMethodDefinition; }
181 }
182
183 public override Type[] GetGenericArguments()
184 {
185 PopulateGenericArguments();
186 return Util.Copy(typeArgs);
187 }
188
189 void PopulateGenericArguments()
190 {
191 if (typeArgs == null)
192 {
193 var token = MetadataToken;
194 var first = module.GenericParamTable.FindFirstByOwner(token);
195 if (first == -1)
196 {
197 typeArgs = Type.EmptyTypes;
198 }
199 else
200 {
201 var list = new List<Type>();
202 var len = module.GenericParamTable.records.Length;
203 for (int i = first; i < len && module.GenericParamTable.records[i].Owner == token; i++)
204 list.Add(new GenericTypeParameter(module, i, Signature.ELEMENT_TYPE_MVAR));
205
206 typeArgs = list.ToArray();
207 }
208 }
209 }
210
211 internal override Type GetGenericMethodArgument(int index)
212 {
213 PopulateGenericArguments();
214 return typeArgs[index];
215 }
216
217 internal override int GetGenericMethodArgumentCount()
218 {
219 PopulateGenericArguments();
220 return typeArgs.Length;
221 }
222
223 public override MethodInfo GetGenericMethodDefinition()
224 {
225 return IsGenericMethodDefinition ? (MethodInfo)this : throw new InvalidOperationException();
226 }
227
228 public override MethodInfo MakeGenericMethod(params Type[] typeArguments)
229 {
230 return new GenericMethodInstance(declaringType, this, typeArguments);
231 }
232
233 public override Module Module
234 {
235 get { return module; }
236 }
237
238 internal override MethodSignature MethodSignature
239 {
240 get { return lazyMethodSignature ??= MethodSignature.ReadSig(module, module.GetBlobReader(module.MethodDefTable.records[index].Signature), this); }
241 }
242
243 internal override int ImportTo(Emit.ModuleBuilder module)
244 {
245 return module.ImportMethodOrField(declaringType, this.Name, this.MethodSignature);
246 }
247
248 public override MethodInfo[] __GetMethodImpls()
249 {
250 Type[] typeArgs = null;
251 List<MethodInfo> list = null;
252
253 foreach (var i in module.MethodImplTable.Filter(declaringType.MetadataToken))
254 {
255 if (module.MethodImplTable.records[i].MethodBody == this.MetadataToken)
256 {
257 typeArgs ??= declaringType.GetGenericArguments();
258 list ??= new List<MethodInfo>();
259 list.Add((MethodInfo)module.ResolveMethod(module.MethodImplTable.records[i].MethodDeclaration, typeArgs, null));
260 }
261 }
262
263 return Util.ToArray(list, Array.Empty<MethodInfo>());
264 }
265
266 internal override int GetCurrentToken()
267 {
268 return this.MetadataToken;
269 }
270
271 internal override bool IsBaked
272 {
273 get { return true; }
274 }
275
276 }
277
278}
IKVM.Reflection.Type Type
global::java.lang.invoke.LambdaForm.Name Name
System.Runtime.InteropServices.CallingConvention CallingConvention
Definition Signature.cs:35
Represents a method signature from IL metadadata.
override MethodInfo[] __GetMethodImpls()
override ParameterInfo ReturnParameter
override MethodImplAttributes GetMethodImplementationFlags()
override MethodBody GetMethodBody()
override MethodInfo GetGenericMethodDefinition()
override MethodInfo MakeGenericMethod(params Type[] typeArguments)
override MethodAttributes Attributes
override ParameterInfo[] GetParameters()