diff --git a/src/coreclr/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/ThrowHelpers.cs b/src/coreclr/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/ThrowHelpers.cs index fd01c28423ecc7..377fba25b43a36 100644 --- a/src/coreclr/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/ThrowHelpers.cs +++ b/src/coreclr/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/ThrowHelpers.cs @@ -37,5 +37,47 @@ internal static void ThrowEntryPointNotFoundException( { ThrowEntryPointNotFoundException((MethodTable*)targetType, (MethodTable*)interfaceType, method); } + + [DoesNotReturn] + [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ExceptionNative_ThrowMethodAccessException")] + private static partial void ThrowMethodAccessExceptionInternal(void* caller, void* callee); + + // implementation of CORINFO_HELP_METHOD_ACCESS_EXCEPTION + [DoesNotReturn] + [DebuggerHidden] + internal static void ThrowMethodAccessException( + void* caller, // MethodDesc* + void* callee) // MethodDesc* + { + ThrowMethodAccessExceptionInternal(caller, callee); + } + + [DoesNotReturn] + [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ExceptionNative_ThrowFieldAccessException")] + private static partial void ThrowFieldAccessExceptionInternal(void* caller, void* callee); + + // implementation of CORINFO_HELP_FIELD_ACCESS_EXCEPTION + [DoesNotReturn] + [DebuggerHidden] + internal static void ThrowFieldAccessException( + void* caller, // MethodDesc* + void* callee) // FieldDesc* + { + ThrowFieldAccessExceptionInternal(caller, callee); + } + + [DoesNotReturn] + [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ExceptionNative_ThrowClassAccessException")] + private static partial void ThrowClassAccessExceptionInternal(void* caller, void* callee); + + // implementation of CORINFO_HELP_CLASS_ACCESS_EXCEPTION + [DoesNotReturn] + [DebuggerHidden] + internal static void ThrowClassAccessException( + void* caller, // MethodDesc* + void* callee) // Type handle + { + ThrowClassAccessExceptionInternal(caller, callee); + } } } diff --git a/src/coreclr/inc/jithelpers.h b/src/coreclr/inc/jithelpers.h index f260a491d2930f..342caf7c473ad6 100644 --- a/src/coreclr/inc/jithelpers.h +++ b/src/coreclr/inc/jithelpers.h @@ -125,15 +125,15 @@ DYNAMICJITHELPER(CORINFO_HELP_THROW, IL_Throw, METHOD__NIL) DYNAMICJITHELPER(CORINFO_HELP_RETHROW, IL_Rethrow, METHOD__NIL) JITHELPER(CORINFO_HELP_USER_BREAKPOINT, JIT_UserBreakpoint, METHOD__NIL) - DYNAMICJITHELPER_NOINDIRECT(CORINFO_HELP_RNGCHKFAIL, NULL, METHOD__THROWHELPERS__THROWINDEXOUTOFRANGEEXCEPTION) - DYNAMICJITHELPER_NOINDIRECT(CORINFO_HELP_OVERFLOW, NULL, METHOD__THROWHELPERS__THROWOVERFLOWEXCEPTION) - DYNAMICJITHELPER_NOINDIRECT(CORINFO_HELP_THROWDIVZERO, NULL, METHOD__THROWHELPERS__THROWDIVIDEBYZEROEXCEPTION) - DYNAMICJITHELPER_NOINDIRECT(CORINFO_HELP_THROWNULLREF, NULL, METHOD__THROWHELPERS__THROWNULLREFEXCEPTION) - DYNAMICJITHELPER_NOINDIRECT(CORINFO_HELP_VERIFICATION, NULL, METHOD__THROWHELPERS__THROWVERIFICATIONEXCEPTION) + DYNAMICJITHELPER_NOINDIRECT(CORINFO_HELP_RNGCHKFAIL, NULL, METHOD__THROWHELPERS__THROWINDEXOUTOFRANGEEXCEPTION) + DYNAMICJITHELPER_NOINDIRECT(CORINFO_HELP_OVERFLOW, NULL, METHOD__THROWHELPERS__THROWOVERFLOWEXCEPTION) + DYNAMICJITHELPER_NOINDIRECT(CORINFO_HELP_THROWDIVZERO, NULL, METHOD__THROWHELPERS__THROWDIVIDEBYZEROEXCEPTION) + DYNAMICJITHELPER_NOINDIRECT(CORINFO_HELP_THROWNULLREF, NULL, METHOD__THROWHELPERS__THROWNULLREFEXCEPTION) + DYNAMICJITHELPER_NOINDIRECT(CORINFO_HELP_VERIFICATION, NULL, METHOD__THROWHELPERS__THROWVERIFICATIONEXCEPTION) JITHELPER(CORINFO_HELP_FAIL_FAST, JIT_FailFast, METHOD__NIL) - JITHELPER(CORINFO_HELP_METHOD_ACCESS_EXCEPTION,JIT_ThrowMethodAccessException, METHOD__NIL) - JITHELPER(CORINFO_HELP_FIELD_ACCESS_EXCEPTION,JIT_ThrowFieldAccessException, METHOD__NIL) - JITHELPER(CORINFO_HELP_CLASS_ACCESS_EXCEPTION,JIT_ThrowClassAccessException, METHOD__NIL) + DYNAMICJITHELPER(CORINFO_HELP_METHOD_ACCESS_EXCEPTION, NULL, METHOD__THROWHELPERS__THROWMETHODACCESSEXCEPTION) + DYNAMICJITHELPER(CORINFO_HELP_FIELD_ACCESS_EXCEPTION, NULL, METHOD__THROWHELPERS__THROWFIELDACCESSEXCEPTION) + DYNAMICJITHELPER(CORINFO_HELP_CLASS_ACCESS_EXCEPTION, NULL, METHOD__THROWHELPERS__THROWCLASSACCESSEXCEPTION) #ifdef FEATURE_EH_FUNCLETS JITHELPER(CORINFO_HELP_ENDCATCH, NULL, METHOD__NIL) diff --git a/src/coreclr/vm/comutilnative.cpp b/src/coreclr/vm/comutilnative.cpp index fff8e59962db2a..91a1c8c68f2166 100644 --- a/src/coreclr/vm/comutilnative.cpp +++ b/src/coreclr/vm/comutilnative.cpp @@ -479,6 +479,45 @@ extern "C" void QCALLTYPE ExceptionNative_ThrowEntryPointNotFoundException( END_QCALL; } +extern "C" void QCALLTYPE ExceptionNative_ThrowMethodAccessException(MethodDesc* caller, MethodDesc* callee) +{ + QCALL_CONTRACT; + + BEGIN_QCALL; + + _ASSERTE(caller != NULL); + AccessCheckContext accessContext(caller); + ThrowMethodAccessException(&accessContext, callee); + + END_QCALL; +} + +extern "C" void QCALLTYPE ExceptionNative_ThrowFieldAccessException(MethodDesc* caller, FieldDesc* callee) +{ + QCALL_CONTRACT; + + BEGIN_QCALL; + + _ASSERTE(caller != NULL); + AccessCheckContext accessContext(caller); + ThrowFieldAccessException(&accessContext, callee); + + END_QCALL; +} + +extern "C" void QCALLTYPE ExceptionNative_ThrowClassAccessException(MethodDesc* caller, EnregisteredTypeHandle callee) +{ + QCALL_CONTRACT; + + BEGIN_QCALL; + + _ASSERTE(caller != NULL); + AccessCheckContext accessContext(caller); + ThrowTypeAccessException(&accessContext, TypeHandle::FromPtr(callee).GetMethodTable()); + + END_QCALL; +} + extern "C" void QCALLTYPE Buffer_Clear(void *dst, size_t length) { QCALL_CONTRACT; diff --git a/src/coreclr/vm/comutilnative.h b/src/coreclr/vm/comutilnative.h index e01e0aa782d34f..2d9116e135c590 100644 --- a/src/coreclr/vm/comutilnative.h +++ b/src/coreclr/vm/comutilnative.h @@ -74,6 +74,10 @@ extern "C" void QCALLTYPE ExceptionNative_ThrowEntryPointNotFoundException( MethodTable* pInterfaceMT, MethodDesc* pInterfaceMD); +extern "C" void QCALLTYPE ExceptionNative_ThrowMethodAccessException(MethodDesc* caller, MethodDesc* callee); +extern "C" void QCALLTYPE ExceptionNative_ThrowFieldAccessException(MethodDesc* caller, FieldDesc* callee); +extern "C" void QCALLTYPE ExceptionNative_ThrowClassAccessException(MethodDesc* caller, EnregisteredTypeHandle callee); + // // Buffer // diff --git a/src/coreclr/vm/corelib.h b/src/coreclr/vm/corelib.h index 41fd42c4ba3d55..73673f5ee5f14a 100644 --- a/src/coreclr/vm/corelib.h +++ b/src/coreclr/vm/corelib.h @@ -668,6 +668,9 @@ DEFINE_METHOD(THROWHELPERS, THROWNULLREFEXCEPTION, ThrowNullRef DEFINE_METHOD(THROWHELPERS, THROWVERIFICATIONEXCEPTION, ThrowVerificationException, SM_Int_RetVoid) DEFINE_METHOD(THROWHELPERS, THROWAMBIGUOUSRESOLUTIONEXCEPTION, ThrowAmbiguousResolutionException, SM_PtrVoid_PtrVoid_PtrVoid_RetVoid) DEFINE_METHOD(THROWHELPERS, THROWENTRYPOINTNOTFOUNDEXCEPTION, ThrowEntryPointNotFoundException, SM_PtrVoid_PtrVoid_PtrVoid_RetVoid) +DEFINE_METHOD(THROWHELPERS, THROWMETHODACCESSEXCEPTION, ThrowMethodAccessException, SM_PtrVoid_PtrVoid_RetVoid) +DEFINE_METHOD(THROWHELPERS, THROWFIELDACCESSEXCEPTION, ThrowFieldAccessException, SM_PtrVoid_PtrVoid_RetVoid) +DEFINE_METHOD(THROWHELPERS, THROWCLASSACCESSEXCEPTION, ThrowClassAccessException, SM_PtrVoid_PtrVoid_RetVoid) DEFINE_CLASS(UNSAFE, CompilerServices, Unsafe) DEFINE_METHOD(UNSAFE, AS_POINTER, AsPointer, NoSig) diff --git a/src/coreclr/vm/jithelpers.cpp b/src/coreclr/vm/jithelpers.cpp index b4ca2fe92dcd07..1375cc14a08f7b 100644 --- a/src/coreclr/vm/jithelpers.cpp +++ b/src/coreclr/vm/jithelpers.cpp @@ -2129,63 +2129,6 @@ HCIMPL0(void, JIT_FailFast) } HCIMPLEND -HCIMPL2(void, JIT_ThrowMethodAccessException, CORINFO_METHOD_HANDLE caller, CORINFO_METHOD_HANDLE callee) -{ - FCALL_CONTRACT; - - FC_GC_POLL_NOT_NEEDED(); // throws always open up for GC - - HELPER_METHOD_FRAME_BEGIN_ATTRIB_NOPOLL(Frame::FRAME_ATTR_EXCEPTION); // Set up a frame - - MethodDesc* pCallerMD = GetMethod(caller); - - _ASSERTE(pCallerMD != NULL); - AccessCheckContext accessContext(pCallerMD); - - ThrowMethodAccessException(&accessContext, GetMethod(callee)); - - HELPER_METHOD_FRAME_END(); -} -HCIMPLEND - -HCIMPL2(void, JIT_ThrowFieldAccessException, CORINFO_METHOD_HANDLE caller, CORINFO_FIELD_HANDLE callee) -{ - FCALL_CONTRACT; - - FC_GC_POLL_NOT_NEEDED(); // throws always open up for GC - - HELPER_METHOD_FRAME_BEGIN_ATTRIB_NOPOLL(Frame::FRAME_ATTR_EXCEPTION); // Set up a frame - - MethodDesc* pCallerMD = GetMethod(caller); - - _ASSERTE(pCallerMD != NULL); - AccessCheckContext accessContext(pCallerMD); - - ThrowFieldAccessException(&accessContext, reinterpret_cast(callee)); - - HELPER_METHOD_FRAME_END(); -} -HCIMPLEND; - -HCIMPL2(void, JIT_ThrowClassAccessException, CORINFO_METHOD_HANDLE caller, CORINFO_CLASS_HANDLE callee) -{ - FCALL_CONTRACT; - - FC_GC_POLL_NOT_NEEDED(); // throws always open up for GC - - HELPER_METHOD_FRAME_BEGIN_ATTRIB_NOPOLL(Frame::FRAME_ATTR_EXCEPTION); // Set up a frame - - MethodDesc* pCallerMD = GetMethod(caller); - - _ASSERTE(pCallerMD != NULL); - AccessCheckContext accessContext(pCallerMD); - - ThrowTypeAccessException(&accessContext, TypeHandle(callee).GetMethodTable()); - - HELPER_METHOD_FRAME_END(); -} -HCIMPLEND; - //======================================================================== // // DEBUGGER/PROFILER HELPERS diff --git a/src/coreclr/vm/metasig.h b/src/coreclr/vm/metasig.h index 648a33818bd2df..46d5b3dd3d7c0a 100644 --- a/src/coreclr/vm/metasig.h +++ b/src/coreclr/vm/metasig.h @@ -353,6 +353,7 @@ DEFINE_METASIG(SM(IntPtr_IntPtr_RetIntPtr, I I, I)) DEFINE_METASIG(SM(IntPtr_IntPtr_Int_RetIntPtr, I I i, I)) DEFINE_METASIG(SM(PtrVoid_RetVoid, P(v), v)) DEFINE_METASIG(SM(PtrVoid_PtrVoid_RetVoid, P(v) P(v), v)) +DEFINE_METASIG(SM(PtrVoid_PtrVoid_PtrVoid_RetVoid, P(v) P(v) P(v), v)) DEFINE_METASIG(SM(PtrVoid_PtrVoid_UInt_RetVoid, P(v) P(v) K, v)) DEFINE_METASIG(IM(Obj_RetBool, j, F)) DEFINE_METASIG(SM(Obj_RetVoid, j, v)) @@ -570,7 +571,6 @@ DEFINE_METASIG_T(SM(RefCleanupWorkListElement_SafeHandle_RetIntPtr, r(C(CLEANUP_ DEFINE_METASIG_T(SM(RefCleanupWorkListElement_Obj_RetVoid, r(C(CLEANUP_WORK_LIST_ELEMENT)) j, v)) DEFINE_METASIG(SM(PtrVoid_RetPtrVoid, P(v), P(v))) -DEFINE_METASIG(SM(PtrVoid_PtrVoid_PtrVoid_RetVoid, P(v) P(v) P(v), v)) DEFINE_METASIG(IM(PtrVoid_RetVoid, P(v), v)) DEFINE_METASIG_T(SM(IDynamicInterfaceCastable_RuntimeType_Bool_RetBool, C(IDYNAMICINTERFACECASTABLE) C(CLASS) F, F)) diff --git a/src/coreclr/vm/qcallentrypoints.cpp b/src/coreclr/vm/qcallentrypoints.cpp index 370457e145b0e6..2836faa8b8fce8 100644 --- a/src/coreclr/vm/qcallentrypoints.cpp +++ b/src/coreclr/vm/qcallentrypoints.cpp @@ -105,6 +105,9 @@ static const Entry s_QCall[] = DllImportEntry(ExceptionNative_GetMethodFromStackTrace) DllImportEntry(ExceptionNative_ThrowAmbiguousResolutionException) DllImportEntry(ExceptionNative_ThrowEntryPointNotFoundException) + DllImportEntry(ExceptionNative_ThrowMethodAccessException) + DllImportEntry(ExceptionNative_ThrowFieldAccessException) + DllImportEntry(ExceptionNative_ThrowClassAccessException) DllImportEntry(QCall_GetGCHandleForTypeHandle) DllImportEntry(QCall_FreeGCHandleForTypeHandle) DllImportEntry(MethodTable_AreTypesEquivalent)