IKVM11  11
Java SE 11 Virtual Machine for .NET
Loading...
Searching...
No Matches
MethodHandleUtil.compiler.cs
Go to the documentation of this file.
1using System;
2
3#if IMPORTER
6
8#else
9using System.Reflection;
10using System.Reflection.Emit;
11#endif
12
13namespace IKVM.Runtime
14{
15
16 partial class MethodHandleUtil
17 {
18
19 internal void EmitCallDelegateInvokeMethod(CodeEmitter ilgen, Type delegateType)
20 {
21 if (delegateType.IsGenericType)
22 {
23 // MONOBUG we don't look at the invoke method directly here, because Mono doesn't support GetParameters() on a builder instantiation
24 Type[] typeArgs = delegateType.GetGenericArguments();
25 if (IsPackedArgsContainer(typeArgs[typeArgs.Length - 1]))
26 {
27 WrapArgs(ilgen, typeArgs[typeArgs.Length - 1]);
28 }
29 else if (typeArgs.Length > 2 && IsPackedArgsContainer(typeArgs[typeArgs.Length - 2]))
30 {
31 WrapArgs(ilgen, typeArgs[typeArgs.Length - 2]);
32 }
33 }
34 ilgen.Emit(OpCodes.Callvirt, GetDelegateInvokeMethod(delegateType));
35 }
36
37 private void WrapArgs(CodeEmitter ilgen, Type type)
38 {
39 Type last = type.GetGenericArguments()[MaxArity - 1];
40 if (IsPackedArgsContainer(last))
41 {
42 WrapArgs(ilgen, last);
43 }
44 ilgen.Emit(OpCodes.Newobj, GetDelegateOrPackedArgsConstructor(type));
45 }
46
47 internal MethodInfo GetDelegateInvokeMethod(Type delegateType)
48 {
49 if (ReflectUtil.ContainsTypeBuilder(delegateType))
50 {
51 return TypeBuilder.GetMethod(delegateType, delegateType.GetGenericTypeDefinition().GetMethod("Invoke"));
52 }
53 else
54 {
55 return delegateType.GetMethod("Invoke");
56 }
57 }
58
59 internal ConstructorInfo GetDelegateConstructor(Type delegateType)
60 {
61 return GetDelegateOrPackedArgsConstructor(delegateType);
62 }
63
64 private ConstructorInfo GetDelegateOrPackedArgsConstructor(Type type)
65 {
66 if (ReflectUtil.ContainsTypeBuilder(type))
67 {
68 return TypeBuilder.GetConstructor(type, type.GetGenericTypeDefinition().GetConstructors()[0]);
69 }
70 else
71 {
72 return type.GetConstructors()[0];
73 }
74 }
75
76 // for delegate types used for "ldc <MethodType>" we don't want ghost arrays to be erased
77 internal Type CreateDelegateTypeForLoadConstant(RuntimeJavaType[] args, RuntimeJavaType ret)
78 {
79 Type[] typeArgs = new Type[args.Length];
80 for (int i = 0; i < args.Length; i++)
81 {
82 typeArgs[i] = TypeWrapperToTypeForLoadConstant(args[i]);
83 }
84 return CreateDelegateType(typeArgs, TypeWrapperToTypeForLoadConstant(ret));
85 }
86
87 private Type TypeWrapperToTypeForLoadConstant(RuntimeJavaType tw)
88 {
89 if (tw.IsGhostArray)
90 {
91 int dims = tw.ArrayRank;
92 while (tw.IsArray)
93 {
94 tw = tw.ElementTypeWrapper;
95 }
96 return RuntimeArrayJavaType.MakeArrayType(tw.TypeAsSignatureType, dims);
97 }
98 else
99 {
100 return tw.TypeAsSignatureType;
101 }
102 }
103
104 }
105
106}
IKVM.Reflection.Type Type
IKVM.Reflection.ConstructorInfo ConstructorInfo
IKVM.Reflection.MethodInfo MethodInfo