25using System.Diagnostics;
29#if IMPORTER || EXPORTER
35using System.Reflection;
36using System.Reflection.Emit;
42 sealed partial class RuntimeManagedJavaType
45 sealed class DelegateJavaMethod : RuntimeJavaMethod
49 readonly DelegateInnerClassJavaType iface;
56 internal DelegateJavaMethod(RuntimeJavaType declaringType, DelegateInnerClassJavaType iface) :
57 base(declaringType,
"<init>",
"(" + iface.SigName +
")V", null, declaringType.Context.PrimitiveJavaTypeFactory.VOID, new RuntimeJavaType[] { iface },
Modifiers.Public,
MemberFlags.Intrinsic)
59 this.delegateConstructor = declaringType.TypeAsTBD.GetConstructor(
new Type[] { DeclaringType.Context.
Types.
Object, DeclaringType.Context.Types.IntPtr });
65 internal override bool EmitIntrinsic(EmitIntrinsicContext context)
67 var targetType = context.GetStackTypeWrapper(0, 0);
68 if (targetType.IsUnloadable || targetType.IsInterface)
72 Debug.Assert(iface.GetMethods().Length == 1);
74 var mw = targetType.GetMethod(GetDelegateInvokeStubName(DeclaringType.TypeAsTBD), iface.GetMethods()[0].Signature,
true);
75 if (mw ==
null || mw.IsStatic || !mw.IsPublic)
77 context.Emitter.Emit(OpCodes.Ldftn, CreateErrorStub(context, targetType, mw ==
null || mw.IsStatic));
78 context.Emitter.Emit(OpCodes.Newobj, delegateConstructor);
84 context.Emitter.Emit(OpCodes.Dup);
85 context.Emitter.Emit(OpCodes.Ldvirtftn, mw.GetMethod());
86 context.Emitter.Emit(OpCodes.Newobj, delegateConstructor);
90 MethodInfo CreateErrorStub(EmitIntrinsicContext context, RuntimeJavaType targetType,
bool isAbstract)
92 var invoke = delegateConstructor.DeclaringType.GetMethod(
"Invoke");
94 var parameters = invoke.GetParameters();
95 var parameterTypes =
new Type[parameters.Length + 1];
96 parameterTypes[0] = DeclaringType.Context.
Types.
Object;
97 for (
int i = 0; i < parameters.Length; i++)
98 parameterTypes[i + 1] = parameters[i].ParameterType;
100 var mb = context.Context.DefineDelegateInvokeErrorStub(invoke.ReturnType, parameterTypes);
102 ilgen.EmitThrow(isAbstract ?
"java.lang.AbstractMethodError" :
"java.lang.IllegalAccessError", targetType.Name +
".Invoke" + iface.GetMethods()[0].Signature);
107 internal override void EmitNewobj(CodeEmitter ilgen)
109 ilgen.Emit(OpCodes.Ldtoken, delegateConstructor.DeclaringType);
111 ilgen.Emit(OpCodes.Ldstr, GetDelegateInvokeStubName(DeclaringType.TypeAsTBD));
112 ilgen.Emit(OpCodes.Ldstr, iface.GetMethods()[0].Signature);
114 ilgen.Emit(OpCodes.Castclass, delegateConstructor.DeclaringType);
117 internal override void EmitCall(CodeEmitter ilgen)
126 ilgen.Emit(OpCodes.Dup);
127 ilgen.Emit(OpCodes.Ldvirtftn, DeclaringType.Context.
MethodHandleUtil.GetDelegateInvokeMethod(delegateConstructor.DeclaringType));
128 ilgen.Emit(OpCodes.Call, delegateConstructor);
IKVM.Reflection.Type Type
IKVM.Reflection.ConstructorInfo ConstructorInfo
IKVM.Reflection.MethodInfo MethodInfo
CodeEmitter Create(MethodBuilder mb)
Creates a new instance.
MethodInfo GetTypeFromHandleMethod
CodeEmitterFactory CodeEmitterFactory
Gets the CodeEmitterFactory associated with this instance of the runtime.
Types Types
Gets the Types associated with this instance of the runtime.
MethodHandleUtil MethodHandleUtil
Gets the MethodHandleUtil associated with this instance of the runtime.
ByteCodeHelperMethods ByteCodeHelperMethods
Gets the ByteCodeHelperMethods associated with this instance of the runtime.
CompilerFactory CompilerFactory
Gets the CompilerFactory associated with this instance of the runtime.
MemberFlags
Describes various options applied to a member.