IKVM11  11
Java SE 11 Virtual Machine for .NET
Loading...
Searching...
No Matches
MissingMethod.cs
Go to the documentation of this file.
1/*
2 Copyright (C) 2011-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*/
24namespace IKVM.Reflection
25{
26
27 sealed class MissingMethod : MethodInfo
28 {
29
30 readonly Type declaringType;
31 readonly string name;
32 internal MethodSignature signature;
33 MethodInfo forwarder;
34 Type[] typeArgs;
35
42 internal MissingMethod(Type declaringType, string name, MethodSignature signature)
43 {
44 this.declaringType = declaringType;
45 this.name = name;
46 this.signature = signature;
47 }
48
49 MethodInfo Forwarder => TryGetForwarder() ?? throw new MissingMemberException(this);
50
51 MethodInfo TryGetForwarder()
52 {
53 if (forwarder == null && !declaringType.__IsMissing)
54 {
55 var mb = declaringType.FindMethod(name, signature);
56 var ci = mb as ConstructorInfo;
57 if (ci != null)
58 forwarder = ci.GetMethodInfo();
59 else
60 forwarder = (MethodInfo)mb;
61 }
62
63 return forwarder;
64 }
65
66 public override bool __IsMissing
67 {
68 get { return TryGetForwarder() == null; }
69 }
70
71 public override Type ReturnType
72 {
73 get { return signature.GetReturnType(this); }
74 }
75
76 public override ParameterInfo ReturnParameter
77 {
78 get { return new ParameterInfoImpl(this, -1); }
79 }
80
81 internal override MethodSignature MethodSignature
82 {
83 get { return signature; }
84 }
85
86 internal override int ParameterCount
87 {
88 get { return signature.GetParameterCount(); }
89 }
90
91 sealed class ParameterInfoImpl : ParameterInfo
92 {
93
94 readonly MissingMethod method;
95 readonly int index;
96
102 internal ParameterInfoImpl(MissingMethod method, int index)
103 {
104 this.method = method;
105 this.index = index;
106 }
107
108 ParameterInfo Forwarder
109 {
110 get { return index == -1 ? method.Forwarder.ReturnParameter : method.Forwarder.GetParameters()[index]; }
111 }
112
113 public override string Name
114 {
115 get { return Forwarder.Name; }
116 }
117
118 public override Type ParameterType
119 {
120 get { return index == -1 ? method.signature.GetReturnType(method) : method.signature.GetParameterType(method, index); }
121 }
122
123 public override ParameterAttributes Attributes
124 {
125 get { return Forwarder.Attributes; }
126 }
127
128 public override int Position
129 {
130 get { return index; }
131 }
132
133 public override object RawDefaultValue
134 {
135 get { return Forwarder.RawDefaultValue; }
136 }
137
138 public override CustomModifiers __GetCustomModifiers()
139 {
140 return index == -1
141 ? method.signature.GetReturnTypeCustomModifiers(method)
142 : method.signature.GetParameterCustomModifiers(method, index);
143 }
144
145 public override bool __TryGetFieldMarshal(out FieldMarshal fieldMarshal)
146 {
147 return Forwarder.__TryGetFieldMarshal(out fieldMarshal);
148 }
149
150 public override MemberInfo Member
151 {
152 get { return method; }
153 }
154
155 public override int MetadataToken
156 {
157 get { return Forwarder.MetadataToken; }
158 }
159
160 public override Module Module
161 {
162 get { return method.Module; }
163 }
164
165 public override string ToString()
166 {
167 return Forwarder.ToString();
168 }
169
170 }
171
172 public override ParameterInfo[] GetParameters()
173 {
174 var parameters = new ParameterInfo[signature.GetParameterCount()];
175 for (int i = 0; i < parameters.Length; i++)
176 parameters[i] = new ParameterInfoImpl(this, i);
177
178 return parameters;
179 }
180
181 internal override Type[] GetParameterTypes()
182 {
183 var parameterTypes = new Type[signature.GetParameterCount()];
184 for (int i = 0; i < parameterTypes.Length; i++)
185 parameterTypes[i] = signature.GetParameterType(i);
186
187 return parameterTypes;
188 }
189
190 public override MethodAttributes Attributes
191 {
192 get { return Forwarder.Attributes; }
193 }
194
195 public override MethodImplAttributes GetMethodImplementationFlags()
196 {
197 return Forwarder.GetMethodImplementationFlags();
198 }
199
200 public override MethodBody GetMethodBody()
201 {
202 return Forwarder.GetMethodBody();
203 }
204
205 public override int __MethodRVA
206 {
207 get { return Forwarder.__MethodRVA; }
208 }
209
210 public override CallingConventions CallingConvention
211 {
212 get { return signature.CallingConvention; }
213 }
214
215 internal override int ImportTo(IKVM.Reflection.Emit.ModuleBuilder module)
216 {
217 var method = TryGetForwarder();
218 if (method != null)
219 return method.ImportTo(module);
220
221 return module.ImportMethodOrField(declaringType, this.Name, this.MethodSignature);
222 }
223
224 public override string Name
225 {
226 get { return name; }
227 }
228
229 public override Type DeclaringType
230 {
231 get { return declaringType.IsModulePseudoType ? null : declaringType; }
232 }
233
234 public override Module Module
235 {
236 get { return declaringType.Module; }
237 }
238
239 public override bool Equals(object obj)
240 {
241 var other = obj as MissingMethod;
242 return other != null
243 && other.declaringType == declaringType
244 && other.name == name
245 && other.signature.Equals(signature);
246 }
247
248 public override int GetHashCode()
249 {
250 return declaringType.GetHashCode() ^ name.GetHashCode() ^ signature.GetHashCode();
251 }
252
253 internal override MethodBase BindTypeParameters(Type type)
254 {
255 var forwarder = TryGetForwarder();
256 if (forwarder != null)
257 return forwarder.BindTypeParameters(type);
258
259 return new GenericMethodInstance(type, this, null);
260 }
261
262 public override bool ContainsGenericParameters
263 {
264 get { return Forwarder.ContainsGenericParameters; }
265 }
266
267 public override Type[] GetGenericArguments()
268 {
269 var method = TryGetForwarder();
270 if (method != null)
271 return Forwarder.GetGenericArguments();
272
273 if (typeArgs == null)
274 {
275 typeArgs = new Type[signature.GenericParameterCount];
276 for (int i = 0; i < typeArgs.Length; i++)
277 typeArgs[i] = new MissingTypeParameter(this, i);
278 }
279
280 return Util.Copy(typeArgs);
281 }
282
283 internal override Type GetGenericMethodArgument(int index)
284 {
285 return GetGenericArguments()[index];
286 }
287
288 internal override int GetGenericMethodArgumentCount()
289 {
290 return Forwarder.GetGenericMethodArgumentCount();
291 }
292
293 public override MethodInfo GetGenericMethodDefinition()
294 {
295 return Forwarder.GetGenericMethodDefinition();
296 }
297
298 internal override MethodInfo GetMethodOnTypeDefinition()
299 {
300 return Forwarder.GetMethodOnTypeDefinition();
301 }
302
303 internal override bool HasThis
304 {
305 get { return (signature.CallingConvention & (CallingConventions.HasThis | CallingConventions.ExplicitThis)) == CallingConventions.HasThis; }
306 }
307
308 public override bool IsGenericMethod
309 {
310 get { return IsGenericMethodDefinition; }
311 }
312
313 public override bool IsGenericMethodDefinition
314 {
315 get { return signature.GenericParameterCount != 0; }
316 }
317
318 public override MethodInfo MakeGenericMethod(params Type[] typeArguments)
319 {
320 var method = TryGetForwarder();
321 if (method != null)
322 return method.MakeGenericMethod(typeArguments);
323
324 return new GenericMethodInstance(declaringType, this, typeArguments);
325 }
326
327 public override int MetadataToken
328 {
329 get { return Forwarder.MetadataToken; }
330 }
331
332 internal override int GetCurrentToken()
333 {
334 return Forwarder.GetCurrentToken();
335 }
336
337 internal override bool IsBaked
338 {
339 get { return Forwarder.IsBaked; }
340 }
341
342 }
343
344}
IKVM.Reflection.Module Module
IKVM.Reflection.Type Type
IKVM.Reflection.ConstructorInfo ConstructorInfo
IKVM.Reflection.MemberInfo MemberInfo
IKVM.Reflection.ParameterInfo ParameterInfo
global::java.lang.invoke.LambdaForm.Name Name
System.Runtime.InteropServices.CallingConvention CallingConvention
Definition Signature.cs:35
Represents a method signature from IL metadadata.
override bool Equals(object obj)
override MethodAttributes Attributes
override MethodInfo MakeGenericMethod(params Type[] typeArguments)
override ParameterInfo ReturnParameter
override Type[] GetGenericArguments()
override bool IsGenericMethodDefinition
override ParameterInfo[] GetParameters()
override MethodImplAttributes GetMethodImplementationFlags()
override MethodBody GetMethodBody()
override bool Equals(object obj)
override MethodInfo GetGenericMethodDefinition()
override bool ContainsGenericParameters