41 internal const int MaxArity = 8;
45 readonly
Type typeofMHA;
46 readonly
Type[] typeofMHV;
47 readonly
Type[] typeofMH;
54 this.context = context ??
throw new ArgumentNullException(nameof(context));
56 typeofMHA = context.
Resolver.ResolveRuntimeType(
"IKVM.Runtime.MHA`8").AsReflection();
57 typeofMHV =
new Type[] {
58 context.
Resolver.ResolveRuntimeType(
"IKVM.Runtime.MHV").AsReflection(),
59 context.
Resolver.ResolveRuntimeType(
"IKVM.Runtime.MHV`1").AsReflection(),
60 context.
Resolver.ResolveRuntimeType(
"IKVM.Runtime.MHV`2").AsReflection(),
61 context.
Resolver.ResolveRuntimeType(
"IKVM.Runtime.MHV`3").AsReflection(),
62 context.
Resolver.ResolveRuntimeType(
"IKVM.Runtime.MHV`4").AsReflection(),
63 context.
Resolver.ResolveRuntimeType(
"IKVM.Runtime.MHV`5").AsReflection(),
64 context.
Resolver.ResolveRuntimeType(
"IKVM.Runtime.MHV`6").AsReflection(),
65 context.
Resolver.ResolveRuntimeType(
"IKVM.Runtime.MHV`7").AsReflection(),
66 context.
Resolver.ResolveRuntimeType(
"IKVM.Runtime.MHV`8").AsReflection(),
68 typeofMH =
new Type[] {
70 context.
Resolver.ResolveRuntimeType(
"IKVM.Runtime.MH`1").AsReflection(),
71 context.
Resolver.ResolveRuntimeType(
"IKVM.Runtime.MH`2").AsReflection(),
72 context.
Resolver.ResolveRuntimeType(
"IKVM.Runtime.MH`3").AsReflection(),
73 context.
Resolver.ResolveRuntimeType(
"IKVM.Runtime.MH`4").AsReflection(),
74 context.
Resolver.ResolveRuntimeType(
"IKVM.Runtime.MH`5").AsReflection(),
75 context.
Resolver.ResolveRuntimeType(
"IKVM.Runtime.MH`6").AsReflection(),
76 context.
Resolver.ResolveRuntimeType(
"IKVM.Runtime.MH`7").AsReflection(),
77 context.
Resolver.ResolveRuntimeType(
"IKVM.Runtime.MH`8").AsReflection(),
78 context.
Resolver.ResolveRuntimeType(
"IKVM.Runtime.MH`9").AsReflection(),
82 internal bool IsPackedArgsContainer(
Type type)
84 return type.IsGenericType && type.GetGenericTypeDefinition() == typeofMHA;
87 internal Type CreateMethodHandleDelegateType(RuntimeJavaType[] args, RuntimeJavaType ret)
89 Type[] typeArgs =
new Type[args.Length];
90 for (
int i = 0; i < args.Length; i++)
92 typeArgs[i] = args[i].TypeAsSignatureType;
94 return CreateDelegateType(typeArgs, ret.TypeAsSignatureType);
97 internal Type CreateMemberWrapperDelegateType(RuntimeJavaType[] args, RuntimeJavaType ret)
99 Type[] typeArgs =
new Type[args.Length];
100 for (
int i = 0; i < args.Length; i++)
102 typeArgs[i] = AsBasicType(args[i]);
104 return CreateDelegateType(typeArgs, AsBasicType(ret));
109 if (types.Length == 0 && retType == context.Types.Void)
113 else if (types.Length > MaxArity)
115 int arity = types.Length;
116 int remainder = (arity - 8) % 7;
117 int count = (arity - 8) / 7;
124 var last = typeofMHA.MakeGenericType(SubArray(types, types.Length - 8, 8));
125 for (
int i = 0; i < count; i++)
127 var temp = SubArray(types, types.Length - 8 - 7 * (i + 1), 8);
129 last = typeofMHA.MakeGenericType(temp);
132 types = SubArray(types, 0, remainder + 1);
133 types[remainder] = last;
136 if (retType == context.Types.Void)
138 return typeofMHV[types.Length].MakeGenericType(types);
142 types = ArrayUtil.Concat(types, retType);
143 return typeofMH[types.Length].MakeGenericType(types);
147 Type[] SubArray(
Type[] inArray,
int start,
int length)
149 var outArray =
new Type[length];
150 Array.Copy(inArray, start, outArray, 0, length);
154 internal Type AsBasicType(RuntimeJavaType tw)
156 if (tw == context.PrimitiveJavaTypeFactory.BOOLEAN || tw == context.PrimitiveJavaTypeFactory.BYTE || tw == context.PrimitiveJavaTypeFactory.CHAR || tw == context.PrimitiveJavaTypeFactory.SHORT || tw == context.PrimitiveJavaTypeFactory.INT)
157 return context.Types.Int32;
158 else if (tw == context.PrimitiveJavaTypeFactory.LONG || tw == context.PrimitiveJavaTypeFactory.FLOAT || tw == context.PrimitiveJavaTypeFactory.DOUBLE || tw == context.PrimitiveJavaTypeFactory.VOID)
159 return tw.TypeAsSignatureType;
161 return context.Types.Object;
164 internal bool HasOnlyBasicTypes(RuntimeJavaType[] args, RuntimeJavaType ret)
166 foreach (var tw
in args)
167 if (!IsBasicType(tw))
170 return IsBasicType(ret);
173 bool IsBasicType(RuntimeJavaType tw)
175 return tw == context.PrimitiveJavaTypeFactory.INT
176 || tw == context.PrimitiveJavaTypeFactory.LONG
177 || tw == context.PrimitiveJavaTypeFactory.FLOAT
178 || tw == context.PrimitiveJavaTypeFactory.DOUBLE
179 || tw == context.PrimitiveJavaTypeFactory.VOID
180 || tw == context.JavaBase.TypeOfJavaLangObject;
183 internal int SlotCount(RuntimeJavaType[] parameters)
186 for (
int i = 0; i < parameters.Length; i++)
188 count += parameters[i].IsWidePrimitive ? 2 : 1;
Maintains services relevant to an instane of the IKVM runtime.
ISymbolResolver Resolver
Gets the ISymbolResolver associated with this instance of the runtime.