9using System.Reflection;
10using System.Reflection.Emit;
16 partial class MethodHandleUtil
19 internal void EmitCallDelegateInvokeMethod(CodeEmitter ilgen,
Type delegateType)
21 if (delegateType.IsGenericType)
24 Type[] typeArgs = delegateType.GetGenericArguments();
25 if (IsPackedArgsContainer(typeArgs[typeArgs.Length - 1]))
27 WrapArgs(ilgen, typeArgs[typeArgs.Length - 1]);
29 else if (typeArgs.Length > 2 && IsPackedArgsContainer(typeArgs[typeArgs.Length - 2]))
31 WrapArgs(ilgen, typeArgs[typeArgs.Length - 2]);
34 ilgen.Emit(OpCodes.Callvirt, GetDelegateInvokeMethod(delegateType));
37 private void WrapArgs(CodeEmitter ilgen,
Type type)
39 Type last = type.GetGenericArguments()[MaxArity - 1];
40 if (IsPackedArgsContainer(last))
42 WrapArgs(ilgen, last);
44 ilgen.Emit(OpCodes.Newobj, GetDelegateOrPackedArgsConstructor(type));
49 if (ReflectUtil.ContainsTypeBuilder(delegateType))
51 return TypeBuilder.GetMethod(delegateType, delegateType.GetGenericTypeDefinition().GetMethod(
"Invoke"));
55 return delegateType.GetMethod(
"Invoke");
61 return GetDelegateOrPackedArgsConstructor(delegateType);
66 if (ReflectUtil.ContainsTypeBuilder(type))
68 return TypeBuilder.GetConstructor(type, type.GetGenericTypeDefinition().GetConstructors()[0]);
72 return type.GetConstructors()[0];
77 internal Type CreateDelegateTypeForLoadConstant(RuntimeJavaType[] args, RuntimeJavaType ret)
79 Type[] typeArgs =
new Type[args.Length];
80 for (
int i = 0; i < args.Length; i++)
82 typeArgs[i] = TypeWrapperToTypeForLoadConstant(args[i]);
84 return CreateDelegateType(typeArgs, TypeWrapperToTypeForLoadConstant(ret));
87 private Type TypeWrapperToTypeForLoadConstant(RuntimeJavaType tw)
91 int dims = tw.ArrayRank;
94 tw = tw.ElementTypeWrapper;
96 return RuntimeArrayJavaType.MakeArrayType(tw.TypeAsSignatureType, dims);
100 return tw.TypeAsSignatureType;
IKVM.Reflection.Type Type
IKVM.Reflection.ConstructorInfo ConstructorInfo
IKVM.Reflection.MethodInfo MethodInfo