36using System.Reflection;
37using System.Reflection.Emit;
43 partial class RuntimeByteCodeJavaType
46 private sealed partial class JavaTypeImpl
49 private sealed class DelegateInvokeStubMethodWrapper : RuntimeJavaMethod
52 readonly
Type delegateType;
54 internal DelegateInvokeStubMethodWrapper(RuntimeJavaType declaringType,
Type delegateType,
string sig)
57 this.delegateType = delegateType;
62 RuntimeJavaMethod mw = this.DeclaringType.GetMethod(
"Invoke", this.
Signature,
true);
64 MethodInfo invoke = delegateType.GetMethod(
"Invoke");
66 Type[] parameterTypes =
new Type[parameters.Length];
67 for (
int i = 0; i < parameterTypes.Length; i++)
69 parameterTypes[i] = parameters[i].ParameterType;
71 MethodBuilder mb = tb.DefineMethod(this.
Name, MethodAttributes.Public, invoke.ReturnType, parameterTypes);
74 if (mw ==
null || mw.IsStatic || !mw.IsPublic)
76 ilgen.EmitThrow(mw ==
null || mw.IsStatic ?
"java.lang.AbstractMethodError" :
"java.lang.IllegalAccessError", DeclaringType.Name +
".Invoke" +
Signature);
80 CodeEmitterLocal[] byrefs =
new CodeEmitterLocal[parameters.Length];
81 for (
int i = 0; i < parameters.Length; i++)
83 if (parameters[i].ParameterType.IsByRef)
85 Type elemType = parameters[i].ParameterType.GetElementType();
86 CodeEmitterLocal local = ilgen.DeclareLocal(RuntimeArrayJavaType.MakeArrayType(elemType, 1));
88 ilgen.Emit(OpCodes.Ldc_I4_1);
89 ilgen.Emit(OpCodes.Newarr, elemType);
90 ilgen.Emit(OpCodes.Stloc, local);
91 ilgen.Emit(OpCodes.Ldloc, local);
92 ilgen.Emit(OpCodes.Ldc_I4_0);
93 ilgen.EmitLdarg(i + 1);
94 ilgen.Emit(OpCodes.Ldobj, elemType);
95 ilgen.Emit(OpCodes.Stelem, elemType);
99 ilgen.BeginExceptionBlock();
100 ilgen.Emit(OpCodes.Ldarg_0);
101 for (
int i = 0; i < parameters.Length; i++)
103 if (byrefs[i] !=
null)
105 ilgen.Emit(OpCodes.Ldloc, byrefs[i]);
109 ilgen.EmitLdarg(i + 1);
113 mw.EmitCallvirt(ilgen);
114 CodeEmitterLocal returnValue =
null;
117 returnValue = ilgen.DeclareLocal(mw.ReturnType.TypeAsSignatureType);
118 ilgen.Emit(OpCodes.Stloc, returnValue);
120 CodeEmitterLabel exit = ilgen.DefineLabel();
121 ilgen.EmitLeave(exit);
122 ilgen.BeginFinallyBlock();
123 for (
int i = 0; i < parameters.Length; i++)
125 if (byrefs[i] !=
null)
127 Type elemType = byrefs[i].LocalType.GetElementType();
128 ilgen.EmitLdarg(i + 1);
129 ilgen.Emit(OpCodes.Ldloc, byrefs[i]);
130 ilgen.Emit(OpCodes.Ldc_I4_0);
131 ilgen.Emit(OpCodes.Ldelem, elemType);
132 ilgen.Emit(OpCodes.Stobj, elemType);
135 ilgen.Emit(OpCodes.Endfinally);
136 ilgen.EndExceptionBlock();
137 ilgen.MarkLabel(exit);
138 if (returnValue !=
null)
140 ilgen.Emit(OpCodes.Ldloc, returnValue);
142 ilgen.Emit(OpCodes.Ret);
IKVM.Reflection.Type Type
IKVM.Reflection.MethodInfo MethodInfo
IKVM.Reflection.ParameterInfo ParameterInfo
global::java.lang.invoke.LambdaForm.Name Name
IKVM.Runtime.RuntimeByteCodeJavaType RuntimeDynamicOrImportJavaType
CodeEmitter Create(MethodBuilder mb)
Creates a new instance.
AttributeHelper AttributeHelper
Gets the AttributeHelper associated with this instance of the runtime.
CodeEmitterFactory CodeEmitterFactory
Gets the CodeEmitterFactory associated with this instance of the runtime.
RuntimePrimitiveJavaTypeFactory PrimitiveJavaTypeFactory
Gets the RuntimePrimitiveJavaTypeFactory associated with this instance of the runtime.
MemberFlags
Describes various options applied to a member.
@ HideFromReflection
Member should be hidden from Java reflection.