зеркало из https://github.com/mono/ikvm-fork.git
When a fast method/constructor invoker throws an exception at the call site (e.g. MethodAccessException in partial trust scenarios) we shouldn't wrap it in an InvocationTargetException.
This commit is contained in:
Родитель
add8b2963b
Коммит
fd4d23369a
|
@ -6062,6 +6062,9 @@ namespace IKVM.NativeCode.sun.reflect
|
||||||
private static readonly MethodInfo doubleValue;
|
private static readonly MethodInfo doubleValue;
|
||||||
internal static readonly ConstructorInfo invocationTargetExceptionCtor;
|
internal static readonly ConstructorInfo invocationTargetExceptionCtor;
|
||||||
internal static readonly ConstructorInfo illegalArgumentExceptionCtor;
|
internal static readonly ConstructorInfo illegalArgumentExceptionCtor;
|
||||||
|
internal static readonly MethodInfo get_TargetSite;
|
||||||
|
internal static readonly MethodInfo GetCurrentMethod;
|
||||||
|
|
||||||
private delegate object Invoker(object obj, object[] args, global::ikvm.@internal.CallerID callerID);
|
private delegate object Invoker(object obj, object[] args, global::ikvm.@internal.CallerID callerID);
|
||||||
private Invoker invoker;
|
private Invoker invoker;
|
||||||
|
|
||||||
|
@ -6087,6 +6090,8 @@ namespace IKVM.NativeCode.sun.reflect
|
||||||
|
|
||||||
invocationTargetExceptionCtor = typeof(jlrInvocationTargetException).GetConstructor(new Type[] { typeof(Exception) });
|
invocationTargetExceptionCtor = typeof(jlrInvocationTargetException).GetConstructor(new Type[] { typeof(Exception) });
|
||||||
illegalArgumentExceptionCtor = typeof(jlIllegalArgumentException).GetConstructor(Type.EmptyTypes);
|
illegalArgumentExceptionCtor = typeof(jlIllegalArgumentException).GetConstructor(Type.EmptyTypes);
|
||||||
|
get_TargetSite = typeof(Exception).GetMethod("get_TargetSite");
|
||||||
|
GetCurrentMethod = typeof(MethodBase).GetMethod("GetCurrentMethod");
|
||||||
}
|
}
|
||||||
|
|
||||||
private sealed class RunClassInit
|
private sealed class RunClassInit
|
||||||
|
@ -6211,9 +6216,16 @@ namespace IKVM.NativeCode.sun.reflect
|
||||||
BoxReturnValue(ilgen, mw.ReturnType);
|
BoxReturnValue(ilgen, mw.ReturnType);
|
||||||
ilgen.Emit(OpCodes.Stloc, ret);
|
ilgen.Emit(OpCodes.Stloc, ret);
|
||||||
ilgen.BeginCatchBlock(typeof(Exception));
|
ilgen.BeginCatchBlock(typeof(Exception));
|
||||||
|
ilgen.Emit(OpCodes.Dup);
|
||||||
|
ilgen.Emit(OpCodes.Callvirt, get_TargetSite);
|
||||||
|
ilgen.Emit(OpCodes.Call, GetCurrentMethod);
|
||||||
|
ilgen.Emit(OpCodes.Ceq);
|
||||||
|
CodeEmitterLabel label = ilgen.DefineLabel();
|
||||||
|
ilgen.Emit(OpCodes.Brtrue_S, label);
|
||||||
ilgen.Emit(OpCodes.Ldc_I4_1);
|
ilgen.Emit(OpCodes.Ldc_I4_1);
|
||||||
ilgen.Emit(OpCodes.Call, Compiler.mapExceptionFastMethod);
|
ilgen.Emit(OpCodes.Call, Compiler.mapExceptionFastMethod);
|
||||||
ilgen.Emit(OpCodes.Newobj, invocationTargetExceptionCtor);
|
ilgen.Emit(OpCodes.Newobj, invocationTargetExceptionCtor);
|
||||||
|
ilgen.MarkLabel(label);
|
||||||
ilgen.Emit(OpCodes.Throw);
|
ilgen.Emit(OpCodes.Throw);
|
||||||
ilgen.EndExceptionBlock();
|
ilgen.EndExceptionBlock();
|
||||||
|
|
||||||
|
@ -6496,9 +6508,16 @@ namespace IKVM.NativeCode.sun.reflect
|
||||||
mw.EmitNewobj(ilgen);
|
mw.EmitNewobj(ilgen);
|
||||||
ilgen.Emit(OpCodes.Stloc, ret);
|
ilgen.Emit(OpCodes.Stloc, ret);
|
||||||
ilgen.BeginCatchBlock(typeof(Exception));
|
ilgen.BeginCatchBlock(typeof(Exception));
|
||||||
|
ilgen.Emit(OpCodes.Dup);
|
||||||
|
ilgen.Emit(OpCodes.Callvirt, FastMethodAccessorImpl.get_TargetSite);
|
||||||
|
ilgen.Emit(OpCodes.Call, FastMethodAccessorImpl.GetCurrentMethod);
|
||||||
|
ilgen.Emit(OpCodes.Ceq);
|
||||||
|
CodeEmitterLabel label = ilgen.DefineLabel();
|
||||||
|
ilgen.Emit(OpCodes.Brtrue_S, label);
|
||||||
ilgen.Emit(OpCodes.Ldc_I4_1);
|
ilgen.Emit(OpCodes.Ldc_I4_1);
|
||||||
ilgen.Emit(OpCodes.Call, Compiler.mapExceptionFastMethod);
|
ilgen.Emit(OpCodes.Call, Compiler.mapExceptionFastMethod);
|
||||||
ilgen.Emit(OpCodes.Newobj, FastMethodAccessorImpl.invocationTargetExceptionCtor);
|
ilgen.Emit(OpCodes.Newobj, FastMethodAccessorImpl.invocationTargetExceptionCtor);
|
||||||
|
ilgen.MarkLabel(label);
|
||||||
ilgen.Emit(OpCodes.Throw);
|
ilgen.Emit(OpCodes.Throw);
|
||||||
ilgen.EndExceptionBlock();
|
ilgen.EndExceptionBlock();
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче