diff --git a/docs/design/coreclr/botr/corelib.md b/docs/design/coreclr/botr/corelib.md
index 1dd2fc60d4bb08..931deac35f29a6 100644
--- a/docs/design/coreclr/botr/corelib.md
+++ b/docs/design/coreclr/botr/corelib.md
@@ -77,29 +77,29 @@ QCalls should be implemented with a C-style method signature. This makes it easi
Do not replicate the comments into your actual QCall implementation. This is for illustrative purposes.
```CSharp
-class Foo
+partial class Foo
{
- // All QCalls should have the following DllImport attribute
- [DllImport(RuntimeHelpers.QCall, EntryPoint = "Foo_BarInternal", CharSet = CharSet.Unicode)]
-
- // QCalls should always be static extern.
- private static extern bool BarInternal(int flags, string inString, StringHandleOnStack retString);
+ // QCalls that use BEGIN_QCALL must use the hidden last parameter error handler.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+ [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Foo_BarInternal", StringMarshalling = StringMarshalling.Utf16)]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ private static partial bool BarInternal(int flags, string inString, StringHandleOnStack retString);
// Many QCalls have a thin managed wrapper around them to perform
// as much work prior to the transition as possible. An example would be
// argument validation which is easier in managed than native code.
- public string Bar(int flags)
+ public string Bar(int flags, string inString)
{
if (flags != 0)
throw new ArgumentException("Invalid flags");
- string retString = null;
+ string? retString = null;
// The strings are returned from QCalls by taking address
- // of a local variable using StringHandleOnStack
- if (!BarInternal(flags, this.Id, new StringHandleOnStack(ref retString)))
+ // of a local variable using StringHandleOnStack.
+ if (!BarInternal(flags, inString, new StringHandleOnStack(ref retString)))
FatalError();
- return retString;
+ return retString!;
}
}
```
@@ -114,7 +114,8 @@ The QCall entrypoint has to be registered in tables in [vm\qcallentrypoints.cpp]
```C++
// All QCalls should be free functions and tagged with QCALLTYPE and extern "C"
-extern "C" BOOL QCALLTYPE Foo_BarInternal(int flags, LPCWSTR wszString, QCall::StringHandleOnStack retString)
+extern "C" BOOL QCALLTYPE Foo_BarInternal(
+ int flags, LPCWSTR wszString, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError)
{
// All QCalls should have QCALL_CONTRACT.
// It is alias for THROWS; GC_TRIGGERS; MODE_PREEMPTIVE.
@@ -132,7 +133,7 @@ extern "C" BOOL QCALLTYPE Foo_BarInternal(int flags, LPCWSTR wszString, QCall::S
BOOL retVal = FALSE;
// The body has to be enclosed in BEGIN_QCALL/END_QCALL macro.
- // It is necessary for exception handling.
+ // It initializes qcallError and captures exceptions for the managed error handler.
BEGIN_QCALL;
// Argument validation would ideally be in managed, but in some cases
@@ -158,6 +159,9 @@ extern "C" BOOL QCALLTYPE Foo_BarInternal(int flags, LPCWSTR wszString, QCall::S
}
```
+QCalls that return before entering `BEGIN_QCALL`, including no-op fast paths and code excluded
+by platform conditionals, must explicitly set `*qcallError = 0` before returning.
+
## FCall functional behavior
FCalls allow more flexibility in terms of passing object references around, but with higher code complexity and more opportunities to make mistakes. Additionally, for any FCall of non-trivial length, explicitly poll for whether a garbage collection must occur. Failing to do so will lead to starvation issues if managed code repeatedly calls the FCall method in a tight loop, because FCalls execute while the thread only allows the GC to run in a cooperative manner.
diff --git a/src/coreclr/System.Private.CoreLib/System.Private.CoreLib.csproj b/src/coreclr/System.Private.CoreLib/System.Private.CoreLib.csproj
index 011ef476a6fc54..b55f5fdfb79209 100644
--- a/src/coreclr/System.Private.CoreLib/System.Private.CoreLib.csproj
+++ b/src/coreclr/System.Private.CoreLib/System.Private.CoreLib.csproj
@@ -205,6 +205,7 @@
+
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 377fba25b43a36..da33b9dae93f37 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
@@ -11,6 +11,7 @@ namespace Internal.Runtime.CompilerHelpers
internal static unsafe partial class ThrowHelpers
{
[DoesNotReturn]
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ExceptionNative_ThrowAmbiguousResolutionException")]
private static partial void ThrowAmbiguousResolutionException(MethodTable* targetType, MethodTable* interfaceType, void* methodDesc);
@@ -25,6 +26,7 @@ internal static void ThrowAmbiguousResolutionException(
}
[DoesNotReturn]
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ExceptionNative_ThrowEntryPointNotFoundException")]
private static partial void ThrowEntryPointNotFoundException(MethodTable* targetType, MethodTable* interfaceType, void* methodDesc);
@@ -39,6 +41,7 @@ internal static void ThrowEntryPointNotFoundException(
}
[DoesNotReturn]
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ExceptionNative_ThrowMethodAccessException")]
private static partial void ThrowMethodAccessExceptionInternal(void* caller, void* callee);
@@ -53,6 +56,7 @@ internal static void ThrowMethodAccessException(
}
[DoesNotReturn]
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ExceptionNative_ThrowFieldAccessException")]
private static partial void ThrowFieldAccessExceptionInternal(void* caller, void* callee);
@@ -67,6 +71,7 @@ internal static void ThrowFieldAccessException(
}
[DoesNotReturn]
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ExceptionNative_ThrowClassAccessException")]
private static partial void ThrowClassAccessExceptionInternal(void* caller, void* callee);
diff --git a/src/coreclr/System.Private.CoreLib/src/Internal/VersionResilientHashCode.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/Internal/VersionResilientHashCode.CoreCLR.cs
index 226deaa7a75a10..536df305c19fba 100644
--- a/src/coreclr/System.Private.CoreLib/src/Internal/VersionResilientHashCode.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/Internal/VersionResilientHashCode.CoreCLR.cs
@@ -13,6 +13,7 @@ namespace Internal
///
internal static partial class VersionResilientHashCode
{
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "VersionResilientHashCode_TypeHashCode")]
private static partial int TypeHashCode(QCallTypeHandle typeHandle);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/AppContext.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/AppContext.CoreCLR.cs
index c0dedcb85e50b6..b6ad69578ddc66 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/AppContext.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/AppContext.CoreCLR.cs
@@ -16,6 +16,7 @@ private static bool IsKnownHostProperty(string name)
or "PLATFORM_RESOURCE_ROOTS"
or "APP_PATHS";
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AppContext_TryGetHostPropertyValue", StringMarshalling = StringMarshalling.Utf16)]
[return: MarshalAs(UnmanagedType.Bool)]
private static partial bool TryGetHostPropertyValue(string name, StringHandleOnStack retValue);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/ArgIterator.cs b/src/coreclr/System.Private.CoreLib/src/System/ArgIterator.cs
index 63610d0caf0c9f..f896f0b44e3e42 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/ArgIterator.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/ArgIterator.cs
@@ -39,6 +39,7 @@ public ArgIterator(RuntimeArgumentHandle arglist)
Init(ThisPtr, cookie);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ArgIterator_Init")]
private static partial void Init(ArgIterator* thisPtr, IntPtr cookie);
@@ -55,6 +56,7 @@ public ArgIterator(RuntimeArgumentHandle arglist, void* ptr)
Init(ThisPtr, cookie, ptr);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ArgIterator_Init2")]
private static partial void Init(ArgIterator* thisPtr, IntPtr cookie, void* ptr);
@@ -81,6 +83,7 @@ public TypedReference GetNextArg()
return result;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ArgIterator_GetNextArg")]
private static partial void GetNextArg(ArgIterator* thisPtr, TypedReference* pResult);
@@ -116,6 +119,7 @@ public TypedReference GetNextArg(RuntimeTypeHandle rth)
return result;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ArgIterator_GetNextArg2")]
private static partial void GetNextArg(ArgIterator* thisPtr, QCallTypeHandle rth, TypedReference* pResult);
@@ -141,6 +145,7 @@ public RuntimeTypeHandle GetNextArgType()
return RuntimeTypeHandle.FromIntPtr(GetNextArgType(ThisPtr));
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ArgIterator_GetNextArgType")]
private static partial IntPtr GetNextArgType(ArgIterator* thisPtr);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Array.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Array.CoreCLR.cs
index e16d76377cd8f4..509af347e014a1 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Array.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Array.CoreCLR.cs
@@ -15,6 +15,7 @@ namespace System
// IList and IReadOnlyList, where T : U dynamically. See the SZArrayHelper class for details.
public abstract partial class Array : ICloneable, IList, IStructuralComparable, IStructuralEquatable
{
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Array_CreateInstance")]
private static unsafe partial void InternalCreate(QCallTypeHandle type, int rank, int* pLengths, int* pLowerBounds,
[MarshalAs(UnmanagedType.Bool)] bool fromArrayType, ObjectHandleOnStack retArray);
@@ -35,6 +36,7 @@ private static unsafe Array InternalCreateFromArrayType(RuntimeType arrayType, i
return retArray!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Array_Ctor")]
private static unsafe partial void Ctor(MethodTable* pArrayMT, uint dwNumArgs, int* pArgList, ObjectHandleOnStack retArray);
@@ -349,6 +351,7 @@ internal sealed unsafe partial class ArrayInitializeCache : RuntimeType.IGeneric
{
internal readonly delegate*[ ConstructorEntrypoint;
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Array_GetElementConstructorEntrypoint")]
private static partial delegate*][ GetElementConstructorEntrypoint(QCallTypeHandle arrayType);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/CLRConfig.cs b/src/coreclr/System.Private.CoreLib/src/System/CLRConfig.cs
index 31d0d357f93747..25883ec8bebaff 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/CLRConfig.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/CLRConfig.cs
@@ -15,6 +15,7 @@ internal static bool GetBoolValue(string switchName, out bool exist)
return GetConfigBoolValue(switchName, out exist);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ClrConfig_GetConfigBoolValue", StringMarshalling = StringMarshalling.Utf16)]
[return: MarshalAs(UnmanagedType.Bool)]
private static partial bool GetConfigBoolValue(string configSwitchName, [MarshalAs(UnmanagedType.Bool)] out bool exist);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/ComAwareWeakReference.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/ComAwareWeakReference.CoreCLR.cs
index a4694b9fab2522..c2a30fdbee0fba 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/ComAwareWeakReference.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/ComAwareWeakReference.CoreCLR.cs
@@ -9,6 +9,7 @@ namespace System
{
internal sealed partial class ComAwareWeakReference
{
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ComWeakRefToObject")]
private static partial void ComWeakRefToObject(IntPtr pComWeakRef, ObjectHandleOnStack retRcw);
@@ -38,6 +39,7 @@ internal static bool PossiblyComObject(object target)
#endif // FEATURE_COMINTEROP
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ObjectToComWeakRef")]
private static partial IntPtr ObjectToComWeakRef(ObjectHandleOnStack retRcw);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Delegate.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Delegate.CoreCLR.cs
index b27d21da100350..7b3f589273e10f 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Delegate.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Delegate.CoreCLR.cs
@@ -532,6 +532,7 @@ private struct BindToMethodDetails
public GCHandle loaderAllocatorGCHandle; // The loader allocator needed if the delegate needs to keep it alive
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Delegate_BindToMethodName", StringMarshalling = StringMarshalling.Utf8)]
[return: MarshalAs(UnmanagedType.Bool)]
private static partial bool BindToMethodName(MethodTable* pDelegateMT, MethodTable *pTargetMT, QCallTypeHandle methodType, string method, DelegateBindingFlags flags, ObjectHandleOnStack targetParameter, out BindToMethodDetails bindToMethodDetails);
@@ -567,6 +568,7 @@ private bool BindToMethodInfo(object? target, IRuntimeMethodInfo method, Runtime
return ret;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Delegate_BindToMethodInfo")]
[return: MarshalAs(UnmanagedType.Bool)]
private static partial bool BindToMethodInfo(MethodTable* pDelegateMT, MethodTable *pTargetMT, RuntimeMethodHandleInternal method, QCallTypeHandle methodType, DelegateBindingFlags flags, ObjectHandleOnStack targetParameter, out BindToMethodDetails bindToMethodDetails);
@@ -640,12 +642,14 @@ private void DelegateConstruct(object target, IntPtr method)
_target = target;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Delegate_Construct")]
private static partial void Construct(MethodTable* pDelegateMT, MethodTable* pTargetMT, IntPtr method, out BindToMethodDetails bindToMethodDetails);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern unsafe void* GetMulticastInvoke(MethodTable* pMT);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Delegate_GetMulticastInvokeSlow")]
private static unsafe partial void* GetMulticastInvokeSlow(MethodTable* pMT);
@@ -681,6 +685,7 @@ private static unsafe IRuntimeMethodInfo CreateMethodInfo(MethodDesc* methodDesc
return methodInfo!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Delegate_CreateMethodInfo")]
private static unsafe partial void CreateMethodInfo(MethodDesc* methodDesc, ObjectHandleOnStack retMethodInfo);
@@ -691,6 +696,7 @@ private static unsafe IRuntimeMethodInfo CreateMethodInfo(MethodDesc* methodDesc
return GetMethodDesc(ObjectHandleOnStack.Create(ref instance));
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Delegate_GetMethodDesc")]
private static unsafe partial MethodDesc* GetMethodDesc(ObjectHandleOnStack instance);
@@ -887,6 +893,7 @@ internal static IntPtr AdjustTarget(object target, IntPtr methodPtr)
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Delegate_AdjustTarget")]
private static partial IntPtr AdjustTarget(MethodTable* targetMT, IntPtr methodPtr);
@@ -896,6 +903,7 @@ internal void InitializeVirtualCallStub(IntPtr methodPtr)
InitializeVirtualCallStub(ObjectHandleOnStack.Create(ref d), methodPtr);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Delegate_InitializeVirtualCallStub")]
private static partial void InitializeVirtualCallStub(ObjectHandleOnStack d, IntPtr methodPtr);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Diagnostics/Debugger.cs b/src/coreclr/System.Private.CoreLib/src/System/Diagnostics/Debugger.cs
index cd39afd38c997f..c05fa93c540e9c 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Diagnostics/Debugger.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Diagnostics/Debugger.cs
@@ -11,6 +11,7 @@ namespace System.Diagnostics
{
public static partial class Debugger
{
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "DebugDebugger_Break")]
private static partial void BreakInternal();
@@ -83,6 +84,7 @@ static void NotifyOfCrossThreadDependencySlow()
// Posts a custom notification for the attached debugger. If there is no
// debugger attached, has no effect. The debugger may or may not
// report the notification depending on its settings.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "DebugDebugger_CustomNotification")]
private static partial void CustomNotification(ObjectHandleOnStack data);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Diagnostics/StackFrame.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Diagnostics/StackFrame.CoreCLR.cs
index 8c1850d31e840b..1995aa7f8321e6 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Diagnostics/StackFrame.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Diagnostics/StackFrame.CoreCLR.cs
@@ -56,6 +56,7 @@ private void BuildStackFrame(int skipFrames, bool needFileInfo)
private static bool AppendStackFrameWithoutMethodBase(StringBuilder sb) => false;
#pragma warning restore IDE0060
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "StackFrame_GetMethodDescFromNativeIP")]
private static partial RuntimeMethodHandleInternal GetMethodDescFromNativeIP(IntPtr ip);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Diagnostics/StackTrace.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Diagnostics/StackTrace.CoreCLR.cs
index 5d4bc6008e6400..32d1cc583662b2 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Diagnostics/StackTrace.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Diagnostics/StackTrace.CoreCLR.cs
@@ -9,6 +9,7 @@ namespace System.Diagnostics
{
public partial class StackTrace
{
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "StackTrace_GetStackFramesInternal")]
private static partial void GetStackFramesInternal(ObjectHandleOnStack sfh, [MarshalAs(UnmanagedType.Bool)] bool fNeedFileInfo, ObjectHandleOnStack e);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Enum.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Enum.CoreCLR.cs
index fb369e9393f112..bae8139426b253 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Enum.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Enum.CoreCLR.cs
@@ -11,6 +11,7 @@ namespace System
{
public abstract partial class Enum
{
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Enum_GetValuesAndNames")]
private static partial void GetEnumValuesAndNames(QCallTypeHandle enumType, ObjectHandleOnStack values, ObjectHandleOnStack names, Interop.BOOL getNames);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Environment.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Environment.CoreCLR.cs
index b1c7ad10bb4481..b399e195478eb0 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Environment.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Environment.CoreCLR.cs
@@ -20,6 +20,7 @@ public static int CurrentManagedThreadId
// Terminates this process with the given exit code.
/// QCall that passes the integer exit code to the runtime to terminate the process; it accesses no caller-supplied memory.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Environment_Exit")]
[DoesNotReturn]
private static safe partial void _Exit(int exitCode);
@@ -85,6 +86,7 @@ private static void FailFast(ref StackCrawlMark mark, string? message, Exception
FailFast(new StackCrawlMarkHandle(ref mark), message, ObjectHandleOnStack.Create(ref exception), errorMessage);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Environment_FailFast", StringMarshalling = StringMarshalling.Utf16)]
[DoesNotReturn]
private static partial void FailFast(StackCrawlMarkHandle mark, string? message, ObjectHandleOnStack exception, string? errorMessage);
@@ -119,6 +121,7 @@ private static unsafe void InitializeCommandLineArgs(char* exePath, int argc, ch
}
/// QCall that returns the available processor count as an int; it accesses no caller-supplied memory.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Environment_GetProcessorCount")]
internal static safe partial int GetProcessorCount();
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Exception.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Exception.CoreCLR.cs
index defddcdd5c488f..e47402b4cc08cb 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Exception.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Exception.CoreCLR.cs
@@ -55,6 +55,7 @@ private IDictionary CreateDataContainer()
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern bool IsImmutableAgileException(Exception e);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ExceptionNative_GetMethodFromStackTrace")]
private static partial void GetMethodFromStackTrace(ObjectHandleOnStack stackTrace, ObjectHandleOnStack method);
@@ -213,6 +214,7 @@ internal static string GetMessageFromNativeResources(ExceptionMessageKind kind)
return retMesg!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ExceptionNative_GetMessageFromNativeResources")]
private static partial void GetMessageFromNativeResources(ExceptionMessageKind kind, StringHandleOnStack retMesg);
@@ -236,6 +238,7 @@ public DispatchState(
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ExceptionNative_GetFrozenStackTrace")]
private static partial void GetFrozenStackTrace(ObjectHandleOnStack exception, ObjectHandleOnStack stackTrace);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/GC.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/GC.CoreCLR.cs
index 32ff5c2f6fbea3..fa43541492e372 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/GC.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/GC.CoreCLR.cs
@@ -91,10 +91,12 @@ public static GCMemoryInfo GetGCMemoryInfo(GCKind kind)
/// the caller must pass a positive and a that does not
/// exceed it. is the audited entry point that
/// validates both.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCInterface_StartNoGCRegion")]
internal static unsafe partial int _StartNoGCRegion(long totalSize, [MarshalAs(UnmanagedType.Bool)] bool lohSizeKnown, long lohSize, [MarshalAs(UnmanagedType.Bool)] bool disallowFullBlockingGC);
/// QCall that ends the no-GC region and returns a status code; it takes no arguments and accesses no caller-supplied memory.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCInterface_EndNoGCRegion")]
internal static safe partial int _EndNoGCRegion();
@@ -106,16 +108,19 @@ internal enum GC_ALLOC_FLAGS
GC_ALLOC_PINNED_OBJECT_HEAP = 64,
};
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCInterface_AllocateNewArray")]
private static partial void AllocateNewArray(IntPtr typeHandlePtr, int length, GC_ALLOC_FLAGS flags, ObjectHandleOnStack ret);
/// QCall that returns the total managed heap byte count as a scalar; it takes no arguments and accesses no caller-supplied memory.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCInterface_GetTotalMemory")]
private static safe partial long GetTotalMemory();
/// The runtime only asserts that is at least -1 before handing it to the
/// GC, so the caller must not pass a smaller value.
/// is the audited entry point that validates it.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCInterface_Collect")]
private static unsafe partial void _Collect(int generation, int mode, [MarshalAs(UnmanagedType.U1)] bool lowMemoryPressure);
@@ -143,10 +148,12 @@ internal enum GC_ALLOC_FLAGS
internal static extern unsafe ulong GetGenerationSize(int gen);
/// QCall that records added memory pressure from a scalar byte count; it accesses no caller-supplied memory.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCInterface_AddMemoryPressure")]
private static safe partial void _AddMemoryPressure(ulong bytesAllocated);
/// QCall that records removed memory pressure from a scalar byte count; it accesses no caller-supplied memory.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCInterface_RemoveMemoryPressure")]
private static safe partial void _RemoveMemoryPressure(ulong bytesAllocated);
@@ -327,6 +334,7 @@ public static int GetGeneration(WeakReference wo)
//
public static int MaxGeneration => GetMaxGeneration();
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCInterface_GetNextFinalizableObject")]
private static unsafe partial void* GetNextFinalizeableObject(ObjectHandleOnStack target);
@@ -360,6 +368,7 @@ private static unsafe uint RunFinalizers()
}
/// QCall that blocks until pending finalizers drain; it takes no arguments and accesses no caller-supplied memory.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCInterface_WaitForPendingFinalizers")]
private static safe partial void _WaitForPendingFinalizers();
@@ -389,6 +398,7 @@ public static unsafe void SuppressFinalize(object obj)
// for which SuppressFinalize has already been called. The other situation
// where calling ReRegisterForFinalize is useful is inside a finalizer that
// needs to resurrect itself or an object that it references.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCInterface_ReRegisterForFinalize")]
private static partial void ReRegisterForFinalize(ObjectHandleOnStack o);
@@ -433,9 +443,11 @@ public static long GetTotalMemory(bool forceFullCollection)
return newSize;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCInterface_RegisterFrozenSegment")]
private static partial IntPtr _RegisterFrozenSegment(IntPtr sectionAddress, nint sectionSize);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCInterface_UnregisterFrozenSegment")]
private static partial void _UnregisterFrozenSegment(IntPtr segmentHandle);
@@ -455,6 +467,7 @@ public static long GetTotalMemory(bool forceFullCollection)
private static extern safe long GetTotalAllocatedBytesApproximate();
/// QCall that returns a precise process-wide allocated byte count as a scalar; it takes no arguments and accesses no caller-supplied memory.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCInterface_GetTotalAllocatedBytesPrecise")]
private static safe partial long GetTotalAllocatedBytesPrecise();
@@ -467,10 +480,12 @@ public static long GetTotalMemory(bool forceFullCollection)
private static extern safe bool _CancelFullGCNotification();
/// QCall that waits for an approaching full GC using a scalar timeout and returns a status code; it accesses no caller-supplied memory.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCInterface_WaitForFullGCApproach")]
private static safe partial int _WaitForFullGCApproach(int millisecondsTimeout);
/// QCall that waits for full-GC completion using a scalar timeout and returns a status code; it accesses no caller-supplied memory.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCInterface_WaitForFullGCComplete")]
private static safe partial int _WaitForFullGCComplete(int millisecondsTimeout);
@@ -789,6 +804,7 @@ static void Free(NoGCRegionCallbackFinalizerWorkItem* pWorkItem)
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCInterface_EnableNoGCRegionCallback")]
private static unsafe partial EnableNoGCRegionCallbackStatus _EnableNoGCRegionCallback(NoGCRegionCallbackFinalizerWorkItem* callback, long totalSize);
@@ -799,6 +815,7 @@ internal static long GetGenerationBudget(int generation)
/// The GC indexes its per-generation dynamic data with without
/// bounds-checking it, so the caller must pass an existing generation number.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCInterface_GetGenerationBudget")]
internal static unsafe partial long _GetGenerationBudget(int generation);
@@ -965,6 +982,7 @@ internal enum GCConfigurationType
Boolean
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCInterface_EnumerateConfigurationValues")]
internal static unsafe partial void _EnumerateConfigurationValues(void* configurationDictionary, delegate* unmanaged callback);
@@ -1032,6 +1050,7 @@ public static void RefreshMemoryLimit()
Debug.Assert(status == RefreshMemoryStatus.Succeeded);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCInterface_RefreshMemoryLimit")]
internal static partial int _RefreshMemoryLimit(GCHeapHardLimitInfo heapHardLimitInfo);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/IO/FileLoadException.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/IO/FileLoadException.CoreCLR.cs
index ec1d8f194f2a70..3ee05fc25b97da 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/IO/FileLoadException.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/IO/FileLoadException.CoreCLR.cs
@@ -32,9 +32,11 @@ internal static string FormatFileLoadExceptionMessage(string? fileName, int hRes
return string.Format(format!, fileName, message);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall)]
private static partial void GetFileLoadExceptionMessage(int hResult, StringHandleOnStack retString);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "FileLoadException_GetMessageForHR")]
private static partial void GetMessageForHR(int hresult, StringHandleOnStack retString);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/IO/Stream.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/IO/Stream.CoreCLR.cs
index 1a78a6cdf897c9..ac7bc1b8383ebf 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/IO/Stream.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/IO/Stream.CoreCLR.cs
@@ -9,6 +9,7 @@ namespace System.IO
{
public abstract unsafe partial class Stream
{
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Stream_HasOverriddenSlow")]
[return: MarshalAs(UnmanagedType.Bool)]
private static partial bool HasOverriddenSlow(MethodTable* pMT, [MarshalAs(UnmanagedType.Bool)] bool isRead);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Assembly.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Assembly.CoreCLR.cs
index 3ec13fc66b555d..a0b0f5b174d69c 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Assembly.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Assembly.CoreCLR.cs
@@ -54,6 +54,7 @@ public static Assembly Load(AssemblyName assemblyRef)
return RuntimeAssembly.InternalLoad(assemblyRef, ref stackMark, AssemblyLoadContext.CurrentContextualReflectionContext);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetExecutingAssembly")]
private static partial void GetExecutingAssemblyNative(StackCrawlMarkHandle stackMark, ObjectHandleOnStack retAssembly);
@@ -85,6 +86,7 @@ public static Assembly GetCallingAssembly()
return GetExecutingAssembly(ref stackMark);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetEntryAssembly")]
private static partial void GetEntryAssemblyNative(ObjectHandleOnStack retAssembly);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/AssemblyName.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/AssemblyName.CoreCLR.cs
index e36148a3455518..3b0d6f3786d1fe 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/AssemblyName.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/AssemblyName.CoreCLR.cs
@@ -192,6 +192,7 @@ private static unsafe void CreateAssemblyName(AssemblyName* pResult, NativeAssem
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyName_InitializeAssemblySpec")]
private static unsafe partial void InitializeAssemblySpec(NativeAssemblyNameParts* pAssemblyNameParts, void* pAssemblySpec);
}
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/RuntimeAssemblyBuilder.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/RuntimeAssemblyBuilder.cs
index 474e2c68292709..35e845c8a8f1de 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/RuntimeAssemblyBuilder.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/RuntimeAssemblyBuilder.cs
@@ -112,6 +112,7 @@ internal RuntimeAssemblyBuilder(AssemblyName name,
#region DefineDynamicAssembly
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AppDomain_CreateDynamicAssembly")]
private static unsafe partial void CreateDynamicAssembly(ObjectHandleOnStack assemblyLoadContext,
NativeAssemblyNameParts* pAssemblyName,
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/RuntimeModuleBuilder.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/RuntimeModuleBuilder.cs
index dd094bda0c06dd..bc15a724eb3251 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/RuntimeModuleBuilder.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/RuntimeModuleBuilder.cs
@@ -98,9 +98,11 @@ internal void CheckTypeNameConflict(string strTypeName, Type? enclosingType)
return SymbolType.FormCompoundType(strFormat, baseType, 0);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ModuleBuilder_GetTypeRef", StringMarshalling = StringMarshalling.Utf16)]
private static partial int GetTypeRef(QCallModule module, string strFullName, QCallModule refedModule, int tkResolution);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ModuleBuilder_GetMemberRef")]
private static partial int GetMemberRef(QCallModule module, QCallModule refedModule, int tr, int defToken);
@@ -112,6 +114,7 @@ private int GetMemberRef(Module? refedModule, int tr, int defToken)
return GetMemberRef(new QCallModule(ref thisModule), new QCallModule(ref refedRuntimeModule), tr, defToken);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ModuleBuilder_GetMemberRefFromSignature", StringMarshalling = StringMarshalling.Utf16)]
private static partial int GetMemberRefFromSignature(QCallModule module, int tr, string methodName, byte[] signature, int length);
@@ -121,6 +124,7 @@ private int GetMemberRefFromSignature(int tr, string methodName, byte[] signatur
return GetMemberRefFromSignature(new QCallModule(ref thisModule), tr, methodName, signature, length);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ModuleBuilder_GetMemberRefOfMethodInfo")]
private static partial int GetMemberRefOfMethodInfo(QCallModule module, int tr, RuntimeMethodHandleInternal method);
@@ -144,6 +148,7 @@ private int GetMemberRefOfMethodInfo(int tr, RuntimeConstructorInfo method)
return result;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ModuleBuilder_GetMemberRefOfFieldInfo")]
private static partial int GetMemberRefOfFieldInfo(QCallModule module, int tkType, QCallTypeHandle declaringType, int tkField);
@@ -155,6 +160,7 @@ private int GetMemberRefOfFieldInfo(int tkType, RuntimeTypeHandle declaringType,
return GetMemberRefOfFieldInfo(new QCallModule(ref thisModule), tkType, new QCallTypeHandle(ref declaringType), runtimeField.MetadataToken);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ModuleBuilder_GetTokenFromTypeSpec")]
private static partial int GetTokenFromTypeSpec(QCallModule pModule, byte[] signature, int length);
@@ -164,12 +170,15 @@ private int GetTokenFromTypeSpec(byte[] signature, int length)
return GetTokenFromTypeSpec(new QCallModule(ref thisModule), signature, length);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ModuleBuilder_GetArrayMethodToken", StringMarshalling = StringMarshalling.Utf16)]
private static partial int GetArrayMethodToken(QCallModule module, int tkTypeSpec, string methodName, byte[] signature, int sigLength);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ModuleBuilder_GetStringConstant", StringMarshalling = StringMarshalling.Utf16)]
private static partial int GetStringConstant(QCallModule module, string str, int length);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ModuleBuilder_SetFieldRVAContent")]
internal static partial void SetFieldRVAContent(QCallModule module, int fdToken, byte[]? data, int length);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/RuntimeTypeBuilder.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/RuntimeTypeBuilder.cs
index 58fe7960ab3c6d..dc4c74c1f776ac 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/RuntimeTypeBuilder.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/RuntimeTypeBuilder.cs
@@ -57,25 +57,31 @@ public void Bake(RuntimeModuleBuilder module, int token)
#endregion
#region Private Static FCalls
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_SetParentType")]
private static partial void SetParentType(QCallModule module, int tdTypeDef, int tkParent);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_AddInterfaceImpl")]
private static partial void AddInterfaceImpl(QCallModule module, int tdTypeDef, int tkInterface);
#endregion
#region Internal Static FCalls
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_DefineMethod", StringMarshalling = StringMarshalling.Utf16)]
internal static partial int DefineMethod(QCallModule module, int tkParent, string name, byte[] signature, int sigLength,
MethodAttributes attributes);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_DefineMethodSpec")]
internal static partial int DefineMethodSpec(QCallModule module, int tkParent, byte[] signature, int sigLength);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_DefineField", StringMarshalling = StringMarshalling.Utf16)]
internal static partial int DefineField(QCallModule module, int tkParent, string name, byte[] signature, int sigLength,
FieldAttributes attributes);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_SetMethodIL")]
private static partial void SetMethodIL(QCallModule module, int tk, [MarshalAs(UnmanagedType.Bool)] bool isInitLocals,
byte[]? body, int bodyLength,
@@ -84,6 +90,7 @@ private static partial void SetMethodIL(QCallModule module, int tk, [MarshalAs(U
ExceptionHandler[]? exceptions, int numExceptions,
int[]? tokenFixups, int numTokenFixups);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_DefineCustomAttribute")]
private static partial void DefineCustomAttribute(QCallModule module, int tkAssociate, int tkConstructor,
ReadOnlySpan attr, int attrLength);
@@ -95,39 +102,50 @@ internal static void DefineCustomAttribute(RuntimeModuleBuilder module, int tkAs
attr, attr.Length);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_DefineProperty", StringMarshalling = StringMarshalling.Utf16)]
internal static partial int DefineProperty(QCallModule module, int tkParent, string name, PropertyAttributes attributes,
byte[] signature, int sigLength);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_DefineEvent", StringMarshalling = StringMarshalling.Utf16)]
internal static partial int DefineEvent(QCallModule module, int tkParent, string name, EventAttributes attributes, int tkEventType);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_DefineMethodSemantics")]
internal static partial void DefineMethodSemantics(QCallModule module, int tkAssociation,
MethodSemanticsAttributes semantics, int tkMethod);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_DefineMethodImpl")]
internal static partial void DefineMethodImpl(QCallModule module, int tkType, int tkBody, int tkDecl);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_SetMethodImpl")]
internal static partial void SetMethodImpl(QCallModule module, int tkMethod, MethodImplAttributes MethodImplAttributes);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_SetParamInfo", StringMarshalling = StringMarshalling.Utf16)]
internal static partial int SetParamInfo(QCallModule module, int tkMethod, int iSequence,
ParameterAttributes iParamAttributes, string? strParamName);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_GetTokenFromSig")]
internal static partial int GetTokenFromSig(QCallModule module, byte[] signature, int sigLength);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_SetFieldLayoutOffset")]
internal static partial void SetFieldLayoutOffset(QCallModule module, int fdToken, int iOffset);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_SetClassLayout")]
internal static partial void SetClassLayout(QCallModule module, int tk, PackingSize iPackingSize, int iTypeSize);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_SetConstantValue")]
private static unsafe partial void SetConstantValue(QCallModule module, int tk, int corType, void* pValue);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_SetPInvokeData", StringMarshalling = StringMarshalling.Utf16)]
private static partial void SetPInvokeData(QCallModule module, string DllName, string name, int token, int linkFlags);
@@ -533,14 +551,17 @@ protected override bool IsCreatedCore()
#endregion
#region FCalls
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_DefineType", StringMarshalling = StringMarshalling.Utf16)]
private static partial int DefineType(QCallModule module,
string fullname, int tkParent, TypeAttributes attributes, int tkEnclosingType, int[] interfaceTokens);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_DefineGenericParam", StringMarshalling = StringMarshalling.Utf16)]
private static partial int DefineGenericParam(QCallModule module,
string name, int tkParent, GenericParameterAttributes attributes, int position, int[] constraints);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeBuilder_TermCreateClass")]
private static partial void TermCreateClass(QCallModule module, int tk, ObjectHandleOnStack type);
#endregion
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/LoaderAllocator.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/LoaderAllocator.cs
index 0a377941f053a2..5bcad648b210b2 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/LoaderAllocator.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/LoaderAllocator.cs
@@ -26,6 +26,7 @@ internal sealed partial class LoaderAllocatorScout
// This field is set by the VM to atomically transfer the ownership to the managed loader allocator
internal IntPtr m_nativeLoaderAllocator;
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "LoaderAllocator_Destroy")]
[return: MarshalAs(UnmanagedType.Bool)]
private static partial bool Destroy(IntPtr nativeLoaderAllocator);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MdImport.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MdImport.cs
index 885a3305a4e292..63b6ba35c62637 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MdImport.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MdImport.cs
@@ -333,6 +333,7 @@ internal MetadataImport(RuntimeModule module)
}
#endregion
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MetadataImport_Enum")]
private static unsafe partial void Enum(IntPtr scope, int type, int parent, ref int length, int* shortResult, ObjectHandleOnStack longResult);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Metadata/AssemblyExtensions.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Metadata/AssemblyExtensions.cs
index cf47e46a60fcb6..19071f18a75ca6 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Metadata/AssemblyExtensions.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Metadata/AssemblyExtensions.cs
@@ -9,6 +9,7 @@ namespace System.Reflection.Metadata
{
public static partial class AssemblyExtensions
{
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_InternalTryGetRawMetadata")]
[return: MarshalAs(UnmanagedType.Bool)]
private static unsafe partial bool InternalTryGetRawMetadata(QCallAssembly assembly, ref byte* blob, ref int length);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Metadata/MetadataUpdater.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Metadata/MetadataUpdater.cs
index f0b6774ac45503..400188d223d238 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Metadata/MetadataUpdater.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Metadata/MetadataUpdater.cs
@@ -10,9 +10,11 @@ namespace System.Reflection.Metadata
{
public static partial class MetadataUpdater
{
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_ApplyUpdate")]
private static unsafe partial void ApplyUpdate(QCallAssembly assembly, byte* metadataDelta, int metadataDeltaLength, byte* ilDelta, int ilDeltaLength, byte* pdbDelta, int pdbDeltaLength);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_IsApplyUpdateSupported")]
[return: MarshalAs(UnmanagedType.Bool)]
private static unsafe partial bool IsApplyUpdateSupported();
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBase.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBase.CoreCLR.cs
index 8e8d7148b3974e..e2265815e3c1f2 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBase.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MethodBase.CoreCLR.cs
@@ -36,6 +36,7 @@ public abstract partial class MethodBase : MemberInfo
return RuntimeType.GetMethodBase(declaringType.GetRuntimeType(), handle.GetMethodInfo());
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MethodBase_GetCurrentMethod")]
private static partial RuntimeMethodHandleInternal GetCurrentMethod(StackCrawlMarkHandle stackMark);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs
index ea39af1c950455..d9f951f9432677 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs
@@ -67,6 +67,7 @@ public override event ModuleResolveEventHandler? ModuleResolve
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetCodeBase")]
[return: MarshalAs(UnmanagedType.Bool)]
private static partial bool GetCodeBase(QCallAssembly assembly,
@@ -138,6 +139,7 @@ public override AssemblyName GetName(bool copiedName)
return an;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetFullName")]
private static partial void GetFullName(QCallAssembly assembly, StringHandleOnStack retString);
@@ -158,6 +160,7 @@ public override string? FullName
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetEntryPoint")]
private static partial void GetEntryPoint(QCallAssembly assembly, ObjectHandleOnStack retMethod);
@@ -177,6 +180,7 @@ public override MethodInfo? EntryPoint
}
// For case-sensitive lookups, marshal the strings directly to Utf8 to avoid unnecessary string copies.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetTypeCore", StringMarshalling = StringMarshalling.Utf8)]
private static partial void GetTypeCore(QCallAssembly assembly,
string typeName,
@@ -184,6 +188,7 @@ private static partial void GetTypeCore(QCallAssembly assembly,
int nestedTypeNamesLength,
ObjectHandleOnStack retType);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetTypeCoreIgnoreCase", StringMarshalling = StringMarshalling.Utf16)]
private static partial void GetTypeCoreIgnoreCase(QCallAssembly assembly,
string typeName,
@@ -234,6 +239,7 @@ private static partial void GetTypeCoreIgnoreCase(QCallAssembly assembly,
throwOnError: throwOnError, ignoreCase: ignoreCase);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetExportedTypes")]
private static partial void GetExportedTypes(QCallAssembly assembly, ObjectHandleOnStack retTypes);
@@ -266,6 +272,7 @@ public override bool IsCollectible
}
// GetResource will return a pointer to the resources in memory.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetResource", StringMarshalling = StringMarshalling.Utf16)]
private static unsafe partial byte* GetResource(QCallAssembly assembly,
string resourceName,
@@ -394,6 +401,7 @@ internal static unsafe RuntimeAssembly InternalLoad(AssemblyName assemblyName,
return retAssembly!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_InternalLoad")]
private static unsafe partial void InternalLoad(NativeAssemblyNameParts* pAssemblyNameParts,
ObjectHandleOnStack requestingAssembly,
@@ -406,6 +414,7 @@ private static unsafe partial void InternalLoad(NativeAssemblyNameParts* pAssemb
// Returns the module in this assembly with name 'name'
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetModule", StringMarshalling = StringMarshalling.Utf16)]
private static partial void GetModule(QCallAssembly assembly, string name, ObjectHandleOnStack retModule);
@@ -460,6 +469,7 @@ public override FileStream[] GetFiles(bool getResourceModules)
}
// Returns the names of all the resources
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetManifestResourceNames")]
private static partial void GetManifestResourceNames(QCallAssembly assembly, ObjectHandleOnStack retResourceNames);
@@ -473,6 +483,7 @@ public override string[] GetManifestResourceNames()
}
// Returns the names of all the resources
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetReferencedAssemblies")]
private static partial void GetReferencedAssemblies(QCallAssembly assembly, ObjectHandleOnStack retReferencedAssemblies);
@@ -485,6 +496,7 @@ public override AssemblyName[] GetReferencedAssemblies()
return referencedAssemblies!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetManifestResourceInfo", StringMarshalling = StringMarshalling.Utf16)]
private static partial int GetManifestResourceInfo(QCallAssembly assembly,
string resourceName,
@@ -507,6 +519,7 @@ private static partial int GetManifestResourceInfo(QCallAssembly assembly,
(ResourceLocation)location);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetLocation")]
private static partial void GetLocation(QCallAssembly assembly, StringHandleOnStack retString);
@@ -523,6 +536,7 @@ public override string Location
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetImageRuntimeVersion")]
private static partial void GetImageRuntimeVersion(QCallAssembly assembly, StringHandleOnStack retString);
@@ -542,6 +556,7 @@ public override string ImageRuntimeVersion
public override long HostContext => 0;
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetVersion")]
private static partial void GetVersion(QCallAssembly assembly,
out int majVer,
@@ -556,6 +571,7 @@ private Version GetVersion()
return new Version(majorVer, minorVer, build, revision);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetLocale")]
private static partial void GetLocale(QCallAssembly assembly, StringHandleOnStack retString);
@@ -585,6 +601,7 @@ public override bool IsDynamic
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetSimpleName")]
private static partial void GetSimpleName(QCallAssembly assembly, StringHandleOnStack retSimpleName);
@@ -596,6 +613,7 @@ internal string GetSimpleName()
return name!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetHashAlgorithm")]
private static partial AssemblyHashAlgorithm GetHashAlgorithm(QCallAssembly assembly);
@@ -605,6 +623,7 @@ private AssemblyHashAlgorithm GetHashAlgorithm()
return GetHashAlgorithm(new QCallAssembly(ref runtimeAssembly));
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetFlags")]
private static partial AssemblyNameFlags GetFlags(QCallAssembly assembly);
@@ -614,6 +633,7 @@ private AssemblyNameFlags GetFlags()
return GetFlags(new QCallAssembly(ref runtimeAssembly));
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetPublicKey")]
private static partial void GetPublicKey(QCallAssembly assembly, ObjectHandleOnStack retPublicKey);
@@ -670,6 +690,7 @@ public override Assembly GetSatelliteAssembly(CultureInfo culture, Version? vers
return retAssembly;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetModules")]
private static partial void GetModules(QCallAssembly assembly,
[MarshalAs(UnmanagedType.Bool)] bool loadIfNotFound,
@@ -712,6 +733,7 @@ static RuntimeModule GetManifestModuleWorker(RuntimeAssembly assembly)
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern RuntimeModule? GetManifestModule(RuntimeAssembly assembly);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyHandle_GetManifestModuleSlow")]
private static partial void GetManifestModuleSlow(ObjectHandleOnStack assembly, ObjectHandleOnStack module);
@@ -800,6 +822,7 @@ private static void AddPublicNestedTypes(Type type, List types, List GetFullyQualifiedName();
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeModule_GetTypes")]
private static partial void GetTypes(QCallModule module, ObjectHandleOnStack retTypes, ObjectHandleOnStack retExceptions);
@@ -481,6 +483,7 @@ public override MethodInfo[] GetMethods(BindingFlags bindingFlags)
return RuntimeType.GetMethods(bindingFlags);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeModule_GetScopeName")]
private static partial void GetScopeName(QCallModule module, StringHandleOnStack retString);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/TypeNameResolver.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/TypeNameResolver.CoreCLR.cs
index fb79062fe8f54b..7cf4d31e1fee6b 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/TypeNameResolver.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/TypeNameResolver.CoreCLR.cs
@@ -197,6 +197,7 @@ private static unsafe void GetTypeHelper(char* pTypeName, RuntimeAssembly* pRequ
return assembly;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "UnsafeAccessors_ResolveGenericParamToTypeHandle")]
private static partial IntPtr ResolveGenericParamToTypeHandle(IntPtr unsafeAccessorMethod, [MarshalAs(UnmanagedType.Bool)] bool isMethodParam, uint paramIndex);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/AsyncHelpers.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/AsyncHelpers.CoreCLR.cs
index 8277c404a62c50..54c1483731b898 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/AsyncHelpers.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/AsyncHelpers.CoreCLR.cs
@@ -320,6 +320,7 @@ internal static void ReturnTaskContinuation(RuntimeAsyncTaskContinuation continu
}
#if !NATIVEAOT
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AsyncHelpers_AddContinuationToExInternal")]
private static unsafe partial void AddContinuationToExInternal(void* diagnosticIP, ObjectHandleOnStack ex);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/CastHelpers.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/CastHelpers.cs
index 52d3a6234aee98..87334a0e180f58 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/CastHelpers.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/CastHelpers.cs
@@ -14,6 +14,7 @@ internal static unsafe partial class CastHelpers
// In coreclr the table is allocated and written to on the native side.
internal static int[]? s_table;
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ThrowInvalidCastException")]
private static partial void ThrowInvalidCastExceptionInternal(void* fromTypeHnd, void* toTypeHnd);
@@ -32,6 +33,7 @@ internal static void ThrowInvalidCastException(object fromType, void* toTypeHnd)
throw null!; // Provide hint to the inliner that this method does not return
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall)]
[return: MarshalAs(UnmanagedType.Bool)]
private static partial bool IsInstanceOf_NoCacheLookup(void *toTypeHnd, [MarshalAs(UnmanagedType.Bool)] bool throwCastException, ObjectHandleOnStack obj);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/GenericsHelpers.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/GenericsHelpers.cs
index da1a4dec2bf57c..3c7afaa50de995 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/GenericsHelpers.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/GenericsHelpers.cs
@@ -12,6 +12,7 @@ namespace System.Runtime.CompilerServices;
[DebuggerStepThrough]
internal static unsafe partial class GenericsHelpers
{
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall)]
private static partial IntPtr GenericHandleWorker(IntPtr pMD, IntPtr pMT, IntPtr signature, uint dictionaryIndexAndSlot, IntPtr pModule);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/InitHelpers.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/InitHelpers.cs
index e2a52e15d1ab70..ce7c9a800f124e 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/InitHelpers.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/InitHelpers.cs
@@ -11,6 +11,7 @@ namespace System.Runtime.CompilerServices
[DebuggerStepThrough]
internal static unsafe partial class InitHelpers
{
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall)]
private static partial void InitClassHelper(MethodTable* mt);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/QCallExceptionStatus.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/QCallExceptionStatus.cs
new file mode 100644
index 00000000000000..71d3c0e9b7e659
--- /dev/null
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/QCallExceptionStatus.cs
@@ -0,0 +1,62 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Diagnostics;
+using System.Runtime.ExceptionServices;
+using System.Runtime.InteropServices;
+using System.Runtime.InteropServices.Marshalling;
+using System.Threading;
+
+namespace System.Runtime.CompilerServices
+{
+ [NativeMarshalling(typeof(QCallExceptionStatusMarshaller))]
+ [StructLayout(LayoutKind.Sequential)]
+ internal readonly struct QCallExceptionStatus
+ {
+ private readonly nint _value;
+ }
+
+ [CustomMarshaller(typeof(QCallExceptionStatus), MarshalMode.Default, typeof(QCallExceptionStatusMarshaller))]
+ internal static class QCallExceptionStatusMarshaller
+ {
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static nint ConvertToUnmanaged(QCallExceptionStatus _) => 0;
+
+ [StackTraceHidden]
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static QCallExceptionStatus ConvertToManaged(nint status)
+ {
+ if (status != 0)
+ {
+ HandleException(status);
+ }
+
+ return default;
+ }
+
+ [StackTraceHidden]
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ private static void HandleException(nint status)
+ {
+ if ((nuint)status <= 2)
+ {
+ throw Thread.GetQCallSpecialException(status);
+ }
+
+ Exception exception;
+ GCHandle exceptionHandle = GCHandle.FromIntPtr(status);
+ try
+ {
+ exception = (Exception)exceptionHandle.Target!;
+ }
+ finally
+ {
+ exceptionHandle.Free();
+ }
+
+ // Throw during unmarshalling so QCall exception propagation remains as close as
+ // possible to throwing directly from native code, as QCalls did previously.
+ ExceptionDispatchInfo.Throw(exception);
+ }
+ }
+}
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeHelpers.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeHelpers.CoreCLR.cs
index 5a94a338c06588..849aad3e82dfc3 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeHelpers.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeHelpers.CoreCLR.cs
@@ -163,6 +163,7 @@ private static unsafe ref byte GetSpanDataFrom(
// This call will generate an exception if the specified class constructor threw an
// exception when it ran.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(QCall, EntryPoint = "ReflectionInvocation_RunClassConstructor")]
private static partial void RunClassConstructor(QCallTypeHandle type);
@@ -183,6 +184,7 @@ public static void RunClassConstructor(RuntimeTypeHandle type)
// This call will generate an exception if the specified module constructor threw an
// exception when it ran.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(QCall, EntryPoint = "ReflectionInvocation_RunModuleConstructor")]
private static partial void RunModuleConstructor(QCallModule module);
@@ -194,9 +196,11 @@ public static void RunModuleConstructor(ModuleHandle module)
RunModuleConstructor(new QCallModule(ref rm));
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(QCall, EntryPoint = "ReflectionInvocation_CompileMethod")]
internal static partial void CompileMethod(RuntimeMethodHandleInternal method);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(QCall, EntryPoint = "ReflectionInvocation_PrepareMethod")]
private static unsafe partial void PrepareMethod(RuntimeMethodHandleInternal method, IntPtr* pInstantiation, int cInstantiation);
@@ -219,6 +223,7 @@ public static unsafe void PrepareMethod(RuntimeMethodHandle method, RuntimeTypeH
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(QCall, EntryPoint = "ReflectionInvocation_PrepareDelegate")]
private static partial void PrepareDelegate(ObjectHandleOnStack d);
@@ -240,6 +245,7 @@ public static void PrepareDelegate(Delegate d)
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern safe int TryGetHashCode(object? o);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(QCall, EntryPoint = "ObjectNative_GetHashCodeSlow")]
private static partial int GetHashCodeSlow(ObjectHandleOnStack o);
@@ -349,6 +355,7 @@ public static object GetUninitializedObject(
return rt.GetUninitializedObject();
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(QCall, EntryPoint = "ObjectNative_AllocateUninitializedClone")]
internal static partial void AllocateUninitializedClone(ObjectHandleOnStack objHandle);
@@ -482,6 +489,7 @@ internal static unsafe bool ObjectHasFinalizer(object obj)
[Intrinsic]
internal static unsafe MethodTable* GetMethodTable(object obj) => GetMethodTable(obj);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(QCall, EntryPoint = "MethodTable_AreTypesEquivalent")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static unsafe partial bool AreTypesEquivalent(MethodTable* pMTa, MethodTable* pMTb);
@@ -530,15 +538,18 @@ public static IntPtr AllocateTypeAssociatedMemory(Type type, int size, int align
return AllocateTypeAssociatedMemoryAligned(new QCallTypeHandle(ref rt), (uint)size, (uint)alignment);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(QCall, EntryPoint = "RuntimeTypeHandle_AllocateTypeAssociatedMemory")]
private static partial IntPtr AllocateTypeAssociatedMemory(QCallTypeHandle type, uint size);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(QCall, EntryPoint = "RuntimeTypeHandle_AllocateTypeAssociatedMemoryAligned")]
private static partial IntPtr AllocateTypeAssociatedMemoryAligned(QCallTypeHandle type, uint size, uint alignment);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern unsafe TailCallArgBuffer* GetTailCallArgBuffer();
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(QCall, EntryPoint = "TailCallHelp_AllocTailCallArgBufferInternal")]
private static unsafe partial TailCallArgBuffer* AllocTailCallArgBufferInternal(int size);
@@ -1329,6 +1340,7 @@ private static bool CanCastToWorker(TypeHandle srcTH, TypeHandle destTH, bool nu
return CanCastTo_NoCacheLookup(srcTH.m_asTAddr, destTH.m_asTAddr) != Interop.BOOL.FALSE;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeHandle_CanCastTo_NoCacheLookup")]
private static partial Interop.BOOL CanCastTo_NoCacheLookup(void* fromTypeHnd, void* toTypeHnd);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/StaticsHelpers.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/StaticsHelpers.cs
index 1504418b3b4321..408dfc33b90168 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/StaticsHelpers.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/StaticsHelpers.cs
@@ -11,9 +11,11 @@ namespace System.Runtime.CompilerServices
[DebuggerStepThrough]
internal static unsafe partial class StaticsHelpers
{
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall)]
private static partial void GetThreadStaticsByIndex(ByteRefOnStack result, int index, [MarshalAs(UnmanagedType.Bool)] bool gcStatics);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall)]
private static partial void GetThreadStaticsByMethodTable(ByteRefOnStack result, MethodTable* pMT, [MarshalAs(UnmanagedType.Bool)] bool gcStatics);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/VirtualDispatchHelpers.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/VirtualDispatchHelpers.cs
index c9564984c38b41..b91829a2a29909 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/VirtualDispatchHelpers.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/VirtualDispatchHelpers.cs
@@ -58,6 +58,7 @@ private struct VirtualFunctionPointerArgs
private static GenericCache s_virtualFunctionPointerCache = new GenericCache(InitialCacheSize, MaximumCacheSize);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall)]
private static unsafe partial IntPtr ResolveVirtualFunctionPointer(ObjectHandleOnStack obj, IntPtr classHandle, IntPtr methodHandle);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/ControlledExecution.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/ControlledExecution.CoreCLR.cs
index 67971b90caa1b6..e26f2804219649 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/ControlledExecution.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/ControlledExecution.CoreCLR.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Runtime.CompilerServices;
@@ -118,6 +118,7 @@ public static void Run(Action action, CancellationToken cancellationToken)
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ThreadNative_Abort")]
private static partial void AbortThread(ThreadHandle thread);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/DependentHandle.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/DependentHandle.cs
index 8fb031b15a3e91..adb67b4d0782c0 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/DependentHandle.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/DependentHandle.cs
@@ -243,6 +243,7 @@ public void Dispose()
private static IntPtr InternalAllocWithGCTransition(object? target, object? dependent)
=> _InternalAllocWithGCTransition(ObjectHandleOnStack.Create(ref target), ObjectHandleOnStack.Create(ref dependent));
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "DependentHandle_InternalAllocWithGCTransition")]
private static partial IntPtr _InternalAllocWithGCTransition(ObjectHandleOnStack target, ObjectHandleOnStack dependent);
@@ -275,6 +276,7 @@ private static IntPtr InternalAllocWithGCTransition(object? target, object? depe
private static void InternalFreeWithGCTransition(IntPtr dependentHandle)
=> _InternalFreeWithGCTransition(dependentHandle);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "DependentHandle_InternalFreeWithGCTransition")]
private static partial void _InternalFreeWithGCTransition(IntPtr dependentHandle);
}
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/ExceptionServices/InternalCalls.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/ExceptionServices/InternalCalls.cs
index 9a31bf082fb1c5..c295689780aa6b 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/ExceptionServices/InternalCalls.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/ExceptionServices/InternalCalls.cs
@@ -16,18 +16,21 @@ internal static partial class InternalCalls
{
[StackTraceHidden]
[DebuggerHidden]
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "SfiInit")]
[return: MarshalAs(UnmanagedType.U1)]
internal static unsafe partial bool RhpSfiInit(ref StackFrameIterator pThis, void* pStackwalkCtx, [MarshalAs(UnmanagedType.U1)] bool instructionFault, bool* fIsExceptionIntercepted);
[StackTraceHidden]
[DebuggerHidden]
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "SfiNext")]
[return: MarshalAs(UnmanagedType.U1)]
internal static unsafe partial bool RhpSfiNext(ref StackFrameIterator pThis, uint* uExCollideClauseIdx, bool* fUnwoundReversePInvoke, bool* fIsExceptionIntercepted);
[StackTraceHidden]
[DebuggerHidden]
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "CallFilterFunclet")]
[return: MarshalAs(UnmanagedType.U1)]
internal static unsafe partial bool RhpCallFilterFunclet(
@@ -35,6 +38,7 @@ internal static unsafe partial bool RhpCallFilterFunclet(
[StackTraceHidden]
[DebuggerHidden]
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AppendExceptionStackFrame")]
internal static unsafe partial void RhpAppendExceptionStackFrame(ObjectHandleOnStack exceptionObj, IntPtr ip, UIntPtr sp, int flags, EH.ExInfo* exInfo);
@@ -47,6 +51,7 @@ internal static unsafe partial bool RhpCallFilterFunclet(
[StackTraceHidden]
[DebuggerHidden]
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "EHEnumNext")]
[return: MarshalAs(UnmanagedType.U1)]
internal static unsafe partial bool RhpEHEnumNext(void* pEHEnum, void* pEHClause);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/ComWrappers.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/ComWrappers.CoreCLR.cs
index ed2bc12dae227d..466da113acd50f 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/ComWrappers.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/ComWrappers.CoreCLR.cs
@@ -162,6 +162,7 @@ private static IntPtr GetTaggedImplCurrentVersion()
internal sealed partial class ManagedObjectWrapperHolder
{
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ComWrappers_RegisterIsRootedCallback")]
private static partial void RegisterIsRootedCallback();
@@ -170,6 +171,7 @@ private static IntPtr AllocateRefCountedHandle(ManagedObjectWrapperHolder holder
return AllocateRefCountedHandle(ObjectHandleOnStack.Create(ref holder));
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ComWrappers_AllocateRefCountedHandle")]
private static partial IntPtr AllocateRefCountedHandle(ObjectHandleOnStack obj);
}
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/GCHandle.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/GCHandle.CoreCLR.cs
index d6458b09c025ca..8cf8f9981e99fa 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/GCHandle.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/GCHandle.CoreCLR.cs
@@ -22,6 +22,7 @@ internal static IntPtr InternalAlloc(object? value, GCHandleType type)
private static IntPtr InternalAllocWithGCTransition(object? value, GCHandleType type)
=> _InternalAllocWithGCTransition(ObjectHandleOnStack.Create(ref value), type);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCHandle_InternalAllocWithGCTransition")]
private static partial IntPtr _InternalAllocWithGCTransition(ObjectHandleOnStack value, GCHandleType type);
@@ -38,6 +39,7 @@ internal static void InternalFree(IntPtr handle)
private static void InternalFreeWithGCTransition(IntPtr dependentHandle)
=> _InternalFreeWithGCTransition(dependentHandle);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCHandle_InternalFreeWithGCTransition")]
private static partial void _InternalFreeWithGCTransition(IntPtr dependentHandle);
@@ -57,6 +59,7 @@ private static void InternalFreeWithGCTransition(IntPtr dependentHandle)
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern bool InternalTryGetBridgeWait(IntPtr handle, ref object? result);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "GCHandle_InternalGetBridgeWait")]
private static partial void InternalGetBridgeWait(IntPtr handle, ObjectHandleOnStack result);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/Java/JavaMarshal.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/Java/JavaMarshal.CoreCLR.cs
index 51f0f5a3ddc669..e2561f08f3f6d0 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/Java/JavaMarshal.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/Java/JavaMarshal.CoreCLR.cs
@@ -116,13 +116,16 @@ public static unsafe void FinishCrossReferenceProcessing(
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "JavaMarshal_Initialize")]
[return: MarshalAs(UnmanagedType.Bool)]
private static partial bool InitializeInternal(IntPtr callback);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "JavaMarshal_CreateReferenceTrackingHandle")]
private static unsafe partial IntPtr CreateReferenceTrackingHandleInternal(ObjectHandleOnStack obj, void* context);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "JavaMarshal_FinishCrossReferenceProcessing")]
private static unsafe partial void FinishCrossReferenceProcessing(MarkCrossReferencesArgs* crossReferences, nuint length, void* unreachableObjectHandles);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.CoreCLR.cs
index 2c5b2fc27a110b..a1d8d9ab6441a0 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.CoreCLR.cs
@@ -32,6 +32,7 @@ public static partial class Marshal
internal static int SizeOfHelper(RuntimeType t, [MarshalAs(UnmanagedType.Bool)] bool throwIfNotMarshalable)
=> SizeOfHelper(new QCallTypeHandle(ref t), throwIfNotMarshalable);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_SizeOfHelper")]
private static partial int SizeOfHelper(QCallTypeHandle t, [MarshalAs(UnmanagedType.Bool)] bool throwIfNotMarshalable);
@@ -55,6 +56,7 @@ public static IntPtr OffsetOf(Type t, string fieldName)
return offset;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_OffsetOf")]
private static partial nint OffsetOf(IntPtr pFD);
@@ -223,6 +225,7 @@ private static void PrelinkCore(MethodInfo m)
GC.KeepAlive(rmi);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_Prelink")]
private static partial void InternalPrelink(RuntimeMethodHandleInternal m);
@@ -305,6 +308,7 @@ public void InitializeCompositeCache(RuntimeType.CompositeCacheEntry compositeEn
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_HasLayout")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static partial bool HasLayout(QCallTypeHandle t, [MarshalAs(UnmanagedType.Bool)] out bool isBlittable, out int nativeSize);
@@ -407,6 +411,7 @@ internal static unsafe bool IsPinnable(object? obj)
[FeatureSwitchDefinition("System.Runtime.InteropServices.BuiltInComInterop.IsSupported")]
internal static bool IsBuiltInComSupported { get; } = IsBuiltInComSupportedInternal();
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_IsBuiltInComSupported")]
[return: MarshalAs(UnmanagedType.Bool)]
private static partial bool IsBuiltInComSupportedInternal();
@@ -429,6 +434,7 @@ public static IntPtr GetHINSTANCE(Module m)
return (IntPtr)(-1);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_GetHINSTANCE")]
private static partial IntPtr GetHINSTANCE(QCallModule m);
@@ -441,6 +447,7 @@ internal static Exception GetExceptionForHRInternal(int errorCode, IntPtr errorI
return exception!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_GetExceptionForHR")]
private static partial void GetExceptionForHRInternal(int errorCode, IntPtr errorInfo, ObjectHandleOnStack exception);
@@ -452,6 +459,7 @@ internal static Exception GetExceptionForHRInternal(int errorCode, IntPtr errorI
public static int GetHRForException(Exception? e)
=> GetHRForException(ObjectHandleOnStack.Create(ref e));
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_GetHRForException")]
private static partial int GetHRForException(ObjectHandleOnStack exception);
@@ -486,6 +494,7 @@ public static string GetTypeInfoName(ITypeInfo typeInfo)
}
#pragma warning restore IDE0060
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_GetTypeFromCLSID", StringMarshalling = StringMarshalling.Utf16)]
private static partial void GetTypeFromCLSID(in Guid clsid, string? server, ObjectHandleOnStack retType);
@@ -501,6 +510,7 @@ public static string GetTypeInfoName(ITypeInfo typeInfo)
return GetIUnknownForObject(ObjectHandleOnStack.Create(ref o));
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_GetIUnknownForObject")]
private static partial IntPtr /* IUnknown* */ GetIUnknownForObject(ObjectHandleOnStack o);
@@ -515,6 +525,7 @@ public static string GetTypeInfoName(ITypeInfo typeInfo)
return GetIDispatchForObject(ObjectHandleOnStack.Create(ref o));
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_GetIDispatchForObject")]
private static partial IntPtr /* IDispatch* */ GetIDispatchForObject(ObjectHandleOnStack o);
@@ -549,6 +560,7 @@ public static IntPtr GetComInterfaceForObject([DisallowNull] T o)
return GetComInterfaceForObject(ObjectHandleOnStack.Create(ref o), new QCallTypeHandle(ref rt), fEnableCustomizedQueryInterface: mode == CustomQueryInterfaceMode.Allow);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_GetComInterfaceForObject")]
private static partial IntPtr /* IUnknown* */ GetComInterfaceForObject(ObjectHandleOnStack o, QCallTypeHandle t, [MarshalAs(UnmanagedType.Bool)] bool fEnableCustomizedQueryInterface);
@@ -565,6 +577,7 @@ public static object GetObjectForIUnknown(IntPtr /* IUnknown* */ pUnk)
return retObject!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_GetObjectForIUnknown")]
private static partial void GetObjectForIUnknown(IntPtr /* IUnknown* */ pUnk, ObjectHandleOnStack retObject);
@@ -584,6 +597,7 @@ public static object GetUniqueObjectForIUnknown(IntPtr unknown)
/// existing object). This is useful in cases where you want to be able to call
/// ReleaseComObject on a RCW and not worry about other active uses ofsaid RCW.
///
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_GetUniqueObjectForIUnknown")]
private static partial void GetUniqueObjectForIUnknown(IntPtr unknown, ObjectHandleOnStack retObject);
@@ -605,6 +619,7 @@ public static object GetTypedObjectForIUnknown(IntPtr /* IUnknown* */ pUnk, Type
return retObject!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_GetTypedObjectForIUnknown")]
private static partial void GetTypedObjectForIUnknown(IntPtr /* IUnknown* */ pUnk, QCallTypeHandle t, ObjectHandleOnStack retObject);
@@ -623,6 +638,7 @@ public static IntPtr CreateAggregatedObject(IntPtr pOuter, object o)
return CreateAggregatedObject(pOuter, ObjectHandleOnStack.Create(ref o));
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_CreateAggregatedObject")]
private static partial IntPtr CreateAggregatedObject(IntPtr pOuter, ObjectHandleOnStack o);
@@ -640,6 +656,7 @@ public static IntPtr CreateAggregatedObject(IntPtr pOuter, T o) where T : not
public static void CleanupUnusedObjectsInCurrentContext()
=> InternalCleanupUnusedObjectsInCurrentContext();
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_CleanupUnusedObjectsInCurrentContext")]
private static partial void InternalCleanupUnusedObjectsInCurrentContext();
@@ -682,6 +699,7 @@ public static int ReleaseComObject(object o)
return ReleaseComObject(ObjectHandleOnStack.Create(ref co));
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_ReleaseComObject")]
private static partial int ReleaseComObject(ObjectHandleOnStack o);
@@ -707,6 +725,7 @@ public static int FinalReleaseComObject(object o)
return 0;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_FinalReleaseComObject")]
private static partial void FinalReleaseComObject(ObjectHandleOnStack o);
@@ -833,6 +852,7 @@ private static object InternalCreateWrapperOfType(object o, Type t)
return retObject!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_InternalCreateWrapperOfType")]
private static partial void InternalCreateWrapperOfType(ObjectHandleOnStack o, QCallTypeHandle rt, ObjectHandleOnStack retObject);
@@ -849,6 +869,7 @@ public static bool IsTypeVisibleFromCom(Type t)
return IsTypeVisibleFromCom(new QCallTypeHandle(ref rt));
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_IsTypeVisibleFromCom")]
[return: MarshalAs(UnmanagedType.Bool)]
private static partial bool IsTypeVisibleFromCom(QCallTypeHandle rt);
@@ -867,6 +888,7 @@ public static void GetNativeVariantForObject(object? obj, /* VARIANT * */ IntPtr
GetNativeVariantForObject(ObjectHandleOnStack.Create(ref obj), pDstNativeVariant);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_GetNativeVariantForObject")]
private static partial void GetNativeVariantForObject(ObjectHandleOnStack obj, /* VARIANT * */ IntPtr pDstNativeVariant);
@@ -898,6 +920,7 @@ public static void GetNativeVariantForObject(T? obj, IntPtr pDstNativeVariant
return retObject;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_GetObjectForNativeVariant")]
private static partial void GetObjectForNativeVariant(/* VARIANT * */ IntPtr pSrcNativeVariant, ObjectHandleOnStack retObject);
@@ -930,6 +953,7 @@ public static void GetNativeVariantForObject(T? obj, IntPtr pDstNativeVariant
return retArray!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_GetObjectsForNativeVariants")]
private static partial void GetObjectsForNativeVariants(/* VARIANT * */ IntPtr aSrcNativeVariant, int cVars, ObjectHandleOnStack retArray);
@@ -965,6 +989,7 @@ public static int GetStartComSlot(Type t)
return GetStartComSlot(new QCallTypeHandle(ref rt));
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_GetStartComSlot")]
private static partial int GetStartComSlot(QCallTypeHandle rt);
@@ -982,6 +1007,7 @@ public static int GetEndComSlot(Type t)
return GetEndComSlot(new QCallTypeHandle(ref rt));
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_GetEndComSlot")]
private static partial int GetEndComSlot(QCallTypeHandle rt);
@@ -1038,6 +1064,7 @@ public static void ChangeWrapperHandleStrength(object otp, bool fIsWeak)
ChangeWrapperHandleStrength(ObjectHandleOnStack.Create(ref otp), fIsWeak);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_ChangeWrapperHandleStrength")]
private static partial void ChangeWrapperHandleStrength(ObjectHandleOnStack otp, [MarshalAs(UnmanagedType.Bool)] bool fIsWeak);
#endif // FEATURE_COMINTEROP
@@ -1049,6 +1076,7 @@ internal static Delegate GetDelegateForFunctionPointerInternal(IntPtr ptr, Runti
return retDelegate!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_GetDelegateForFunctionPointerInternal")]
private static partial void GetDelegateForFunctionPointerInternal(IntPtr ptr, QCallTypeHandle t, ObjectHandleOnStack retDelegate);
@@ -1057,6 +1085,7 @@ internal static IntPtr GetFunctionPointerForDelegateInternal(Delegate d)
return GetFunctionPointerForDelegateInternal(ObjectHandleOnStack.Create(ref d));
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_GetFunctionPointerForDelegateInternal")]
private static partial IntPtr GetFunctionPointerForDelegateInternal(ObjectHandleOnStack d);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/NativeLibrary.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/NativeLibrary.CoreCLR.cs
index 1c19a684f6d130..223270eaa79d1b 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/NativeLibrary.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/NativeLibrary.CoreCLR.cs
@@ -21,6 +21,7 @@ internal static IntPtr LoadLibraryByName(string libraryName, Assembly assembly,
/// External functions that implement the NativeLibrary interface
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "NativeLibrary_LoadByName", StringMarshalling = StringMarshalling.Utf16)]
internal static partial IntPtr LoadByName(string libraryName, QCallAssembly callingAssembly,
[MarshalAs(UnmanagedType.Bool)] bool hasDllImportSearchPathFlag, uint dllImportSearchPathFlag,
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/ObjectiveCMarshal.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/ObjectiveCMarshal.CoreCLR.cs
index 69bbcb5ee9aab2..3da512e52de25b 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/ObjectiveCMarshal.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/ObjectiveCMarshal.CoreCLR.cs
@@ -21,12 +21,14 @@ public static void SetMessageSendPendingException(Exception? exception)
System.StubHelpers.StubHelpers.SetPendingExceptionObject(exception);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ObjCMarshal_TrySetGlobalMessageSendCallback")]
[return: MarshalAs(UnmanagedType.Bool)]
private static partial bool TrySetGlobalMessageSendCallback(
MessageSendFunction msgSendFunction,
IntPtr func);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ObjCMarshal_TryInitializeReferenceTracker")]
[return: MarshalAs(UnmanagedType.Bool)]
private static unsafe partial bool TryInitializeReferenceTracker(
@@ -53,6 +55,7 @@ private static unsafe bool TryInitializeReferenceTracker(
return result;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ObjCMarshal_AllocateReferenceTrackingHandle")]
private static partial IntPtr AllocateReferenceTrackingHandle(ObjectHandleOnStack obj);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/TrackerObjectManager.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/TrackerObjectManager.CoreCLR.cs
index ac60cd56719b64..7b0c073725c459 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/TrackerObjectManager.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/TrackerObjectManager.CoreCLR.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -39,6 +39,7 @@ private static void RegisterGCCallbacks()
RegisterNativeObjectWrapperCache(ObjectHandleOnStack.Create(ref handleSet));
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TrackerObjectManager_RegisterNativeObjectWrapperCache")]
private static partial void RegisterNativeObjectWrapperCache(ObjectHandleOnStack nativeObjectWrapperCache);
}
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.CoreCLR.cs
index 18bc928a6a1331..5211e252a82b35 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.CoreCLR.cs
@@ -11,23 +11,29 @@ namespace System.Runtime.Loader
{
public partial class AssemblyLoadContext
{
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_InitializeAssemblyLoadContext")]
private static partial IntPtr InitializeAssemblyLoadContext(IntPtr ptrAssemblyLoadContext, [MarshalAs(UnmanagedType.Bool)] bool fRepresentsTPALoadContext, [MarshalAs(UnmanagedType.Bool)] bool isCollectible);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_PrepareForAssemblyLoadContextRelease")]
private static partial void PrepareForAssemblyLoadContextRelease(IntPtr ptrNativeAssemblyBinder, IntPtr ptrAssemblyLoadContextStrong);
[RequiresUnreferencedCode("Types and members the loaded assembly depends on might be removed")]
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_LoadFromStream")]
private static partial void LoadFromStream(IntPtr ptrNativeAssemblyBinder, IntPtr ptrAssemblyArray, int iAssemblyArrayLen, IntPtr ptrSymbols, int iSymbolArrayLen, ObjectHandleOnStack retAssembly);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MultiCoreJIT_InternalSetProfileRoot", StringMarshalling = StringMarshalling.Utf16)]
internal static partial void InternalSetProfileRoot(string directoryPath);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MultiCoreJIT_InternalStartProfile", StringMarshalling = StringMarshalling.Utf16)]
internal static partial void InternalStartProfile(string? profile, IntPtr ptrNativeAssemblyBinder);
[RequiresUnreferencedCode("Types and members the loaded assembly depends on might be removed")]
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_LoadFromPath", StringMarshalling = StringMarshalling.Utf16)]
private static partial void LoadFromPath(IntPtr ptrNativeAssemblyBinder, string? ilPath, ObjectHandleOnStack retAssembly);
@@ -38,21 +44,26 @@ internal static Assembly[] GetLoadedAssemblies()
return assemblies!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetLoadedAssemblies")]
private static partial void GetLoadedAssemblies(ObjectHandleOnStack retAssemblies);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool IsTracingEnabled();
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_TraceResolvingHandlerInvoked", StringMarshalling = StringMarshalling.Utf16)]
internal static partial void TraceResolvingHandlerInvoked(string assemblyName, string handlerName, string? alcName, string? resultAssemblyName, string? resultAssemblyPath);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_TraceAssemblyResolveHandlerInvoked", StringMarshalling = StringMarshalling.Utf16)]
internal static partial void TraceAssemblyResolveHandlerInvoked(string assemblyName, string handlerName, string? resultAssemblyName, string? resultAssemblyPath);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_TraceAssemblyLoadFromResolveHandlerInvoked", StringMarshalling = StringMarshalling.Utf16)]
internal static partial void TraceAssemblyLoadFromResolveHandlerInvoked(string assemblyName, [MarshalAs(UnmanagedType.Bool)] bool isTrackedAssembly, string requestingAssemblyPath, string? requestedAssemblyPath);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_TraceSatelliteSubdirectoryPathProbed", StringMarshalling = StringMarshalling.Utf16)]
internal static partial void TraceSatelliteSubdirectoryPathProbed(string filePath, int hResult);
@@ -79,6 +90,7 @@ internal unsafe Assembly InternalLoad(ReadOnlySpan arrAssembly, ReadOnlySp
}
#if TARGET_WINDOWS
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_LoadFromInMemoryModule")]
private static partial IntPtr LoadFromInMemoryModuleInternal(IntPtr ptrNativeAssemblyBinder, IntPtr hModule, ObjectHandleOnStack retAssembly);
@@ -138,6 +150,7 @@ private static unsafe IntPtr ResolveUnmanagedDllUsingEvent(char* pUnmanagedDllNa
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetLoadContextForAssembly")]
private static partial IntPtr GetLoadContextForAssembly(QCallAssembly assembly);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/RuntimeHandles.cs b/src/coreclr/System.Private.CoreLib/src/System/RuntimeHandles.cs
index 6d36ec298a2845..4c2e270b14d9ce 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/RuntimeHandles.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/RuntimeHandles.cs
@@ -33,6 +33,7 @@ internal RuntimeType GetRuntimeTypeChecked() =>
public static RuntimeTypeHandle FromIntPtr(IntPtr value) =>
new RuntimeTypeHandle(value != IntPtr.Zero ? GetRuntimeTypeFromHandle(value) : null);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_GetRuntimeTypeFromHandleSlow")]
private static partial void GetRuntimeTypeFromHandleSlow(
IntPtr handle,
@@ -263,6 +264,7 @@ internal static object CreateInstanceForAnotherGenericParameter(
return instantiatedObject!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_CreateInstanceForAnotherGenericParameter")]
private static partial void CreateInstanceForAnotherGenericParameter(
QCallTypeHandle baseType,
@@ -285,6 +287,7 @@ internal static object InternalAlloc(RuntimeType type)
return result;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_InternalAlloc")]
private static unsafe partial void InternalAlloc(MethodTable* pMT, ObjectHandleOnStack result);
@@ -303,6 +306,7 @@ static object InternalAllocNoChecksWorker(MethodTable* pMT)
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_InternalAllocNoChecks")]
private static unsafe partial void InternalAllocNoChecks(MethodTable* pMT, ObjectHandleOnStack result);
@@ -342,6 +346,7 @@ internal static void GetActivationInfo(
ctorIsPublic = fCtorIsPublicTemp != Interop.BOOL.FALSE;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_GetActivationInfo")]
private static partial void GetActivationInfo(
ObjectHandleOnStack pRuntimeType,
@@ -352,6 +357,7 @@ private static partial void GetActivationInfo(
Interop.BOOL* pfCtorIsPublic);
#if FEATURE_COMINTEROP
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_AllocateComObject")]
private static partial void AllocateComObject(void* pClassFactory, ObjectHandleOnStack result);
@@ -386,6 +392,7 @@ static RuntimeAssembly GetAssemblyWorker(RuntimeType type)
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern RuntimeAssembly? GetAssemblyIfExists(RuntimeType type);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_GetAssemblySlow")]
private static partial void GetAssemblySlow(ObjectHandleOnStack type, ObjectHandleOnStack assembly);
@@ -405,6 +412,7 @@ static RuntimeModule GetModuleWorker(RuntimeType type)
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern RuntimeModule? GetModuleIfExists(RuntimeType type);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_GetModuleSlow")]
private static partial void GetModuleSlow(ObjectHandleOnStack type, ObjectHandleOnStack module);
@@ -446,6 +454,7 @@ public ModuleHandle GetModuleHandle()
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern int GetToken(RuntimeType type);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_GetMethodAt")]
private static unsafe partial IntPtr GetMethodAt(MethodTable* pMT, int slot);
@@ -473,6 +482,7 @@ internal static Type[] GetArgumentTypesFromFunctionPointer(RuntimeType type)
return argTypes!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_GetArgumentTypesFromFunctionPointer")]
private static partial void GetArgumentTypesFromFunctionPointer(QCallTypeHandle type, ObjectHandleOnStack argTypes);
@@ -524,6 +534,7 @@ internal static IntroducedMethodEnumerator GetIntroducedMethods(RuntimeType type
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void GetNextIntroducedMethod(ref RuntimeMethodHandleInternal method);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_GetFields")]
private static partial Interop.BOOL GetFields(MethodTable* pMT, Span data, ref int usedCount);
@@ -545,6 +556,7 @@ internal static bool GetFields(RuntimeType type, Span buffer, out int co
return success;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_GetInterfaces")]
private static unsafe partial void GetInterfaces(MethodTable* pMT, ObjectHandleOnStack result);
@@ -564,6 +576,7 @@ internal static Type[] GetInterfaces(RuntimeType type)
return result;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_GetConstraints")]
private static partial void GetConstraints(QCallTypeHandle handle, ObjectHandleOnStack types);
@@ -577,6 +590,7 @@ internal static Type[] GetInterfaces(RuntimeType type)
return types;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "QCall_GetGCHandleForTypeHandle")]
private static partial IntPtr GetGCHandle(QCallTypeHandle handle, GCHandleType type);
@@ -586,6 +600,7 @@ internal IntPtr GetGCHandle(GCHandleType type)
return GetGCHandle(new QCallTypeHandle(ref nativeHandle), type);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "QCall_FreeGCHandleForTypeHandle")]
private static partial IntPtr FreeGCHandle(QCallTypeHandle typeHandle, IntPtr objHandle);
@@ -598,6 +613,7 @@ internal IntPtr FreeGCHandle(IntPtr objHandle)
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern int GetNumVirtuals(RuntimeType type);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_GetNumVirtualsAndStaticVirtuals")]
private static partial int GetNumVirtualsAndStaticVirtuals(QCallTypeHandle type);
@@ -607,6 +623,7 @@ internal static int GetNumVirtualsAndStaticVirtuals(RuntimeType type)
return GetNumVirtualsAndStaticVirtuals(new QCallTypeHandle(ref type));
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_VerifyInterfaceIsImplemented")]
private static partial void VerifyInterfaceIsImplemented(QCallTypeHandle handle, QCallTypeHandle interfaceHandle);
@@ -617,6 +634,7 @@ internal void VerifyInterfaceIsImplemented(RuntimeTypeHandle interfaceHandle)
VerifyInterfaceIsImplemented(new QCallTypeHandle(ref nativeHandle), new QCallTypeHandle(ref nativeInterfaceHandle));
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_GetInterfaceMethodImplementation")]
private static partial RuntimeMethodHandleInternal GetInterfaceMethodImplementation(QCallTypeHandle handle, QCallTypeHandle interfaceHandle, RuntimeMethodHandleInternal interfaceMethodHandle);
@@ -627,6 +645,7 @@ internal RuntimeMethodHandleInternal GetInterfaceMethodImplementation(RuntimeTyp
return GetInterfaceMethodImplementation(new QCallTypeHandle(ref nativeHandle), new QCallTypeHandle(ref nativeInterfaceHandle), interfaceMethodHandle);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_IsVisible")]
[return: MarshalAs(UnmanagedType.Bool)]
private static partial bool _IsVisible(QCallTypeHandle typeHandle);
@@ -636,6 +655,7 @@ internal static bool IsVisible(RuntimeType type)
return _IsVisible(new QCallTypeHandle(ref type));
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_ConstructName")]
private static partial void ConstructName(QCallTypeHandle handle, TypeNameFormatFlags formatFlags, StringHandleOnStack retString);
@@ -677,9 +697,11 @@ internal static bool CanCastTo(RuntimeType type, RuntimeType target)
return ret;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_GetDeclaringTypeHandleForGenericVariable")]
private static partial IntPtr GetDeclaringTypeHandleForGenericVariable(IntPtr typeHandle);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_GetDeclaringTypeHandle")]
private static partial IntPtr GetDeclaringTypeHandle(IntPtr typeHandle);
@@ -710,6 +732,7 @@ internal static bool CanCastTo(RuntimeType type, RuntimeType target)
return result;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_GetDeclaringMethodForGenericParameter")]
private static partial void GetDeclaringMethodForGenericParameter(QCallTypeHandle typeHandle, ObjectHandleOnStack result);
@@ -722,6 +745,7 @@ internal static bool CanCastTo(RuntimeType type, RuntimeType target)
return method;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_GetInstantiation")]
internal static partial void GetInstantiation(QCallTypeHandle type, ObjectHandleOnStack types, Interop.BOOL fAsRuntimeTypeArray);
@@ -741,6 +765,7 @@ internal RuntimeType[] GetInstantiationInternal()
return types;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_Instantiate")]
private static partial void Instantiate(QCallTypeHandle handle, IntPtr* pInst, int numGenericArgs, ObjectHandleOnStack type);
@@ -769,6 +794,7 @@ internal RuntimeType Instantiate(Type[]? inst)
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_MakeArray")]
private static partial void MakeArray(QCallTypeHandle handle, int rank, ObjectHandleOnStack type);
@@ -780,6 +806,7 @@ internal RuntimeType MakeArray(int rank)
return type!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_MakeSZArray")]
private static partial void MakeSZArray(QCallTypeHandle handle, ObjectHandleOnStack type);
@@ -791,6 +818,7 @@ internal RuntimeType MakeSZArray()
return type!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_MakeByRef")]
private static partial void MakeByRef(QCallTypeHandle handle, ObjectHandleOnStack type);
@@ -802,6 +830,7 @@ internal RuntimeType MakeByRef()
return type!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_MakeFunctionPointer")]
private static partial void MakeFunctionPointer(nint* retAndParamTypes, int numArgs, [MarshalAs(UnmanagedType.Bool)] bool isUnmanaged, ObjectHandleOnStack type);
@@ -825,6 +854,7 @@ internal RuntimeType MakeFunctionPointer(Type[] parameterTypes, bool isUnmanaged
return type!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_MakePointer")]
private static partial void MakePointer(QCallTypeHandle handle, ObjectHandleOnStack type);
@@ -836,6 +866,7 @@ internal RuntimeType MakePointer()
return type!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_GetGenericTypeDefinition")]
internal static partial void GetGenericTypeDefinition(QCallTypeHandle type, ObjectHandleOnStack retType);
@@ -863,6 +894,7 @@ internal bool ContainsGenericVariables()
return ContainsGenericVariables(GetRuntimeTypeChecked());
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_SatisfiesConstraints")]
private static partial Interop.BOOL SatisfiesConstraints(QCallTypeHandle paramType, QCallTypeHandle pTypeContext, RuntimeMethodHandleInternal pMethodContext, QCallTypeHandle toType);
@@ -874,6 +906,7 @@ internal static bool SatisfiesConstraints(RuntimeType paramType, RuntimeType? ty
return result;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_RegisterCollectibleTypeDependency")]
private static partial void RegisterCollectibleTypeDependency(QCallTypeHandle type, QCallAssembly assembly);
@@ -890,6 +923,7 @@ public void GetObjectData(SerializationInfo info, StreamingContext context)
}
#if FEATURE_TYPEEQUIVALENCE
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_IsEquivalentTo")]
private static partial Interop.BOOL IsEquivalentTo(QCallTypeHandle rtType1, QCallTypeHandle rtType2);
@@ -1051,6 +1085,7 @@ internal bool IsNullHandle()
return m_value == null;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeMethodHandle_GetFunctionPointer")]
internal static partial IntPtr GetFunctionPointer(RuntimeMethodHandleInternal handle);
@@ -1064,6 +1099,7 @@ public IntPtr GetFunctionPointer()
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool IsCollectible(RuntimeMethodHandleInternal method);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeMethodHandle_IsCAVisibleFromDecoratedType")]
internal static partial Interop.BOOL IsCAVisibleFromDecoratedType(
QCallTypeHandle attrTypeHandle,
@@ -1084,6 +1120,7 @@ internal static MethodAttributes GetAttributes(IRuntimeMethodInfo method)
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern MethodImplAttributes GetImplAttributes(IRuntimeMethodInfo method);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeMethodHandle_ConstructInstantiation")]
private static partial void ConstructInstantiation(RuntimeMethodHandleInternal method, TypeNameFormatFlags format, StringHandleOnStack retString);
@@ -1165,6 +1202,7 @@ internal static MdUtf8String GetUtf8Name(RuntimeMethodHandleInternal method)
[DebuggerStepThrough]
[DebuggerHidden]
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeMethodHandle_InvokeMethod")]
private static partial void InvokeMethod(ObjectHandleOnStack target, void** arguments, ObjectHandleOnStack sig, Interop.BOOL isConstructor, ObjectHandleOnStack result);
@@ -1219,6 +1257,7 @@ ref obj.GetRawData(),
return obj;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeMethodHandle_GetMethodInstantiation")]
private static partial void GetMethodInstantiation(RuntimeMethodHandleInternal method, ObjectHandleOnStack types, Interop.BOOL fAsRuntimeTypeArray);
@@ -1258,6 +1297,7 @@ internal static bool HasMethodInstantiation(IRuntimeMethodInfo method)
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern RuntimeMethodHandleInternal GetStubIfNeededInternal(RuntimeMethodHandleInternal method, RuntimeType declaringType);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeMethodHandle_GetStubIfNeededSlow")]
private static partial RuntimeMethodHandleInternal GetStubIfNeededSlow(RuntimeMethodHandleInternal method, QCallTypeHandle declaringTypeHandle, ObjectHandleOnStack methodInstantiation);
@@ -1280,6 +1320,7 @@ static RuntimeMethodHandleInternal GetStubIfNeededWorker(RuntimeMethodHandleInte
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern RuntimeMethodHandleInternal GetMethodFromCanonical(RuntimeMethodHandleInternal method, RuntimeType declaringType);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeMethodHandle_GetNativeCode")]
private static partial IntPtr GetNativeCode(RuntimeMethodHandleInternal method);
@@ -1303,6 +1344,7 @@ internal static bool IsGenericMethodDefinition(IRuntimeMethodInfo method)
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern bool IsTypicalMethodDefinition(IRuntimeMethodInfo method);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeMethodHandle_GetTypicalMethodDefinition")]
private static partial void GetTypicalMethodDefinition(RuntimeMethodHandleInternal method, ObjectHandleOnStack outMethod);
@@ -1322,6 +1364,7 @@ internal static IRuntimeMethodInfo GetTypicalMethodDefinition(IRuntimeMethodInfo
internal static int GetGenericParameterCount(IRuntimeMethodInfo method) => GetGenericParameterCount(IRuntimeMethodInfo.GetValue(method));
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeMethodHandle_StripMethodInstantiation")]
private static partial void StripMethodInstantiation(RuntimeMethodHandleInternal method, ObjectHandleOnStack outMethod);
@@ -1338,12 +1381,14 @@ internal static IRuntimeMethodInfo StripMethodInstantiation(IRuntimeMethodInfo m
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool IsDynamicMethod(RuntimeMethodHandleInternal method);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeMethodHandle_Destroy")]
internal static partial void Destroy(RuntimeMethodHandleInternal method);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern Resolver GetResolver(RuntimeMethodHandleInternal method);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeMethodHandle_GetMethodBody")]
private static partial void GetMethodBody(RuntimeMethodHandleInternal method, QCallTypeHandle declaringType, ObjectHandleOnStack result);
@@ -1566,6 +1611,7 @@ internal static RuntimeType GetApproxDeclaringType(IRuntimeFieldInfo field)
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern IntPtr GetStaticFieldAddress(RtFieldInfo field);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeFieldHandle_GetRVAFieldInfo")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static partial bool GetRVAFieldInfo(RuntimeFieldHandleInternal field, out void* address, out uint size);
@@ -1586,6 +1632,7 @@ internal static ref byte GetFieldDataReference(ref byte target, RuntimeFieldInfo
return ref Unsafe.AddByteOffset(ref target, offset);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeFieldHandle_GetFieldDataReference")]
private static unsafe partial void GetFieldDataReference(IntPtr fieldDesc, ObjectHandleOnStack target, ByteRefOnStack fieldDataRef);
@@ -1599,6 +1646,7 @@ internal static int GetToken(RtFieldInfo field)
return tk;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeFieldHandle_GetValue")]
private static partial void GetValue(
IntPtr fieldDesc,
@@ -1621,6 +1669,7 @@ private static partial void GetValue(
return result;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeFieldHandle_GetValueDirect")]
private static partial void GetValueDirect(
IntPtr fieldDesc,
@@ -1642,6 +1691,7 @@ private static partial void GetValueDirect(
return result;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeFieldHandle_SetValue")]
private static partial void SetValue(
IntPtr fieldDesc,
@@ -1662,6 +1712,7 @@ internal static void SetValue(RtFieldInfo field, object? obj, object? value, Run
GC.KeepAlive(field);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeFieldHandle_SetValueDirect")]
private static partial void SetValueDirect(
IntPtr fieldDesc,
@@ -1715,6 +1766,7 @@ public void GetObjectData(SerializationInfo info, StreamingContext context)
throw new PlatformNotSupportedException();
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeFieldHandle_GetEnCFieldAddr")]
private static partial void* GetEnCFieldAddr(ObjectHandleOnStack tgt, void* pFD);
@@ -1790,6 +1842,7 @@ public bool Equals(ModuleHandle handle)
public static bool operator !=(ModuleHandle left, ModuleHandle right) => !left.Equals(right);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ModuleHandle_GetDynamicMethod", StringMarshalling = StringMarshalling.Utf8)]
private static partial void GetDynamicMethod(
QCallModule module,
@@ -1879,6 +1932,7 @@ public RuntimeTypeHandle ResolveTypeHandle(int typeToken, RuntimeTypeHandle[]? t
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ModuleHandle_ResolveType")]
private static partial void ResolveType(QCallModule module,
int typeToken,
@@ -1931,6 +1985,7 @@ internal static RuntimeMethodHandleInternal ResolveMethodHandleInternal(RuntimeM
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ModuleHandle_ResolveMethod")]
private static partial RuntimeMethodHandleInternal ResolveMethod(QCallModule module,
int methodToken,
@@ -1985,6 +2040,7 @@ public RuntimeFieldHandle ResolveFieldHandle(int fieldToken, RuntimeTypeHandle[]
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ModuleHandle_ResolveField")]
private static partial void ResolveField(QCallModule module,
int fieldToken,
@@ -1994,6 +2050,7 @@ private static partial void ResolveField(QCallModule module,
int methodInstCount,
ObjectHandleOnStack retField);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ModuleHandle_GetModuleType")]
internal static partial void GetModuleType(QCallModule handle, ObjectHandleOnStack type);
@@ -2004,6 +2061,7 @@ internal static RuntimeType GetModuleType(RuntimeModule module)
return type!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ModuleHandle_GetPEKind")]
private static partial void GetPEKind(QCallModule handle, int* peKind, int* machine);
@@ -2047,6 +2105,7 @@ internal sealed unsafe partial class Signature
private RuntimeMethodHandleInternal _pMethod;
#endregion
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Signature_Init")]
private static partial void Init(
ObjectHandleOnStack _this,
@@ -2120,6 +2179,7 @@ internal RuntimeType[] Arguments
internal RuntimeType ReturnType => _returnTypeORfieldType;
internal RuntimeType FieldType => _returnTypeORfieldType;
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Signature_AreEqual")]
private static partial Interop.BOOL AreEqual(
void* sig1, int csig1, QCallTypeHandle type1,
@@ -2183,6 +2243,7 @@ internal SignatureCallingConvention GetCallingConventionFromFunctionPointerAtOff
internal Type[] GetCustomModifiers(int parameterIndex, bool required) =>
GetCustomModifiersAtOffset(GetParameterOffset(parameterIndex), required);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Signature_GetCustomModifiersAtOffset")]
private static partial void GetCustomModifiersAtOffset(
ObjectHandleOnStack sigObj,
diff --git a/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.BoxCache.cs b/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.BoxCache.cs
index ca46521ec21c78..3518f1af6df0f3 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.BoxCache.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.BoxCache.cs
@@ -130,6 +130,7 @@ private static void GetBoxInfo(
valueTypeSize = valueTypeSizeTemp;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ReflectionInvocation_GetBoxInfo")]
private static partial void GetBoxInfo(
QCallTypeHandle type,
diff --git a/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs
index 849f33fd9afb81..3e4d90b0cb8161 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs
@@ -3414,6 +3414,7 @@ public override unsafe Guid GUID
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ReflectionInvocation_GetGuid")]
private static unsafe partial void GetGuid(MethodTable* pMT, Guid* result);
@@ -3426,6 +3427,7 @@ private static unsafe void GetComObjectGuidWorker(RuntimeType type, Guid* result
GetComObjectGuid(ObjectHandleOnStack.Create(ref type), result);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ReflectionInvocation_GetComObjectGuid")]
private static unsafe partial void GetComObjectGuid(ObjectHandleOnStack type, Guid* result);
#endif // FEATURE_COMINTEROP
@@ -4136,6 +4138,7 @@ internal void CallDefaultStructConstructor(ref byte data)
#endregion
#if FEATURE_COMINTEROP
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ReflectionInvocation_InvokeDispMethod")]
private static partial void InvokeDispMethod(
ObjectHandleOnStack type,
@@ -4366,6 +4369,7 @@ private enum DispatchWrapperType : int
#region Library
internal readonly unsafe partial struct MdUtf8String
{
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MdUtf8String_EqualsCaseInsensitive")]
[return: MarshalAs(UnmanagedType.Bool)]
private static partial bool EqualsCaseInsensitive(void* szLhs, void* szRhs, int cSz);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CreateUninitializedCache.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CreateUninitializedCache.CoreCLR.cs
index 0612afd03825c0..17eab423c66f7d 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CreateUninitializedCache.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CreateUninitializedCache.CoreCLR.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
@@ -75,6 +75,7 @@ private static void GetCreateUninitializedInfo(
vAllocatorFirstArg = vAllocatorFirstArgTemp;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ReflectionSerialization_GetCreateUninitializedObjectInfo")]
private static partial void GetCreateUninitializedInfo(
QCallTypeHandle type,
diff --git a/src/coreclr/System.Private.CoreLib/src/System/String.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/String.CoreCLR.cs
index 8e4fbf43f9e64d..e0101ede01e40d 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/String.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/String.CoreCLR.cs
@@ -22,6 +22,7 @@ internal static unsafe string FastAllocateString(nint length)
return FastAllocateString(TypeHandle.TypeHandleOf().AsMethodTable(), length);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "String_Intern")]
private static partial void Intern(StringHandleOnStack src);
@@ -32,6 +33,7 @@ public static string Intern(string str)
return str;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "String_IsInterned")]
private static partial void IsInterned(StringHandleOnStack src);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/StubHelpers.cs b/src/coreclr/System.Private.CoreLib/src/System/StubHelpers.cs
index 39271d165c007e..ec8d4191b8052d 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/StubHelpers.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/StubHelpers.cs
@@ -538,6 +538,7 @@ internal static void ConvertToNative(object objSrc, IntPtr pDstVariant)
ConvertToNative(ObjectHandleOnStack.Create(ref objSrc), pDstVariant);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ObjectMarshaler_ConvertToNative")]
private static partial void ConvertToNative(ObjectHandleOnStack objSrc, IntPtr pDstVariant);
@@ -548,6 +549,7 @@ internal static object ConvertToManaged(IntPtr pSrcVariant)
return retObject!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ObjectMarshaler_ConvertToManaged")]
private static partial void ConvertToManaged(IntPtr pSrcVariant, ObjectHandleOnStack retObject);
@@ -631,6 +633,7 @@ internal static IntPtr ConvertToNative(object? objSrc, IntPtr itfMT, IntPtr clas
return ConvertToNative(ObjectHandleOnStack.Create(ref objSrc), itfMT, classMT, flags);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "InterfaceMarshaler_ConvertToNative")]
private static partial IntPtr ConvertToNative(ObjectHandleOnStack objSrc, IntPtr itfMT, IntPtr classMT, int flag);
@@ -644,6 +647,7 @@ internal static IntPtr ConvertToNative(object? objSrc, IntPtr itfMT, IntPtr clas
return retObject;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "InterfaceMarshaler_ConvertToManaged")]
private static partial void ConvertToManaged(ref IntPtr ppUnk, IntPtr itfMT, IntPtr classMT, int flags, ObjectHandleOnStack retObject);
@@ -662,9 +666,11 @@ internal static object GetObjectForComCallableWrapperIUnknown(IntPtr unk)
return retObject!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "InterfaceMarshaler_GetObjectForComCallableWrapperIUnknown")]
private static partial void GetObjectForComCallableWrapperIUnknown(IntPtr unk, ObjectHandleOnStack retObject);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "InterfaceMarshaler_ValidateComVisibilityForIUnknown")]
internal static partial void ValidateComVisibilityForIUnknown(IntPtr unk);
} // class InterfaceMarshaler
@@ -684,6 +690,7 @@ internal static void ConvertSpaceToNative(IntPtr pMarshalState, in object pManag
ConvertSpaceToNative(pMarshalState, ObjectHandleOnStack.Create(ref managedHome), pNativeHome);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MngdSafeArrayMarshaler_ConvertSpaceToNative")]
private static partial void ConvertSpaceToNative(IntPtr pMarshalState, ObjectHandleOnStack pManagedHome, IntPtr pNativeHome);
@@ -694,6 +701,7 @@ internal static void ConvertContentsToNative(IntPtr pMarshalState, in object pMa
ConvertContentsToNative(pMarshalState, ObjectHandleOnStack.Create(ref managedHome), pNativeHome, ObjectHandleOnStack.Create(ref originalManagedObject));
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MngdSafeArrayMarshaler_ConvertContentsToNative")]
private static partial void ConvertContentsToNative(IntPtr pMarshalState, ObjectHandleOnStack pManagedHome, IntPtr pNativeHome, ObjectHandleOnStack pOriginalManagedObject);
@@ -704,6 +712,7 @@ internal static void ConvertSpaceToManaged(IntPtr pMarshalState, ref object? pMa
pManagedHome = managedHome;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MngdSafeArrayMarshaler_ConvertSpaceToManaged")]
private static partial void ConvertSpaceToManaged(IntPtr pMarshalState, ObjectHandleOnStack pManagedHome, IntPtr pNativeHome);
@@ -713,6 +722,7 @@ internal static void ConvertContentsToManaged(IntPtr pMarshalState, in object pM
ConvertContentsToManaged(pMarshalState, ObjectHandleOnStack.Create(ref managedHome), pNativeHome);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MngdSafeArrayMarshaler_ConvertContentsToManaged")]
private static partial void ConvertContentsToManaged(IntPtr pMarshalState, ObjectHandleOnStack pManagedHome, IntPtr pNativeHome);
@@ -723,6 +733,7 @@ internal static void ClearNative(IntPtr pMarshalState, in object pManagedHome, I
}
#pragma warning restore IDE0060 // Remove unused parameter
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MngdSafeArrayMarshaler_ClearNative")]
private static partial void ClearNative(IntPtr pMarshalState, IntPtr pNativeHome);
} // class MngdSafeArrayMarshaler
@@ -2176,9 +2187,11 @@ internal static partial class StubHelpers
internal static extern safe void SetLastError();
/// QCall that throws an interop parameter exception selected by integer resource and parameter indices; it accesses no caller-supplied memory.
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "StubHelpers_ThrowInteropParamException")]
internal static safe partial void ThrowInteropParamException(int resID, int paramIdx);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "StubHelpers_ThrowInteropException")]
internal static partial void ThrowInteropException(int exceptionKind, int resID);
@@ -2235,6 +2248,7 @@ internal static void SetPendingExceptionObject(Exception? exception)
s_pendingExceptionObject = exception;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "StubHelpers_CreateCustomMarshaler")]
internal static partial void CreateCustomMarshaler(IntPtr pMD, int paramToken, IntPtr hndManagedType, ObjectHandleOnStack customMarshaler);
@@ -2342,6 +2356,7 @@ internal static void SafeHandleRelease(SafeHandle pHandle)
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern IntPtr GetCOMIPFromRCW(object objSrc, IntPtr pInterfaceMT, int comSlot, out IntPtr ppTarget);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "StubHelpers_GetCOMIPFromRCWSlow")]
private static partial IntPtr GetCOMIPFromRCWSlow(ObjectHandleOnStack objSrc, IntPtr pInterfaceMT, int comSlot, out IntPtr ppTarget, [MarshalAs(UnmanagedType.Bool)] out bool pfNeedsRelease);
@@ -2368,9 +2383,11 @@ static IntPtr GetCOMIPFromRCWWorker(object objSrc, IntPtr pInterfaceMT, int comS
//-------------------------------------------------------
// Profiler helpers
//-------------------------------------------------------
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "StubHelpers_ProfilerBeginTransitionCallback")]
internal static unsafe partial void* ProfilerBeginTransitionCallback(void* pTargetMD);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "StubHelpers_ProfilerEndTransitionCallback")]
internal static unsafe partial void ProfilerEndTransitionCallback(void* pTargetMD);
#endif // PROFILING_SUPPORTED
@@ -2391,6 +2408,7 @@ internal static void CheckStringLength(uint length)
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "StubHelpers_CreateLayoutClassMarshalStubs")]
internal static unsafe partial void CreateLayoutClassMarshalStubs(QCallTypeHandle th, out delegate*][ pConvertToUnmanaged, out delegate*][ pConvertToManaged, out delegate*][ pFree);
@@ -2505,9 +2523,11 @@ internal static void ThrowWrongSizeArrayInNativeStruct()
}
#if FEATURE_VARARGS
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint="StubHelpers_MarshalToManagedVaList")]
internal static partial void MarshalToManagedVaList(IntPtr va_list, IntPtr pArgIterator);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint="StubHelpers_MarshalToUnmanagedVaList")]
internal static partial void MarshalToUnmanagedVaList(IntPtr va_list, uint vaListSize, IntPtr pArgIterator);
@@ -2518,12 +2538,14 @@ internal static void ThrowWrongSizeArrayInNativeStruct()
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern void LogPinnedArgument(IntPtr localDesc, IntPtr nativeArg);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint="StubHelpers_ValidateObject")]
private static partial void ValidateObject(ObjectHandleOnStack obj, IntPtr pMD);
internal static void ValidateObject(object obj, IntPtr pMD)
=> ValidateObject(ObjectHandleOnStack.Create(ref obj), pMD);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint="StubHelpers_ValidateByref")]
internal static partial void ValidateByref(IntPtr byref, IntPtr pMD); // the byref is pinned so we can safely "cast" it to IntPtr
@@ -2536,6 +2558,7 @@ internal static void MulticastDebuggerTraceHelper(object o, int count)
MulticastDebuggerTraceHelperQCall(ObjectHandleOnStack.Create(ref o), count);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint="StubHelpers_MulticastDebuggerTraceHelper")]
private static partial void MulticastDebuggerTraceHelperQCall(ObjectHandleOnStack obj, int count);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Threading/ObjectHeader.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Threading/ObjectHeader.CoreCLR.cs
index bd87f0f6c7ca56..fd0a9d8cbd6840 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Threading/ObjectHeader.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Threading/ObjectHeader.CoreCLR.cs
@@ -88,6 +88,7 @@ static Lock GetLockObjectFallback(object obj)
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern IntPtr GetLockHandleIfExists(object obj);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ObjectHeader_GetOrCreateLockObject")]
private static partial void GetOrCreateLockObject(ObjectHandleOnStack obj, ObjectHandleOnStack lockObj);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Threading/Thread.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Threading/Thread.CoreCLR.cs
index e2048965583295..e4571fbb2974cf 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Threading/Thread.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Threading/Thread.CoreCLR.cs
@@ -57,6 +57,18 @@ public sealed partial class Thread
private Thread() { }
+ internal static Exception GetQCallSpecialException(nint status)
+ {
+ Exception? exception = null;
+ GetQCallSpecialException(status, ObjectHandleOnStack.Create(ref exception));
+ Debug.Assert(exception is not null);
+ return exception;
+ }
+
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+ [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ThreadNative_GetQCallSpecialException")]
+ private static partial void GetQCallSpecialException(nint status, ObjectHandleOnStack exception);
+
public int ManagedThreadId
{
[Intrinsic]
@@ -92,6 +104,7 @@ private unsafe void StartCore()
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ThreadNative_Start")]
private static unsafe partial Interop.BOOL StartInternal(ThreadHandle t, int stackSize, int priority, Interop.BOOL isThreadPool, char* pThreadName, ObjectHandleOnStack exception);
@@ -142,6 +155,7 @@ public static void SpinWait(int iterations)
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ThreadNative_YieldThread")]
private static partial Interop.BOOL YieldInternal();
@@ -155,6 +169,7 @@ private static Thread InitializeCurrentThread()
return t_currentThread = thread!;
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ThreadNative_GetCurrentThread")]
private static partial void GetCurrentThread(ObjectHandleOnStack thread);
@@ -164,6 +179,7 @@ private void Initialize()
Initialize(ObjectHandleOnStack.Create(ref _this));
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ThreadNative_Initialize")]
private static partial void Initialize(ObjectHandleOnStack thread);
@@ -179,6 +195,7 @@ private void ThreadNameChanged(string? value)
GC.KeepAlive(this);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ThreadNative_InformThreadNameChange", StringMarshalling = StringMarshalling.Utf16)]
private static partial void InformThreadNameChange(ThreadHandle t, string? name, int len);
@@ -222,6 +239,7 @@ public bool IsBackground
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ThreadNative_GetIsBackground")]
private static partial Interop.BOOL GetIsBackground(ThreadHandle t);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ThreadNative_SetIsBackground")]
private static partial void SetIsBackground(ThreadHandle t, Interop.BOOL value);
@@ -250,6 +268,7 @@ internal set
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ThreadNative_SetPriority")]
[return: MarshalAs(UnmanagedType.Bool)]
private static partial void SetPriority(ObjectHandleOnStack thread, int priority);
@@ -273,6 +292,7 @@ public ThreadPriority Priority
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ThreadNative_GetCurrentOSThreadId")]
private static partial ulong GetCurrentOSThreadId();
@@ -320,9 +340,11 @@ internal unsafe void ClearWaitSleepJoinState()
/// single-threaded or multi-threaded apartment.
///
#if FEATURE_COMINTEROP_APARTMENT_SUPPORT
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ThreadNative_GetApartmentState")]
private static partial int GetApartmentState(ObjectHandleOnStack t);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ThreadNative_SetApartmentState")]
private static partial int SetApartmentState(ObjectHandleOnStack t, int state);
@@ -418,9 +440,11 @@ public void Interrupt()
}
#if TARGET_WINDOWS
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ThreadNative_Interrupt")]
private static partial void Interrupt(ThreadHandle t);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ThreadNative_GetOSHandle")]
private static partial SafeWaitHandle GetOSHandle(ThreadHandle t);
@@ -584,9 +608,11 @@ private static unsafe void OnThreadExited(Thread* pThread, Exception* pException
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ThreadNative_ReentrantWaitAny")]
internal static unsafe partial int ReentrantWaitAny([MarshalAs(UnmanagedType.Bool)] bool alertable, int timeout, int count, IntPtr* handles);
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ThreadNative_CheckForPendingInterrupt")]
internal static partial void CheckForPendingInterrupt();
diff --git a/src/coreclr/System.Private.CoreLib/src/System/TypeLoadException.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/TypeLoadException.CoreCLR.cs
index eb13a78c9e2a50..6dc54827aa3dae 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/TypeLoadException.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/TypeLoadException.CoreCLR.cs
@@ -45,6 +45,7 @@ private void SetMessageField()
}
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall)]
private static partial void GetTypeLoadExceptionMessage(int resourceId, StringHandleOnStack retString);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/ValueType.cs b/src/coreclr/System.Private.CoreLib/src/System/ValueType.cs
index 2fcecf86864836..270be212a2286b 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/ValueType.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/ValueType.cs
@@ -82,6 +82,7 @@ private static unsafe bool CanCompareBitsOrUseFastGetHashCode(MethodTable* pMT)
return CanCompareBitsOrUseFastGetHashCodeHelper(pMT);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MethodTable_CanCompareBitsOrUseFastGetHashCode")]
[return: MarshalAs(UnmanagedType.Bool)]
private static unsafe partial bool CanCompareBitsOrUseFastGetHashCodeHelper(MethodTable* pMT);
@@ -162,6 +163,7 @@ private enum ValueTypeHashCodeStrategy
ValueTypeOverride,
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "ValueType_GetHashCodeStrategy")]
private static unsafe partial ValueTypeHashCodeStrategy GetHashCodeStrategy(
MethodTable* pMT, ObjectHandleOnStack objHandle, out uint fieldOffset, out uint fieldSize, out MethodTable* fieldMT);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Variant.cs b/src/coreclr/System.Private.CoreLib/src/System/Variant.cs
index 0d2cb9c302c259..b7105f82049c2e 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Variant.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Variant.cs
@@ -18,6 +18,7 @@ internal static partial class Variant
{
internal static bool IsSystemDrawingColor(Type type) => type.FullName == "System.Drawing.Color"; // Matches the behavior of IsTypeRefOrDef
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Variant_ConvertValueTypeToRecord")]
private static partial void ConvertValueTypeToRecord(ObjectHandleOnStack obj, out ComVariant pOle);
@@ -27,6 +28,7 @@ internal static ComVariant GetIUnknownOrIDispatchFromObject(object? obj)
return ComVariant.CreateRaw(isIDispatch ? VarEnum.VT_DISPATCH : VarEnum.VT_UNKNOWN, pUnk);
}
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_GetIUnknownOrIDispatchForObject")]
private static partial IntPtr GetIUnknownOrIDispatchForObject(ObjectHandleOnStack o, [MarshalAs(UnmanagedType.Bool)] out bool isIDispatch);
diff --git a/src/coreclr/vm/JitQCallHelpers.h b/src/coreclr/vm/JitQCallHelpers.h
index 2242e475966e42..589be9d0722388 100644
--- a/src/coreclr/vm/JitQCallHelpers.h
+++ b/src/coreclr/vm/JitQCallHelpers.h
@@ -18,12 +18,12 @@ class Module;
class MethodTable;
class MethodDesc;
-extern "C" void * QCALLTYPE ResolveVirtualFunctionPointer(QCall::ObjectHandleOnStack obj, CORINFO_CLASS_HANDLE classHnd, CORINFO_METHOD_HANDLE methodHnd);
-extern "C" CORINFO_GENERIC_HANDLE QCALLTYPE GenericHandleWorker(MethodDesc * pMD, MethodTable * pMT, LPVOID signature, DWORD dictionaryIndexAndSlot, Module* pModule);
-extern "C" void QCALLTYPE InitClassHelper(MethodTable* pMT);
-extern "C" void QCALLTYPE ThrowInvalidCastException(CORINFO_CLASS_HANDLE pTargetType, CORINFO_CLASS_HANDLE pSourceType);
-extern "C" void QCALLTYPE GetThreadStaticsByMethodTable(QCall::ByteRefOnStack refHandle, MethodTable* pMT, BOOL gcStatic);
-extern "C" void QCALLTYPE GetThreadStaticsByIndex(QCall::ByteRefOnStack refHandle, uint32_t staticBlockIndex, BOOL gcStatic);
-extern "C" BOOL QCALLTYPE IsInstanceOf_NoCacheLookup(CORINFO_CLASS_HANDLE type, BOOL throwCastException, QCall::ObjectHandleOnStack objOnStack);
+extern "C" void * QCALLTYPE ResolveVirtualFunctionPointer(QCall::ObjectHandleOnStack obj, CORINFO_CLASS_HANDLE classHnd, CORINFO_METHOD_HANDLE methodHnd, QCallExceptionStatus* qcallError);
+extern "C" CORINFO_GENERIC_HANDLE QCALLTYPE GenericHandleWorker(MethodDesc * pMD, MethodTable * pMT, LPVOID signature, DWORD dictionaryIndexAndSlot, Module* pModule, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE InitClassHelper(MethodTable* pMT, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE ThrowInvalidCastException(CORINFO_CLASS_HANDLE pTargetType, CORINFO_CLASS_HANDLE pSourceType, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE GetThreadStaticsByMethodTable(QCall::ByteRefOnStack refHandle, MethodTable* pMT, BOOL gcStatic, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE GetThreadStaticsByIndex(QCall::ByteRefOnStack refHandle, uint32_t staticBlockIndex, BOOL gcStatic, QCallExceptionStatus* qcallError);
+extern "C" BOOL QCALLTYPE IsInstanceOf_NoCacheLookup(CORINFO_CLASS_HANDLE type, BOOL throwCastException, QCall::ObjectHandleOnStack objOnStack, QCallExceptionStatus* qcallError);
#endif //_JITQCALLHELPERS_H
diff --git a/src/coreclr/vm/appdomainnative.cpp b/src/coreclr/vm/appdomainnative.cpp
index ffcf604e4e5280..092505035a63d8 100644
--- a/src/coreclr/vm/appdomainnative.cpp
+++ b/src/coreclr/vm/appdomainnative.cpp
@@ -16,7 +16,7 @@
#include "stringarraylist.h"
// static
-extern "C" void QCALLTYPE AppDomain_CreateDynamicAssembly(QCall::ObjectHandleOnStack assemblyLoadContext, NativeAssemblyNameParts* pAssemblyNameParts, INT32 hashAlgorithm, INT32 access, QCall::ObjectHandleOnStack retAssembly)
+extern "C" void QCALLTYPE AppDomain_CreateDynamicAssembly(QCall::ObjectHandleOnStack assemblyLoadContext, NativeAssemblyNameParts* pAssemblyNameParts, INT32 hashAlgorithm, INT32 access, QCall::ObjectHandleOnStack retAssembly, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -41,7 +41,7 @@ extern "C" void QCALLTYPE AppDomain_CreateDynamicAssembly(QCall::ObjectHandleOnS
END_QCALL;
}
-extern "C" void QCALLTYPE AssemblyNative_GetLoadedAssemblies(QCall::ObjectHandleOnStack retAssemblies)
+extern "C" void QCALLTYPE AssemblyNative_GetLoadedAssemblies(QCall::ObjectHandleOnStack retAssemblies, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -141,7 +141,7 @@ namespace
}
// Get the value of a known host property from the binder/AppDomain state.
-extern "C" BOOL QCALLTYPE AppContext_TryGetHostPropertyValue(LPCWSTR name, QCall::StringHandleOnStack retValue)
+extern "C" BOOL QCALLTYPE AppContext_TryGetHostPropertyValue(LPCWSTR name, QCall::StringHandleOnStack retValue, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -234,7 +234,7 @@ extern "C" BOOL QCALLTYPE AppContext_TryGetHostPropertyValue(LPCWSTR name, QCall
return found;
}
-extern "C" void QCALLTYPE String_IsInterned(QCall::StringHandleOnStack str)
+extern "C" void QCALLTYPE String_IsInterned(QCall::StringHandleOnStack str, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -251,7 +251,7 @@ extern "C" void QCALLTYPE String_IsInterned(QCall::StringHandleOnStack str)
END_QCALL;
}
-extern "C" void QCALLTYPE String_Intern(QCall::StringHandleOnStack str)
+extern "C" void QCALLTYPE String_Intern(QCall::StringHandleOnStack str, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
diff --git a/src/coreclr/vm/appdomainnative.hpp b/src/coreclr/vm/appdomainnative.hpp
index 1ddcc1da98df49..bc7eed9d818f92 100644
--- a/src/coreclr/vm/appdomainnative.hpp
+++ b/src/coreclr/vm/appdomainnative.hpp
@@ -16,13 +16,13 @@
#include "qcall.h"
-extern "C" void QCALLTYPE String_Intern(QCall::StringHandleOnStack str);
-extern "C" void QCALLTYPE String_IsInterned(QCall::StringHandleOnStack str);
+extern "C" void QCALLTYPE String_Intern(QCall::StringHandleOnStack str, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE String_IsInterned(QCall::StringHandleOnStack str, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AppDomain_CreateDynamicAssembly(QCall::ObjectHandleOnStack assemblyLoadContext, NativeAssemblyNameParts* pAssemblyName, INT32 hashAlgorithm, INT32 access, QCall::ObjectHandleOnStack retAssembly);
+extern "C" void QCALLTYPE AppDomain_CreateDynamicAssembly(QCall::ObjectHandleOnStack assemblyLoadContext, NativeAssemblyNameParts* pAssemblyName, INT32 hashAlgorithm, INT32 access, QCall::ObjectHandleOnStack retAssembly, QCallExceptionStatus* qcallError);
extern "C" void QCALLTYPE AppContext_SetFirstChanceExceptionHandler();
-extern "C" BOOL QCALLTYPE AppContext_TryGetHostPropertyValue(LPCWSTR name, QCall::StringHandleOnStack retValue);
+extern "C" BOOL QCALLTYPE AppContext_TryGetHostPropertyValue(LPCWSTR name, QCall::StringHandleOnStack retValue, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_GetLoadedAssemblies(QCall::ObjectHandleOnStack retAssemblies);
+extern "C" void QCALLTYPE AssemblyNative_GetLoadedAssemblies(QCall::ObjectHandleOnStack retAssemblies, QCallExceptionStatus* qcallError);
#endif
diff --git a/src/coreclr/vm/arraynative.cpp b/src/coreclr/vm/arraynative.cpp
index dd33b595930cf8..4986e61dd4c996 100644
--- a/src/coreclr/vm/arraynative.cpp
+++ b/src/coreclr/vm/arraynative.cpp
@@ -28,7 +28,7 @@ FCIMPL1(INT32, ArrayNative::GetCorElementTypeOfElementType, ArrayBase* arrayUNSA
}
FCIMPLEND
-extern "C" PCODE QCALLTYPE Array_GetElementConstructorEntrypoint(QCall::TypeHandle pArrayTypeHnd)
+extern "C" PCODE QCALLTYPE Array_GetElementConstructorEntrypoint(QCall::TypeHandle pArrayTypeHnd, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -107,7 +107,7 @@ static void CheckElementType(TypeHandle elementType)
}
}
-extern "C" void QCALLTYPE Array_CreateInstance(QCall::TypeHandle pTypeHnd, INT32 rank, INT32* pLengths, INT32* pLowerBounds, BOOL createFromArrayType, QCall::ObjectHandleOnStack retArray)
+extern "C" void QCALLTYPE Array_CreateInstance(QCall::TypeHandle pTypeHnd, INT32 rank, INT32* pLengths, INT32* pLowerBounds, BOOL createFromArrayType, QCall::ObjectHandleOnStack retArray, QCallExceptionStatus* qcallError)
{
CONTRACTL {
QCALL_CHECK;
@@ -203,7 +203,7 @@ Done: ;
END_QCALL;
}
-extern "C" void QCALLTYPE Array_Ctor(MethodTable* pArrayMT, UINT32 dwNumArgs, INT32* pArgList, QCall::ObjectHandleOnStack retArray)
+extern "C" void QCALLTYPE Array_Ctor(MethodTable* pArrayMT, UINT32 dwNumArgs, INT32* pArgList, QCall::ObjectHandleOnStack retArray, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
diff --git a/src/coreclr/vm/arraynative.h b/src/coreclr/vm/arraynative.h
index 949c6674c0b571..3bb51b91d67063 100644
--- a/src/coreclr/vm/arraynative.h
+++ b/src/coreclr/vm/arraynative.h
@@ -21,8 +21,8 @@ class ArrayNative
FCDECL1(static INT32, GetCorElementTypeOfElementType, ArrayBase* arrayUNSAFE);
};
-extern "C" PCODE QCALLTYPE Array_GetElementConstructorEntrypoint(QCall::TypeHandle pArrayTypeHnd);
-extern "C" void QCALLTYPE Array_CreateInstance(QCall::TypeHandle pTypeHnd, INT32 rank, INT32* pLengths, INT32* pBounds, BOOL createFromArrayType, QCall::ObjectHandleOnStack retArray);
-extern "C" void QCALLTYPE Array_Ctor(MethodTable* pArrayMT, UINT32 dwNumArgs, INT32* pArgList, QCall::ObjectHandleOnStack retArray);
+extern "C" PCODE QCALLTYPE Array_GetElementConstructorEntrypoint(QCall::TypeHandle pArrayTypeHnd, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE Array_CreateInstance(QCall::TypeHandle pTypeHnd, INT32 rank, INT32* pLengths, INT32* pBounds, BOOL createFromArrayType, QCall::ObjectHandleOnStack retArray, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE Array_Ctor(MethodTable* pArrayMT, UINT32 dwNumArgs, INT32* pArgList, QCall::ObjectHandleOnStack retArray, QCallExceptionStatus* qcallError);
#endif // _ARRAYNATIVE_H_
diff --git a/src/coreclr/vm/assemblynative.cpp b/src/coreclr/vm/assemblynative.cpp
index 09dcff1745694c..e190e0fc631733 100644
--- a/src/coreclr/vm/assemblynative.cpp
+++ b/src/coreclr/vm/assemblynative.cpp
@@ -36,7 +36,8 @@ extern "C" void QCALLTYPE AssemblyNative_InternalLoad(NativeAssemblyNameParts* p
QCall::StackCrawlMarkHandle stackMark,
BOOL fThrowOnFileNotFound,
QCall::ObjectHandleOnStack assemblyLoadContext,
- QCall::ObjectHandleOnStack retAssembly)
+ QCall::ObjectHandleOnStack retAssembly,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -187,7 +188,7 @@ Assembly* AssemblyNative::LoadFromPEImage(AssemblyBinder* pBinder, PEImage *pIma
return pCurDomain->LoadAssembly(&spec, pPEAssembly, FILE_LOADED);
}
-extern "C" void QCALLTYPE AssemblyNative_LoadFromPath(INT_PTR ptrNativeAssemblyBinder, LPCWSTR pwzILPath, QCall::ObjectHandleOnStack retLoadedAssembly)
+extern "C" void QCALLTYPE AssemblyNative_LoadFromPath(INT_PTR ptrNativeAssemblyBinder, LPCWSTR pwzILPath, QCall::ObjectHandleOnStack retLoadedAssembly, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -238,7 +239,8 @@ extern "C" void QCALLTYPE AssemblyNative_LoadFromPath(INT_PTR ptrNativeAssemblyB
/*static */
extern "C" void QCALLTYPE AssemblyNative_LoadFromStream(INT_PTR ptrNativeAssemblyBinder, INT_PTR ptrAssemblyArray,
INT32 cbAssemblyArrayLength, INT_PTR ptrSymbolArray, INT32 cbSymbolArrayLength,
- QCall::ObjectHandleOnStack retLoadedAssembly)
+ QCall::ObjectHandleOnStack retLoadedAssembly,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -302,7 +304,7 @@ extern "C" void QCALLTYPE AssemblyNative_LoadFromStream(INT_PTR ptrNativeAssembl
#ifdef TARGET_WINDOWS
/*static */
-extern "C" void QCALLTYPE AssemblyNative_LoadFromInMemoryModule(INT_PTR ptrNativeAssemblyBinder, INT_PTR hModule, QCall::ObjectHandleOnStack retLoadedAssembly)
+extern "C" void QCALLTYPE AssemblyNative_LoadFromInMemoryModule(INT_PTR ptrNativeAssemblyBinder, INT_PTR hModule, QCall::ObjectHandleOnStack retLoadedAssembly, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -336,7 +338,7 @@ extern "C" void QCALLTYPE AssemblyNative_LoadFromInMemoryModule(INT_PTR ptrNativ
}
#endif
-extern "C" void QCALLTYPE AssemblyNative_GetLocation(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString)
+extern "C" void QCALLTYPE AssemblyNative_GetLocation(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -353,7 +355,8 @@ extern "C" void QCALLTYPE AssemblyNative_GetTypeCore(QCall::AssemblyHandle pAsse
LPCSTR szTypeName,
LPCSTR * rgszNestedTypeNames,
int32_t cNestedTypeNamesLength,
- QCall::ObjectHandleOnStack retType)
+ QCall::ObjectHandleOnStack retType,
+ QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -421,7 +424,8 @@ extern "C" void QCALLTYPE AssemblyNative_GetTypeCoreIgnoreCase(QCall::AssemblyHa
LPCWSTR wszTypeName,
LPCWSTR* rgwszNestedTypeNames,
int32_t cNestedTypeNamesLength,
- QCall::ObjectHandleOnStack retType)
+ QCall::ObjectHandleOnStack retType,
+ QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -496,7 +500,7 @@ extern "C" void QCALLTYPE AssemblyNative_GetTypeCoreIgnoreCase(QCall::AssemblyHa
END_QCALL;
}
-extern "C" void QCALLTYPE AssemblyNative_GetForwardedType(QCall::AssemblyHandle pAssembly, mdToken mdtExternalType, QCall::ObjectHandleOnStack retType)
+extern "C" void QCALLTYPE AssemblyNative_GetForwardedType(QCall::AssemblyHandle pAssembly, mdToken mdtExternalType, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -539,7 +543,7 @@ FCIMPL1(FC_BOOL_RET, AssemblyNative::GetIsDynamic, Assembly* pAssembly)
}
FCIMPLEND
-extern "C" void QCALLTYPE AssemblyNative_GetVersion(QCall::AssemblyHandle pAssembly, INT32* pMajorVersion, INT32* pMinorVersion, INT32*pBuildNumber, INT32* pRevisionNumber)
+extern "C" void QCALLTYPE AssemblyNative_GetVersion(QCall::AssemblyHandle pAssembly, INT32* pMajorVersion, INT32* pMinorVersion, INT32*pBuildNumber, INT32* pRevisionNumber, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -557,7 +561,7 @@ extern "C" void QCALLTYPE AssemblyNative_GetVersion(QCall::AssemblyHandle pAssem
END_QCALL;
}
-extern "C" void QCALLTYPE AssemblyNative_GetPublicKey(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retPublicKey)
+extern "C" void QCALLTYPE AssemblyNative_GetPublicKey(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retPublicKey, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -570,7 +574,7 @@ extern "C" void QCALLTYPE AssemblyNative_GetPublicKey(QCall::AssemblyHandle pAss
END_QCALL;
}
-extern "C" void QCALLTYPE AssemblyNative_GetSimpleName(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retSimpleName)
+extern "C" void QCALLTYPE AssemblyNative_GetSimpleName(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retSimpleName, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -579,7 +583,7 @@ extern "C" void QCALLTYPE AssemblyNative_GetSimpleName(QCall::AssemblyHandle pAs
END_QCALL;
}
-extern "C" void QCALLTYPE AssemblyNative_GetLocale(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString)
+extern "C" void QCALLTYPE AssemblyNative_GetLocale(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -594,7 +598,7 @@ extern "C" void QCALLTYPE AssemblyNative_GetLocale(QCall::AssemblyHandle pAssemb
END_QCALL;
}
-extern "C" BOOL QCALLTYPE AssemblyNative_GetCodeBase(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString)
+extern "C" BOOL QCALLTYPE AssemblyNative_GetCodeBase(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -614,29 +618,33 @@ extern "C" BOOL QCALLTYPE AssemblyNative_GetCodeBase(QCall::AssemblyHandle pAsse
return ret;
}
-extern "C" INT32 QCALLTYPE AssemblyNative_GetHashAlgorithm(QCall::AssemblyHandle pAssembly)
+extern "C" INT32 QCALLTYPE AssemblyNative_GetHashAlgorithm(QCall::AssemblyHandle pAssembly, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
INT32 retVal=0;
+
BEGIN_QCALL;
+
retVal = pAssembly->GetPEAssembly()->GetHashAlgId();
END_QCALL;
return retVal;
}
-extern "C" INT32 QCALLTYPE AssemblyNative_GetFlags(QCall::AssemblyHandle pAssembly)
+extern "C" INT32 QCALLTYPE AssemblyNative_GetFlags(QCall::AssemblyHandle pAssembly, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
INT32 retVal=0;
+
BEGIN_QCALL;
+
retVal = pAssembly->GetPEAssembly()->GetFlags();
END_QCALL;
return retVal;
}
-extern "C" BYTE * QCALLTYPE AssemblyNative_GetResource(QCall::AssemblyHandle pAssembly, LPCWSTR wszName, DWORD * length)
+extern "C" BYTE * QCALLTYPE AssemblyNative_GetResource(QCall::AssemblyHandle pAssembly, LPCWSTR wszName, DWORD * length, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -666,7 +674,7 @@ extern "C" BYTE * QCALLTYPE AssemblyNative_GetResource(QCall::AssemblyHandle pAs
return pbInMemoryResource;
}
-extern "C" INT32 QCALLTYPE AssemblyNative_GetManifestResourceInfo(QCall::AssemblyHandle pAssembly, LPCWSTR wszName, QCall::ObjectHandleOnStack retAssembly, QCall::StringHandleOnStack retFileName)
+extern "C" INT32 QCALLTYPE AssemblyNative_GetManifestResourceInfo(QCall::AssemblyHandle pAssembly, LPCWSTR wszName, QCall::ObjectHandleOnStack retAssembly, QCall::StringHandleOnStack retFileName, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -708,7 +716,7 @@ extern "C" INT32 QCALLTYPE AssemblyNative_GetManifestResourceInfo(QCall::Assembl
return rv;
}
-extern "C" void QCALLTYPE AssemblyNative_GetModules(QCall::AssemblyHandle pAssembly, BOOL fLoadIfNotFound, BOOL fGetResourceModules, QCall::ObjectHandleOnStack retModules)
+extern "C" void QCALLTYPE AssemblyNative_GetModules(QCall::AssemblyHandle pAssembly, BOOL fLoadIfNotFound, BOOL fGetResourceModules, QCall::ObjectHandleOnStack retModules, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -779,7 +787,7 @@ extern "C" uint32_t QCALLTYPE AssemblyNative_GetAssemblyCount()
return g_cAssemblies;
}
-extern "C" void QCALLTYPE AssemblyNative_GetModule(QCall::AssemblyHandle pAssembly, LPCWSTR wszFileName, QCall::ObjectHandleOnStack retModule)
+extern "C" void QCALLTYPE AssemblyNative_GetModule(QCall::AssemblyHandle pAssembly, LPCWSTR wszFileName, QCall::ObjectHandleOnStack retModule, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -816,7 +824,7 @@ extern "C" void QCALLTYPE AssemblyNative_GetModule(QCall::AssemblyHandle pAssemb
END_QCALL;
}
-extern "C" void QCALLTYPE AssemblyNative_GetExportedTypes(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retTypes)
+extern "C" void QCALLTYPE AssemblyNative_GetExportedTypes(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retTypes, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -933,7 +941,7 @@ extern "C" void QCALLTYPE AssemblyNative_GetExportedTypes(QCall::AssemblyHandle
END_QCALL;
}
-extern "C" void QCALLTYPE AssemblyNative_GetForwardedTypes(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retTypes)
+extern "C" void QCALLTYPE AssemblyNative_GetForwardedTypes(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retTypes, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1001,7 +1009,7 @@ extern "C" void QCALLTYPE AssemblyNative_GetForwardedTypes(QCall::AssemblyHandle
END_QCALL;
}
-extern "C" void QCALLTYPE AssemblyNative_GetManifestResourceNames(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retResourceNames)
+extern "C" void QCALLTYPE AssemblyNative_GetManifestResourceNames(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retResourceNames, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1043,7 +1051,7 @@ extern "C" void QCALLTYPE AssemblyNative_GetManifestResourceNames(QCall::Assembl
END_QCALL;
}
-extern "C" void QCALLTYPE AssemblyNative_GetReferencedAssemblies(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retReferencedAssemblies)
+extern "C" void QCALLTYPE AssemblyNative_GetReferencedAssemblies(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retReferencedAssemblies, QCallExceptionStatus* qcallError)
{
BEGIN_QCALL;
@@ -1089,7 +1097,7 @@ extern "C" void QCALLTYPE AssemblyNative_GetReferencedAssemblies(QCall::Assembly
END_QCALL;
}
-extern "C" void QCALLTYPE AssemblyNative_GetEntryPoint(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retMethod)
+extern "C" void QCALLTYPE AssemblyNative_GetEntryPoint(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retMethod, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1113,7 +1121,7 @@ extern "C" void QCALLTYPE AssemblyNative_GetEntryPoint(QCall::AssemblyHandle pAs
//
//
-extern "C" void QCALLTYPE AssemblyNative_GetFullName(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString)
+extern "C" void QCALLTYPE AssemblyNative_GetFullName(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1126,7 +1134,7 @@ extern "C" void QCALLTYPE AssemblyNative_GetFullName(QCall::AssemblyHandle pAsse
END_QCALL;
}
-extern "C" void QCALLTYPE AssemblyNative_GetExecutingAssembly(QCall::StackCrawlMarkHandle stackMark, QCall::ObjectHandleOnStack retAssembly)
+extern "C" void QCALLTYPE AssemblyNative_GetExecutingAssembly(QCall::StackCrawlMarkHandle stackMark, QCall::ObjectHandleOnStack retAssembly, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1142,7 +1150,7 @@ extern "C" void QCALLTYPE AssemblyNative_GetExecutingAssembly(QCall::StackCrawlM
END_QCALL;
}
-extern "C" void QCALLTYPE AssemblyNative_GetEntryAssembly(QCall::ObjectHandleOnStack retAssembly)
+extern "C" void QCALLTYPE AssemblyNative_GetEntryAssembly(QCall::ObjectHandleOnStack retAssembly, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1158,7 +1166,7 @@ extern "C" void QCALLTYPE AssemblyNative_GetEntryAssembly(QCall::ObjectHandleOnS
END_QCALL;
}
-extern "C" void QCALLTYPE AssemblyNative_GetImageRuntimeVersion(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString)
+extern "C" void QCALLTYPE AssemblyNative_GetImageRuntimeVersion(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1181,7 +1189,7 @@ extern "C" void QCALLTYPE AssemblyNative_GetImageRuntimeVersion(QCall::AssemblyH
/*static*/
-extern "C" INT_PTR QCALLTYPE AssemblyNative_InitializeAssemblyLoadContext(INT_PTR ptrAssemblyLoadContext, BOOL fRepresentsTPALoadContext, BOOL fIsCollectible)
+extern "C" INT_PTR QCALLTYPE AssemblyNative_InitializeAssemblyLoadContext(INT_PTR ptrAssemblyLoadContext, BOOL fRepresentsTPALoadContext, BOOL fIsCollectible, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1253,7 +1261,7 @@ extern "C" INT_PTR QCALLTYPE AssemblyNative_InitializeAssemblyLoadContext(INT_PT
}
/*static*/
-extern "C" void QCALLTYPE AssemblyNative_PrepareForAssemblyLoadContextRelease(INT_PTR ptrNativeAssemblyBinder, INT_PTR ptrManagedStrongAssemblyLoadContext)
+extern "C" void QCALLTYPE AssemblyNative_PrepareForAssemblyLoadContextRelease(INT_PTR ptrNativeAssemblyBinder, INT_PTR ptrManagedStrongAssemblyLoadContext, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1261,7 +1269,6 @@ extern "C" void QCALLTYPE AssemblyNative_PrepareForAssemblyLoadContextRelease(IN
BEGIN_QCALL;
-
{
GCX_COOP();
reinterpret_cast(ptrNativeAssemblyBinder)->PrepareForLoadContextRelease(ptrManagedStrongAssemblyLoadContext);
@@ -1271,7 +1278,7 @@ extern "C" void QCALLTYPE AssemblyNative_PrepareForAssemblyLoadContextRelease(IN
}
/*static*/
-extern "C" INT_PTR QCALLTYPE AssemblyNative_GetLoadContextForAssembly(QCall::AssemblyHandle pAssembly)
+extern "C" INT_PTR QCALLTYPE AssemblyNative_GetLoadContextForAssembly(QCall::AssemblyHandle pAssembly, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1299,7 +1306,8 @@ extern "C" INT_PTR QCALLTYPE AssemblyNative_GetLoadContextForAssembly(QCall::Ass
extern "C" BOOL QCALLTYPE AssemblyNative_InternalTryGetRawMetadata(
QCall::AssemblyHandle assembly,
UINT8 **blobRef,
- INT32 *lengthRef)
+ INT32 *lengthRef,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1331,7 +1339,7 @@ FCIMPL0(FC_BOOL_RET, AssemblyNative::IsTracingEnabled)
FCIMPLEND
// static
-extern "C" void QCALLTYPE AssemblyNative_TraceResolvingHandlerInvoked(LPCWSTR assemblyName, LPCWSTR handlerName, LPCWSTR alcName, LPCWSTR resultAssemblyName, LPCWSTR resultAssemblyPath)
+extern "C" void QCALLTYPE AssemblyNative_TraceResolvingHandlerInvoked(LPCWSTR assemblyName, LPCWSTR handlerName, LPCWSTR alcName, LPCWSTR resultAssemblyName, LPCWSTR resultAssemblyPath, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1343,7 +1351,7 @@ extern "C" void QCALLTYPE AssemblyNative_TraceResolvingHandlerInvoked(LPCWSTR as
}
// static
-extern "C" void QCALLTYPE AssemblyNative_TraceAssemblyResolveHandlerInvoked(LPCWSTR assemblyName, LPCWSTR handlerName, LPCWSTR resultAssemblyName, LPCWSTR resultAssemblyPath)
+extern "C" void QCALLTYPE AssemblyNative_TraceAssemblyResolveHandlerInvoked(LPCWSTR assemblyName, LPCWSTR handlerName, LPCWSTR resultAssemblyName, LPCWSTR resultAssemblyPath, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1355,7 +1363,7 @@ extern "C" void QCALLTYPE AssemblyNative_TraceAssemblyResolveHandlerInvoked(LPCW
}
// static
-extern "C" void QCALLTYPE AssemblyNative_TraceAssemblyLoadFromResolveHandlerInvoked(LPCWSTR assemblyName, BOOL isTrackedAssembly, LPCWSTR requestingAssemblyPath, LPCWSTR requestedAssemblyPath)
+extern "C" void QCALLTYPE AssemblyNative_TraceAssemblyLoadFromResolveHandlerInvoked(LPCWSTR assemblyName, BOOL isTrackedAssembly, LPCWSTR requestingAssemblyPath, LPCWSTR requestedAssemblyPath, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1367,7 +1375,7 @@ extern "C" void QCALLTYPE AssemblyNative_TraceAssemblyLoadFromResolveHandlerInvo
}
// static
-extern "C" void QCALLTYPE AssemblyNative_TraceSatelliteSubdirectoryPathProbed(LPCWSTR filePath, HRESULT hr)
+extern "C" void QCALLTYPE AssemblyNative_TraceSatelliteSubdirectoryPathProbed(LPCWSTR filePath, HRESULT hr, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1386,7 +1394,8 @@ extern "C" void QCALLTYPE AssemblyNative_ApplyUpdate(
UINT8* ilDelta,
INT32 ilDeltaLength,
UINT8* pdbDelta,
- INT32 pdbDeltaLength)
+ INT32 pdbDeltaLength,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1424,7 +1433,7 @@ extern "C" void QCALLTYPE AssemblyNative_ApplyUpdate(
}
// static
-extern "C" BOOL QCALLTYPE AssemblyNative_IsApplyUpdateSupported()
+extern "C" BOOL QCALLTYPE AssemblyNative_IsApplyUpdateSupported(QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1704,7 +1713,8 @@ extern "C" void QCALLTYPE TypeMapLazyDictionary_ProcessAttributes(
BOOL (*newProxyTypeEntry)(CallbackContext* context, ProcessAttributesCallbackArg* arg),
BOOL (*newPrecachedExternalTypeMap)(CallbackContext* context),
BOOL (*newPrecachedProxyTypeMap)(CallbackContext* context),
- CallbackContext* context)
+ CallbackContext* context,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
_ASSERTE(pAssembly != NULL);
@@ -1831,7 +1841,8 @@ extern "C" void QCALLTYPE TypeMapLazyDictionary_ProcessAttributes(
extern "C" TADDR QCALLTYPE TypeMapLazyDictionary_FindPrecachedExternalTypeMapEntry(
QCall::ModuleHandle pModule,
QCall::TypeHandle pGroupType,
- LPCUTF8 key)
+ LPCUTF8 key,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
_ASSERTE(pModule != NULL);
@@ -1864,7 +1875,8 @@ extern "C" TADDR QCALLTYPE TypeMapLazyDictionary_FindPrecachedExternalTypeMapEnt
extern "C" TADDR QCALLTYPE TypeMapLazyDictionary_FindPrecachedProxyTypeMapEntry(
QCall::ModuleHandle pModule,
QCall::TypeHandle pGroupType,
- QCall::TypeHandle pType)
+ QCall::TypeHandle pType,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
_ASSERTE(pModule != NULL);
diff --git a/src/coreclr/vm/assemblynative.hpp b/src/coreclr/vm/assemblynative.hpp
index b035ccccc811bb..0ea20803c8a68b 100644
--- a/src/coreclr/vm/assemblynative.hpp
+++ b/src/coreclr/vm/assemblynative.hpp
@@ -37,111 +37,111 @@ class AssemblyNative
extern "C" uint32_t QCALLTYPE AssemblyNative_GetAssemblyCount();
-extern "C" void QCALLTYPE AssemblyNative_GetEntryAssembly(QCall::ObjectHandleOnStack retAssembly);
+extern "C" void QCALLTYPE AssemblyNative_GetEntryAssembly(QCall::ObjectHandleOnStack retAssembly, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_GetExecutingAssembly(QCall::StackCrawlMarkHandle stackMark, QCall::ObjectHandleOnStack retAssembly);
+extern "C" void QCALLTYPE AssemblyNative_GetExecutingAssembly(QCall::StackCrawlMarkHandle stackMark, QCall::ObjectHandleOnStack retAssembly, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_GetLocale(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString);
+extern "C" void QCALLTYPE AssemblyNative_GetLocale(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError);
-extern "C" INT32 QCALLTYPE AssemblyNative_GetHashAlgorithm(QCall::AssemblyHandle pAssembly);
+extern "C" INT32 QCALLTYPE AssemblyNative_GetHashAlgorithm(QCall::AssemblyHandle pAssembly, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_GetSimpleName(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retSimpleName);
+extern "C" void QCALLTYPE AssemblyNative_GetSimpleName(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retSimpleName, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_GetPublicKey(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retPublicKey);
+extern "C" void QCALLTYPE AssemblyNative_GetPublicKey(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retPublicKey, QCallExceptionStatus* qcallError);
-extern "C" INT32 QCALLTYPE AssemblyNative_GetFlags(QCall::AssemblyHandle pAssembly);
+extern "C" INT32 QCALLTYPE AssemblyNative_GetFlags(QCall::AssemblyHandle pAssembly, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_GetFullName(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString);
+extern "C" void QCALLTYPE AssemblyNative_GetFullName(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_GetLocation(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString);
+extern "C" void QCALLTYPE AssemblyNative_GetLocation(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError);
-extern "C" BOOL QCALLTYPE AssemblyNative_GetCodeBase(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString);
+extern "C" BOOL QCALLTYPE AssemblyNative_GetCodeBase(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError);
-extern "C" BYTE * QCALLTYPE AssemblyNative_GetResource(QCall::AssemblyHandle pAssembly, LPCWSTR wszName, DWORD * length);
+extern "C" BYTE * QCALLTYPE AssemblyNative_GetResource(QCall::AssemblyHandle pAssembly, LPCWSTR wszName, DWORD * length, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_GetVersion(QCall::AssemblyHandle pAssembly, INT32* pMajorVersion, INT32* pMinorVersion, INT32*pBuildNumber, INT32* pRevisionNumber);
+extern "C" void QCALLTYPE AssemblyNative_GetVersion(QCall::AssemblyHandle pAssembly, INT32* pMajorVersion, INT32* pMinorVersion, INT32*pBuildNumber, INT32* pRevisionNumber, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_GetTypeCore(QCall::AssemblyHandle pAssembly, LPCSTR szTypeName, LPCSTR* rgszNestedTypeNames, int32_t cNestedTypeNamesLength, QCall::ObjectHandleOnStack retType);
+extern "C" void QCALLTYPE AssemblyNative_GetTypeCore(QCall::AssemblyHandle pAssembly, LPCSTR szTypeName, LPCSTR* rgszNestedTypeNames, int32_t cNestedTypeNamesLength, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_GetTypeCoreIgnoreCase(QCall::AssemblyHandle pAssembly, LPCWSTR wszTypeName, LPCWSTR* rgwszNestedTypeNames, int32_t cNestedTypeNamesLength, QCall::ObjectHandleOnStack retType);
+extern "C" void QCALLTYPE AssemblyNative_GetTypeCoreIgnoreCase(QCall::AssemblyHandle pAssembly, LPCWSTR wszTypeName, LPCWSTR* rgwszNestedTypeNames, int32_t cNestedTypeNamesLength, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_GetForwardedType(QCall::AssemblyHandle pAssembly, mdToken mdtExternalType, QCall::ObjectHandleOnStack retType);
+extern "C" void QCALLTYPE AssemblyNative_GetForwardedType(QCall::AssemblyHandle pAssembly, mdToken mdtExternalType, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError);
-extern "C" INT32 QCALLTYPE AssemblyNative_GetManifestResourceInfo(QCall::AssemblyHandle pAssembly, LPCWSTR wszName, QCall::ObjectHandleOnStack retAssembly, QCall::StringHandleOnStack retFileName);
+extern "C" INT32 QCALLTYPE AssemblyNative_GetManifestResourceInfo(QCall::AssemblyHandle pAssembly, LPCWSTR wszName, QCall::ObjectHandleOnStack retAssembly, QCall::StringHandleOnStack retFileName, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_GetModules(QCall::AssemblyHandle pAssembly, BOOL fLoadIfNotFound, BOOL fGetResourceModules, QCall::ObjectHandleOnStack retModules);
+extern "C" void QCALLTYPE AssemblyNative_GetModules(QCall::AssemblyHandle pAssembly, BOOL fLoadIfNotFound, BOOL fGetResourceModules, QCall::ObjectHandleOnStack retModules, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_GetModule(QCall::AssemblyHandle pAssembly, LPCWSTR wszFileName, QCall::ObjectHandleOnStack retModule);
+extern "C" void QCALLTYPE AssemblyNative_GetModule(QCall::AssemblyHandle pAssembly, LPCWSTR wszFileName, QCall::ObjectHandleOnStack retModule, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_GetExportedTypes(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retTypes);
+extern "C" void QCALLTYPE AssemblyNative_GetExportedTypes(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retTypes, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_GetForwardedTypes(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retTypes);
+extern "C" void QCALLTYPE AssemblyNative_GetForwardedTypes(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retTypes, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_GetManifestResourceNames(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retResourceNames);
+extern "C" void QCALLTYPE AssemblyNative_GetManifestResourceNames(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retResourceNames, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_GetReferencedAssemblies(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retReferencedAssemblies);
+extern "C" void QCALLTYPE AssemblyNative_GetReferencedAssemblies(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retReferencedAssemblies, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_GetEntryPoint(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retMethod);
+extern "C" void QCALLTYPE AssemblyNative_GetEntryPoint(QCall::AssemblyHandle pAssembly, QCall::ObjectHandleOnStack retMethod, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_GetImageRuntimeVersion(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString);
+extern "C" void QCALLTYPE AssemblyNative_GetImageRuntimeVersion(QCall::AssemblyHandle pAssembly, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError);
-extern "C" INT_PTR QCALLTYPE AssemblyNative_InitializeAssemblyLoadContext(INT_PTR ptrAssemblyLoadContext, BOOL fRepresentsTPALoadContext, BOOL fIsCollectible);
+extern "C" INT_PTR QCALLTYPE AssemblyNative_InitializeAssemblyLoadContext(INT_PTR ptrAssemblyLoadContext, BOOL fRepresentsTPALoadContext, BOOL fIsCollectible, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_PrepareForAssemblyLoadContextRelease(INT_PTR ptrNativeAssemblyBinder, INT_PTR ptrManagedStrongAssemblyLoadContext);
+extern "C" void QCALLTYPE AssemblyNative_PrepareForAssemblyLoadContextRelease(INT_PTR ptrNativeAssemblyBinder, INT_PTR ptrManagedStrongAssemblyLoadContext, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_InternalLoad(NativeAssemblyNameParts* pAssemblyName, QCall::ObjectHandleOnStack requestingAssembly, QCall::StackCrawlMarkHandle stackMark,BOOL fThrowOnFileNotFound, QCall::ObjectHandleOnStack assemblyLoadContext, QCall::ObjectHandleOnStack retAssembly);
+extern "C" void QCALLTYPE AssemblyNative_InternalLoad(NativeAssemblyNameParts* pAssemblyName, QCall::ObjectHandleOnStack requestingAssembly, QCall::StackCrawlMarkHandle stackMark,BOOL fThrowOnFileNotFound, QCall::ObjectHandleOnStack assemblyLoadContext, QCall::ObjectHandleOnStack retAssembly, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_LoadFromPath(INT_PTR ptrNativeAssemblyBinder, LPCWSTR pwzILPath, QCall::ObjectHandleOnStack retLoadedAssembly);
+extern "C" void QCALLTYPE AssemblyNative_LoadFromPath(INT_PTR ptrNativeAssemblyBinder, LPCWSTR pwzILPath, QCall::ObjectHandleOnStack retLoadedAssembly, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_LoadFromStream(INT_PTR ptrNativeAssemblyBinder, INT_PTR ptrAssemblyArray, INT32 cbAssemblyArrayLength, INT_PTR ptrSymbolArray, INT32 cbSymbolArrayLength, QCall::ObjectHandleOnStack retLoadedAssembly);
+extern "C" void QCALLTYPE AssemblyNative_LoadFromStream(INT_PTR ptrNativeAssemblyBinder, INT_PTR ptrAssemblyArray, INT32 cbAssemblyArrayLength, INT_PTR ptrSymbolArray, INT32 cbSymbolArrayLength, QCall::ObjectHandleOnStack retLoadedAssembly, QCallExceptionStatus* qcallError);
#ifdef TARGET_WINDOWS
-extern "C" void QCALLTYPE AssemblyNative_LoadFromInMemoryModule(INT_PTR ptrNativeAssemblyBinder, INT_PTR hModule, QCall::ObjectHandleOnStack retLoadedAssembly);
+extern "C" void QCALLTYPE AssemblyNative_LoadFromInMemoryModule(INT_PTR ptrNativeAssemblyBinder, INT_PTR hModule, QCall::ObjectHandleOnStack retLoadedAssembly, QCallExceptionStatus* qcallError);
#endif
-extern "C" INT_PTR QCALLTYPE AssemblyNative_GetLoadContextForAssembly(QCall::AssemblyHandle pAssembly);
+extern "C" INT_PTR QCALLTYPE AssemblyNative_GetLoadContextForAssembly(QCall::AssemblyHandle pAssembly, QCallExceptionStatus* qcallError);
-extern "C" BOOL QCALLTYPE AssemblyNative_InternalTryGetRawMetadata(QCall::AssemblyHandle assembly, UINT8 **blobRef, INT32 *lengthRef);
+extern "C" BOOL QCALLTYPE AssemblyNative_InternalTryGetRawMetadata(QCall::AssemblyHandle assembly, UINT8 **blobRef, INT32 *lengthRef, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_TraceResolvingHandlerInvoked(LPCWSTR assemblyName, LPCWSTR handlerName, LPCWSTR alcName, LPCWSTR resultAssemblyName, LPCWSTR resultAssemblyPath);
+extern "C" void QCALLTYPE AssemblyNative_TraceResolvingHandlerInvoked(LPCWSTR assemblyName, LPCWSTR handlerName, LPCWSTR alcName, LPCWSTR resultAssemblyName, LPCWSTR resultAssemblyPath, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_TraceAssemblyResolveHandlerInvoked(LPCWSTR assemblyName, LPCWSTR handlerName, LPCWSTR resultAssemblyName, LPCWSTR resultAssemblyPath);
+extern "C" void QCALLTYPE AssemblyNative_TraceAssemblyResolveHandlerInvoked(LPCWSTR assemblyName, LPCWSTR handlerName, LPCWSTR resultAssemblyName, LPCWSTR resultAssemblyPath, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_TraceAssemblyLoadFromResolveHandlerInvoked(LPCWSTR assemblyName, BOOL isTrackedAssembly, LPCWSTR requestingAssemblyPath, LPCWSTR requestedAssemblyPath);
+extern "C" void QCALLTYPE AssemblyNative_TraceAssemblyLoadFromResolveHandlerInvoked(LPCWSTR assemblyName, BOOL isTrackedAssembly, LPCWSTR requestingAssemblyPath, LPCWSTR requestedAssemblyPath, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_TraceSatelliteSubdirectoryPathProbed(LPCWSTR filePath, HRESULT hr);
+extern "C" void QCALLTYPE AssemblyNative_TraceSatelliteSubdirectoryPathProbed(LPCWSTR filePath, HRESULT hr, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyNative_ApplyUpdate(QCall::AssemblyHandle assembly, UINT8* metadataDelta, INT32 metadataDeltaLength, UINT8* ilDelta, INT32 ilDeltaLength, UINT8* pdbDelta, INT32 pdbDeltaLength);
+extern "C" void QCALLTYPE AssemblyNative_ApplyUpdate(QCall::AssemblyHandle assembly, UINT8* metadataDelta, INT32 metadataDeltaLength, UINT8* ilDelta, INT32 ilDeltaLength, UINT8* pdbDelta, INT32 pdbDeltaLength, QCallExceptionStatus* qcallError);
-extern "C" BOOL QCALLTYPE AssemblyNative_IsApplyUpdateSupported();
+extern "C" BOOL QCALLTYPE AssemblyNative_IsApplyUpdateSupported(QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE AssemblyName_InitializeAssemblySpec(NativeAssemblyNameParts* pAssemblyNameParts, BaseAssemblySpec* pAssemblySpec);
+extern "C" void QCALLTYPE AssemblyName_InitializeAssemblySpec(NativeAssemblyNameParts* pAssemblyNameParts, BaseAssemblySpec* pAssemblySpec, QCallExceptionStatus* qcallError);
// See TypeMapLazyDictionary.cs for managed version.
struct CallbackContext final
@@ -169,18 +169,18 @@ extern "C" void QCALLTYPE TypeMapLazyDictionary_ProcessAttributes(
BOOL (*newProxyTypeEntry)(CallbackContext* context, ProcessAttributesCallbackArg* arg),
BOOL (*newPrecachedExternalTypeMap)(CallbackContext* context),
BOOL (*newPrecachedProxyTypeMap)(CallbackContext* context),
- CallbackContext* context);
+ CallbackContext* context, QCallExceptionStatus* qcallError);
extern "C" TADDR QCALLTYPE TypeMapLazyDictionary_FindPrecachedExternalTypeMapEntry(
QCall::ModuleHandle pModule,
QCall::TypeHandle pGroupType,
LPCUTF8 key
-);
+, QCallExceptionStatus* qcallError);
extern "C" TADDR QCALLTYPE TypeMapLazyDictionary_FindPrecachedProxyTypeMapEntry(
QCall::ModuleHandle pModule,
QCall::TypeHandle pGroupType,
QCall::TypeHandle pType
-);
+, QCallExceptionStatus* qcallError);
#endif
diff --git a/src/coreclr/vm/clrconfignative.cpp b/src/coreclr/vm/clrconfignative.cpp
index 7868f80014236c..dc15ba957a611f 100644
--- a/src/coreclr/vm/clrconfignative.cpp
+++ b/src/coreclr/vm/clrconfignative.cpp
@@ -8,12 +8,13 @@
#include "clrconfignative.h"
#include
-extern "C" BOOL QCALLTYPE ClrConfig_GetConfigBoolValue(LPCWSTR name, BOOL *exist)
+extern "C" BOOL QCALLTYPE ClrConfig_GetConfigBoolValue(LPCWSTR name, BOOL *exist, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
- BOOL retValue = FALSE;
*exist = FALSE;
+ BOOL retValue = FALSE;
+
BEGIN_QCALL;
if (Configuration::GetKnobStringValue(name) != nullptr)
diff --git a/src/coreclr/vm/clrconfignative.h b/src/coreclr/vm/clrconfignative.h
index c2c0009442e2ed..d363a2745e9e3c 100644
--- a/src/coreclr/vm/clrconfignative.h
+++ b/src/coreclr/vm/clrconfignative.h
@@ -4,5 +4,5 @@
#ifndef _CLRCONFIGNATIVE_H_
#define _CLRCONFIGNATIVE_H_
-extern "C" BOOL QCALLTYPE ClrConfig_GetConfigBoolValue(LPCWSTR name, BOOL *exist);
+extern "C" BOOL QCALLTYPE ClrConfig_GetConfigBoolValue(LPCWSTR name, BOOL *exist, QCallExceptionStatus* qcallError);
#endif // _CLRCONFIGNATIVE_H_
diff --git a/src/coreclr/vm/comdelegate.cpp b/src/coreclr/vm/comdelegate.cpp
index ff26300824f1ec..00e41198d7ad95 100644
--- a/src/coreclr/vm/comdelegate.cpp
+++ b/src/coreclr/vm/comdelegate.cpp
@@ -938,7 +938,8 @@ static PCODE GetVirtualCallStub(MethodDesc *method, TypeHandle scopeType)
}
extern "C" BOOL QCALLTYPE Delegate_BindToMethodName(MethodTable* pDelegateMT, MethodTable *pTargetMT,
- QCall::TypeHandle pMethodType, LPCUTF8 pszMethodName, DelegateBindingFlags flags, QCall::ObjectHandleOnStack targetParameter, BindToMethodDetails *pBindToMethodDetails)
+ QCall::TypeHandle pMethodType, LPCUTF8 pszMethodName, DelegateBindingFlags flags, QCall::ObjectHandleOnStack targetParameter, BindToMethodDetails *pBindToMethodDetails,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -946,7 +947,6 @@ extern "C" BOOL QCALLTYPE Delegate_BindToMethodName(MethodTable* pDelegateMT, Me
BEGIN_QCALL;
-
TypeHandle methodType = pMethodType.AsTypeHandle();
// get the invoke of the delegate
@@ -1043,7 +1043,8 @@ extern "C" BOOL QCALLTYPE Delegate_BindToMethodName(MethodTable* pDelegateMT, Me
}
extern "C" BOOL QCALLTYPE Delegate_BindToMethodInfo(MethodTable* pDelegateMT, MethodTable *pTargetMT,
- MethodDesc * method, QCall::TypeHandle pMethodType, DelegateBindingFlags flags, QCall::ObjectHandleOnStack targetParameter, BindToMethodDetails *pBindToMethodDetails)
+ MethodDesc * method, QCall::TypeHandle pMethodType, DelegateBindingFlags flags, QCall::ObjectHandleOnStack targetParameter, BindToMethodDetails *pBindToMethodDetails,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1492,7 +1493,7 @@ MethodDesc* COMDelegate::GetILStubMethodDesc(EEImplMethodDesc* pDelegateMD, DWOR
return PInvoke::CreateCLRToNativeILStub(&sigInfo, dwStubFlags, pDelegateMD);
}
-extern "C" void QCALLTYPE Delegate_InitializeVirtualCallStub(QCall::ObjectHandleOnStack d, PCODE method)
+extern "C" void QCALLTYPE Delegate_InitializeVirtualCallStub(QCall::ObjectHandleOnStack d, PCODE method, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1512,7 +1513,7 @@ extern "C" void QCALLTYPE Delegate_InitializeVirtualCallStub(QCall::ObjectHandle
END_QCALL;
}
-extern "C" PCODE QCALLTYPE Delegate_AdjustTarget(MethodTable* pMTTarg, PCODE method)
+extern "C" PCODE QCALLTYPE Delegate_AdjustTarget(MethodTable* pMTTarg, PCODE method, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1570,7 +1571,7 @@ uint32_t MethodDescToNumFixedArgs(MethodDesc *pMD)
// This is the single constructor for all Delegates. The compiler
// doesn't provide an implementation of the Delegate constructor. We
// provide that implementation through a QCall call to this method.
-extern "C" void QCALLTYPE Delegate_Construct(MethodTable* pDelegateMT, MethodTable* pTargetMT, PCODE method, BindToMethodDetails *pBindToMethodDetails)
+extern "C" void QCALLTYPE Delegate_Construct(MethodTable* pDelegateMT, MethodTable* pTargetMT, PCODE method, BindToMethodDetails *pBindToMethodDetails, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1873,7 +1874,7 @@ void COMDelegate::ThrowIfInvalidUnmanagedCallersOnlyUsage(MethodDesc* pMD)
}
// This method will get the MethodInfo for a delegate
-extern "C" void QCALLTYPE Delegate_CreateMethodInfo(MethodDesc* methodDesc, QCall::ObjectHandleOnStack retMethodInfo)
+extern "C" void QCALLTYPE Delegate_CreateMethodInfo(MethodDesc* methodDesc, QCall::ObjectHandleOnStack retMethodInfo, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1888,7 +1889,7 @@ extern "C" void QCALLTYPE Delegate_CreateMethodInfo(MethodDesc* methodDesc, QCal
END_QCALL;
}
-extern "C" MethodDesc* QCALLTYPE Delegate_GetMethodDesc(QCall::ObjectHandleOnStack instance)
+extern "C" MethodDesc* QCALLTYPE Delegate_GetMethodDesc(QCall::ObjectHandleOnStack instance, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1926,7 +1927,7 @@ FCIMPL1(PCODE, COMDelegate::GetMulticastInvoke, MethodTable* pDelegateMT)
}
FCIMPLEND
-extern "C" PCODE QCALLTYPE Delegate_GetMulticastInvokeSlow(MethodTable* pDelegateMT)
+extern "C" PCODE QCALLTYPE Delegate_GetMulticastInvokeSlow(MethodTable* pDelegateMT, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
_ASSERTE(pDelegateMT != NULL);
diff --git a/src/coreclr/vm/comdelegate.h b/src/coreclr/vm/comdelegate.h
index a506fcb13cad2d..b3b7e8120fc64b 100644
--- a/src/coreclr/vm/comdelegate.h
+++ b/src/coreclr/vm/comdelegate.h
@@ -92,13 +92,13 @@ class COMDelegate
BindToMethodDetails *pBindToMethodDetails);
};
-extern "C" void QCALLTYPE Delegate_Construct(MethodTable* pDelegateMT, MethodTable* pTargetMT, PCODE method, BindToMethodDetails *pBindToMethodDetails);
+extern "C" void QCALLTYPE Delegate_Construct(MethodTable* pDelegateMT, MethodTable* pTargetMT, PCODE method, BindToMethodDetails *pBindToMethodDetails, QCallExceptionStatus* qcallError);
-extern "C" PCODE QCALLTYPE Delegate_GetMulticastInvokeSlow(MethodTable* pDelegateMT);
+extern "C" PCODE QCALLTYPE Delegate_GetMulticastInvokeSlow(MethodTable* pDelegateMT, QCallExceptionStatus* qcallError);
-extern "C" PCODE QCALLTYPE Delegate_AdjustTarget(MethodTable* pMTTarg, PCODE method);
+extern "C" PCODE QCALLTYPE Delegate_AdjustTarget(MethodTable* pMTTarg, PCODE method, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE Delegate_InitializeVirtualCallStub(QCall::ObjectHandleOnStack d, PCODE method);
+extern "C" void QCALLTYPE Delegate_InitializeVirtualCallStub(QCall::ObjectHandleOnStack d, PCODE method, QCallExceptionStatus* qcallError);
// These flags effect the way BindToMethodInfo and BindToMethodName are allowed to bind a delegate to a target method. Their
// values must be kept in sync with the definition in bcl\system\delegate.cs.
@@ -114,14 +114,16 @@ enum DelegateBindingFlags
};
extern "C" BOOL QCALLTYPE Delegate_BindToMethodName(MethodTable* pDelegateMT, MethodTable *pTargetMT,
- QCall::TypeHandle pMethodType, LPCUTF8 pszMethodName, DelegateBindingFlags flags, QCall::ObjectHandleOnStack targetParameter, BindToMethodDetails *pBindToMethodDetails);
+ QCall::TypeHandle pMethodType, LPCUTF8 pszMethodName, DelegateBindingFlags flags, QCall::ObjectHandleOnStack targetParameter, BindToMethodDetails *pBindToMethodDetails,
+ QCallExceptionStatus* qcallError);
extern "C" BOOL QCALLTYPE Delegate_BindToMethodInfo(MethodTable* pDelegateMT, MethodTable *pTargetMT,
- MethodDesc * method, QCall::TypeHandle pMethodType, DelegateBindingFlags flags, QCall::ObjectHandleOnStack targetParameter, BindToMethodDetails *pBindToMethodDetails);
+ MethodDesc * method, QCall::TypeHandle pMethodType, DelegateBindingFlags flags, QCall::ObjectHandleOnStack targetParameter, BindToMethodDetails *pBindToMethodDetails,
+ QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE Delegate_CreateMethodInfo(MethodDesc* methodDesc, QCall::ObjectHandleOnStack retMethodInfo);
+extern "C" void QCALLTYPE Delegate_CreateMethodInfo(MethodDesc* methodDesc, QCall::ObjectHandleOnStack retMethodInfo, QCallExceptionStatus* qcallError);
-extern "C" MethodDesc* QCALLTYPE Delegate_GetMethodDesc(QCall::ObjectHandleOnStack instance);
+extern "C" MethodDesc* QCALLTYPE Delegate_GetMethodDesc(QCall::ObjectHandleOnStack instance, QCallExceptionStatus* qcallError);
void DistributeEvent(OBJECTREF *pDelegate,
OBJECTREF *pDomain);
diff --git a/src/coreclr/vm/comdependenthandle.cpp b/src/coreclr/vm/comdependenthandle.cpp
index a76d62316c6880..c2b18b039910b4 100644
--- a/src/coreclr/vm/comdependenthandle.cpp
+++ b/src/coreclr/vm/comdependenthandle.cpp
@@ -26,7 +26,7 @@ FCIMPL2(OBJECTHANDLE, DependentHandle::InternalAlloc, Object *target, Object *de
}
FCIMPLEND
-extern "C" OBJECTHANDLE QCALLTYPE DependentHandle_InternalAllocWithGCTransition(QCall::ObjectHandleOnStack target, QCall::ObjectHandleOnStack dependent)
+extern "C" OBJECTHANDLE QCALLTYPE DependentHandle_InternalAllocWithGCTransition(QCall::ObjectHandleOnStack target, QCall::ObjectHandleOnStack dependent, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -122,7 +122,7 @@ FCIMPL1(FC_BOOL_RET, DependentHandle::InternalFree, OBJECTHANDLE handle)
}
FCIMPLEND
-extern "C" void QCALLTYPE DependentHandle_InternalFreeWithGCTransition(OBJECTHANDLE handle)
+extern "C" void QCALLTYPE DependentHandle_InternalFreeWithGCTransition(OBJECTHANDLE handle, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
diff --git a/src/coreclr/vm/comdependenthandle.h b/src/coreclr/vm/comdependenthandle.h
index 32cc5bef53f9fc..ec47f3368d4167 100644
--- a/src/coreclr/vm/comdependenthandle.h
+++ b/src/coreclr/vm/comdependenthandle.h
@@ -49,7 +49,7 @@ class DependentHandle
FCDECL1(static FC_BOOL_RET, InternalFree, OBJECTHANDLE handle);
};
-extern "C" OBJECTHANDLE QCALLTYPE DependentHandle_InternalAllocWithGCTransition(QCall::ObjectHandleOnStack target, QCall::ObjectHandleOnStack dependent);
-extern "C" void QCALLTYPE DependentHandle_InternalFreeWithGCTransition(OBJECTHANDLE handle);
+extern "C" OBJECTHANDLE QCALLTYPE DependentHandle_InternalAllocWithGCTransition(QCall::ObjectHandleOnStack target, QCall::ObjectHandleOnStack dependent, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE DependentHandle_InternalFreeWithGCTransition(OBJECTHANDLE handle, QCallExceptionStatus* qcallError);
#endif
diff --git a/src/coreclr/vm/comdynamic.cpp b/src/coreclr/vm/comdynamic.cpp
index 65f780230a82ca..a951046046d49c 100644
--- a/src/coreclr/vm/comdynamic.cpp
+++ b/src/coreclr/vm/comdynamic.cpp
@@ -42,7 +42,8 @@ extern "C" INT32 QCALLTYPE TypeBuilder_DefineGenericParam(QCall::ModuleHandle pM
INT32 tkParent,
INT32 attributes,
INT32 position,
- INT32 * pConstraintTokens)
+ INT32 * pConstraintTokens,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -66,7 +67,8 @@ extern "C" INT32 QCALLTYPE TypeBuilder_DefineType(QCall::ModuleHandle pModule,
INT32 tkParent,
INT32 attributes,
INT32 tkEnclosingType,
- INT32 * pInterfaceTokens)
+ INT32 * pInterfaceTokens,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -92,8 +94,6 @@ INT32 COMDynamicWrite::DefineType(Module* pModule,
mdTypeDef classE = mdTokenNil;
- BEGIN_QCALL;
-
RefClassWriter * pRCW = pModule->GetReflectionModule()->GetClassWriter();
_ASSERTE(pRCW);
@@ -135,13 +135,11 @@ INT32 COMDynamicWrite::DefineType(Module* pModule,
&amTracker);
amTracker.SuppressRelease();
- END_QCALL;
-
return (INT32)classE;
}
// This function will reset the parent class in metadata
-extern "C" void QCALLTYPE TypeBuilder_SetParentType(QCall::ModuleHandle pModule, INT32 tdType, INT32 tkParent)
+extern "C" void QCALLTYPE TypeBuilder_SetParentType(QCall::ModuleHandle pModule, INT32 tdType, INT32 tkParent, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -156,7 +154,7 @@ extern "C" void QCALLTYPE TypeBuilder_SetParentType(QCall::ModuleHandle pModule,
}
// This function will add another interface impl
-extern "C" void QCALLTYPE TypeBuilder_AddInterfaceImpl(QCall::ModuleHandle pModule, INT32 tdType, INT32 tkInterface)
+extern "C" void QCALLTYPE TypeBuilder_AddInterfaceImpl(QCall::ModuleHandle pModule, INT32 tdType, INT32 tkInterface, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -171,7 +169,7 @@ extern "C" void QCALLTYPE TypeBuilder_AddInterfaceImpl(QCall::ModuleHandle pModu
}
// This function will create a method within the class
-extern "C" INT32 QCALLTYPE TypeBuilder_DefineMethodSpec(QCall::ModuleHandle pModule, INT32 tkParent, LPCBYTE pSignature, INT32 sigLength)
+extern "C" INT32 QCALLTYPE TypeBuilder_DefineMethodSpec(QCall::ModuleHandle pModule, INT32 tkParent, LPCBYTE pSignature, INT32 sigLength, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -193,7 +191,7 @@ extern "C" INT32 QCALLTYPE TypeBuilder_DefineMethodSpec(QCall::ModuleHandle pMod
return (INT32) memberE;
}
-extern "C" INT32 QCALLTYPE TypeBuilder_DefineMethod(QCall::ModuleHandle pModule, INT32 tkParent, LPCWSTR wszName, LPCBYTE pSignature, INT32 sigLength, INT32 attributes)
+extern "C" INT32 QCALLTYPE TypeBuilder_DefineMethod(QCall::ModuleHandle pModule, INT32 tkParent, LPCWSTR wszName, LPCBYTE pSignature, INT32 sigLength, INT32 attributes, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -225,7 +223,7 @@ extern "C" INT32 QCALLTYPE TypeBuilder_DefineMethod(QCall::ModuleHandle pModule,
**Arguments:
**Exceptions:
==============================================================================*/
-extern "C" mdFieldDef QCALLTYPE TypeBuilder_DefineField(QCall::ModuleHandle pModule, INT32 tkParent, LPCWSTR wszName, LPCBYTE pSignature, INT32 sigLength, INT32 attr)
+extern "C" mdFieldDef QCALLTYPE TypeBuilder_DefineField(QCall::ModuleHandle pModule, INT32 tkParent, LPCWSTR wszName, LPCBYTE pSignature, INT32 sigLength, INT32 attr, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -310,7 +308,8 @@ extern "C" void QCALLTYPE TypeBuilder_SetMethodIL(QCall::ModuleHandle pModule,
ExceptionInstance * pExceptions,
INT32 numExceptions,
INT32 * pTokenFixups,
- INT32 numTokenFixups)
+ INT32 numTokenFixups,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -469,7 +468,7 @@ extern "C" void QCALLTYPE TypeBuilder_SetMethodIL(QCall::ModuleHandle pModule,
END_QCALL;
}
-extern "C" void QCALLTYPE TypeBuilder_TermCreateClass(QCall::ModuleHandle pModule, INT32 tk, QCall::ObjectHandleOnStack retType)
+extern "C" void QCALLTYPE TypeBuilder_TermCreateClass(QCall::ModuleHandle pModule, INT32 tk, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -511,7 +510,7 @@ void COMDynamicWrite::TermCreateClass(Module* pModule, INT32 tk, QCall::ObjectHa
**Arguments:
**Exceptions:
==============================================================================*/
-extern "C" void QCALLTYPE TypeBuilder_SetPInvokeData(QCall::ModuleHandle pModule, LPCWSTR wszDllName, LPCWSTR wszFunctionName, INT32 token, INT32 linkFlags)
+extern "C" void QCALLTYPE TypeBuilder_SetPInvokeData(QCall::ModuleHandle pModule, LPCWSTR wszDllName, LPCWSTR wszFunctionName, INT32 token, INT32 linkFlags, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -540,7 +539,7 @@ extern "C" void QCALLTYPE TypeBuilder_SetPInvokeData(QCall::ModuleHandle pModule
**Arguments:
**Exceptions:
==============================================================================*/
-extern "C" INT32 QCALLTYPE TypeBuilder_DefineProperty(QCall::ModuleHandle pModule, INT32 tkParent, LPCWSTR wszName, INT32 attr, LPCBYTE pSignature, INT32 sigLength)
+extern "C" INT32 QCALLTYPE TypeBuilder_DefineProperty(QCall::ModuleHandle pModule, INT32 tkParent, LPCWSTR wszName, INT32 attr, LPCBYTE pSignature, INT32 sigLength, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -577,7 +576,7 @@ extern "C" INT32 QCALLTYPE TypeBuilder_DefineProperty(QCall::ModuleHandle pModul
**Arguments:
**Exceptions:
==============================================================================*/
-extern "C" INT32 QCALLTYPE TypeBuilder_DefineEvent(QCall::ModuleHandle pModule, INT32 tkParent, LPCWSTR wszName, INT32 attr, INT32 tkEventType)
+extern "C" INT32 QCALLTYPE TypeBuilder_DefineEvent(QCall::ModuleHandle pModule, INT32 tkParent, LPCWSTR wszName, INT32 attr, INT32 tkEventType, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -607,7 +606,7 @@ extern "C" INT32 QCALLTYPE TypeBuilder_DefineEvent(QCall::ModuleHandle pModule,
**Arguments:
**Exceptions:
==============================================================================*/
-extern "C" void QCALLTYPE TypeBuilder_DefineMethodSemantics(QCall::ModuleHandle pModule, INT32 tkAssociation, INT32 attr, INT32 tkMethod)
+extern "C" void QCALLTYPE TypeBuilder_DefineMethodSemantics(QCall::ModuleHandle pModule, INT32 tkAssociation, INT32 attr, INT32 tkMethod, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -628,7 +627,7 @@ extern "C" void QCALLTYPE TypeBuilder_DefineMethodSemantics(QCall::ModuleHandle
/*============================SetMethodImpl============================
** To set a Method's Implementation flags
==============================================================================*/
-extern "C" void QCALLTYPE TypeBuilder_SetMethodImpl(QCall::ModuleHandle pModule, INT32 tkMethod, INT32 attr)
+extern "C" void QCALLTYPE TypeBuilder_SetMethodImpl(QCall::ModuleHandle pModule, INT32 tkMethod, INT32 attr, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -648,7 +647,7 @@ extern "C" void QCALLTYPE TypeBuilder_SetMethodImpl(QCall::ModuleHandle pModule,
/*============================DefineMethodImpl============================
** Define a MethodImpl record
==============================================================================*/
-extern "C" void QCALLTYPE TypeBuilder_DefineMethodImpl(QCall::ModuleHandle pModule, UINT32 tkType, UINT32 tkBody, UINT32 tkDecl)
+extern "C" void QCALLTYPE TypeBuilder_DefineMethodImpl(QCall::ModuleHandle pModule, UINT32 tkType, UINT32 tkBody, UINT32 tkDecl, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -672,7 +671,7 @@ extern "C" void QCALLTYPE TypeBuilder_DefineMethodImpl(QCall::ModuleHandle pModu
**Arguments:
**Exceptions:
==============================================================================*/
-extern "C" INT32 QCALLTYPE TypeBuilder_GetTokenFromSig(QCall::ModuleHandle pModule, LPCBYTE pSignature, INT32 sigLength)
+extern "C" INT32 QCALLTYPE TypeBuilder_GetTokenFromSig(QCall::ModuleHandle pModule, LPCBYTE pSignature, INT32 sigLength, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -702,7 +701,7 @@ extern "C" INT32 QCALLTYPE TypeBuilder_GetTokenFromSig(QCall::ModuleHandle pModu
**Arguments:
**Exceptions:
==============================================================================*/
-extern "C" INT32 QCALLTYPE TypeBuilder_SetParamInfo(QCall::ModuleHandle pModule, UINT32 tkMethod, UINT32 iSequence, UINT32 iAttributes, LPCWSTR wszParamName)
+extern "C" INT32 QCALLTYPE TypeBuilder_SetParamInfo(QCall::ModuleHandle pModule, UINT32 tkMethod, UINT32 iSequence, UINT32 iAttributes, LPCWSTR wszParamName, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -736,7 +735,7 @@ extern "C" INT32 QCALLTYPE TypeBuilder_SetParamInfo(QCall::ModuleHandle pModule,
**Arguments:
**Exceptions:
==============================================================================*/
-extern "C" void QCALLTYPE TypeBuilder_SetConstantValue(QCall::ModuleHandle pModule, UINT32 tk, DWORD valueCorType, LPVOID pValue)
+extern "C" void QCALLTYPE TypeBuilder_SetConstantValue(QCall::ModuleHandle pModule, UINT32 tk, DWORD valueCorType, LPVOID pValue, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -792,7 +791,7 @@ extern "C" void QCALLTYPE TypeBuilder_SetConstantValue(QCall::ModuleHandle pModu
**Arguments:
**Exceptions:
==============================================================================*/
-extern "C" void QCALLTYPE TypeBuilder_SetFieldLayoutOffset(QCall::ModuleHandle pModule, INT32 tkField, INT32 iOffset)
+extern "C" void QCALLTYPE TypeBuilder_SetFieldLayoutOffset(QCall::ModuleHandle pModule, INT32 tkField, INT32 iOffset, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -816,7 +815,7 @@ extern "C" void QCALLTYPE TypeBuilder_SetFieldLayoutOffset(QCall::ModuleHandle p
**Arguments:
**Exceptions:
==============================================================================*/
-extern "C" void QCALLTYPE TypeBuilder_SetClassLayout(QCall::ModuleHandle pModule, INT32 tk, INT32 iPackSize, UINT32 iTotalSize)
+extern "C" void QCALLTYPE TypeBuilder_SetClassLayout(QCall::ModuleHandle pModule, INT32 tk, INT32 iPackSize, UINT32 iTotalSize, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -911,7 +910,7 @@ void UpdateRuntimeStateForAssemblyCustomAttribute(Module* pModule, mdToken tkCus
}
}
-extern "C" void QCALLTYPE TypeBuilder_DefineCustomAttribute(QCall::ModuleHandle pModule, INT32 token, INT32 conTok, LPCBYTE pBlob, INT32 cbBlob)
+extern "C" void QCALLTYPE TypeBuilder_DefineCustomAttribute(QCall::ModuleHandle pModule, INT32 token, INT32 conTok, LPCBYTE pBlob, INT32 cbBlob, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
diff --git a/src/coreclr/vm/comdynamic.h b/src/coreclr/vm/comdynamic.h
index d279aef52faf1b..f94c4df55c7ee9 100644
--- a/src/coreclr/vm/comdynamic.h
+++ b/src/coreclr/vm/comdynamic.h
@@ -43,7 +43,8 @@ extern "C" INT32 QCALLTYPE TypeBuilder_DefineType(QCall::ModuleHandle pModule,
INT32 tkParent,
INT32 attributes,
INT32 tkEnclosingType,
- INT32 * pInterfaceTokens);
+ INT32 * pInterfaceTokens,
+ QCallExceptionStatus* qcallError);
extern "C" INT32 QCALLTYPE TypeBuilder_DefineGenericParam(QCall::ModuleHandle pModule,
@@ -51,22 +52,23 @@ extern "C" INT32 QCALLTYPE TypeBuilder_DefineGenericParam(QCall::ModuleHandle pM
INT32 tkParent,
INT32 attributes,
INT32 position,
- INT32 * pConstraintTokens);
+ INT32 * pConstraintTokens,
+ QCallExceptionStatus* qcallError);
// This function will reset the parent class in metadata
-extern "C" void QCALLTYPE TypeBuilder_SetParentType(QCall::ModuleHandle pModule, INT32 tdType, INT32 tkParent);
+extern "C" void QCALLTYPE TypeBuilder_SetParentType(QCall::ModuleHandle pModule, INT32 tdType, INT32 tkParent, QCallExceptionStatus* qcallError);
// This function will add another interface impl
-extern "C" void QCALLTYPE TypeBuilder_AddInterfaceImpl(QCall::ModuleHandle pModule, INT32 tdType, INT32 tkInterface);
+extern "C" void QCALLTYPE TypeBuilder_AddInterfaceImpl(QCall::ModuleHandle pModule, INT32 tdType, INT32 tkInterface, QCallExceptionStatus* qcallError);
// This function will create a method within the class
-extern "C" INT32 QCALLTYPE TypeBuilder_DefineMethod(QCall::ModuleHandle pModule, INT32 tkParent, LPCWSTR wszName, LPCBYTE pSignature, INT32 sigLength, INT32 attributes);
+extern "C" INT32 QCALLTYPE TypeBuilder_DefineMethod(QCall::ModuleHandle pModule, INT32 tkParent, LPCWSTR wszName, LPCBYTE pSignature, INT32 sigLength, INT32 attributes, QCallExceptionStatus* qcallError);
-extern "C" INT32 QCALLTYPE TypeBuilder_DefineMethodSpec(QCall::ModuleHandle pModule, INT32 tkParent, LPCBYTE pSignature, INT32 sigLength);
+extern "C" INT32 QCALLTYPE TypeBuilder_DefineMethodSpec(QCall::ModuleHandle pModule, INT32 tkParent, LPCBYTE pSignature, INT32 sigLength, QCallExceptionStatus* qcallError);
// This function will create a method within the class
@@ -81,57 +83,58 @@ extern "C" void QCALLTYPE TypeBuilder_SetMethodIL(QCall::ModuleHandle pModule,
ExceptionInstance * pExceptions,
INT32 numExceptions,
INT32 * pTokenFixups,
- INT32 numTokenFixups);
+ INT32 numTokenFixups,
+ QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE TypeBuilder_TermCreateClass(QCall::ModuleHandle pModule, INT32 tk, QCall::ObjectHandleOnStack retType);
+extern "C" void QCALLTYPE TypeBuilder_TermCreateClass(QCall::ModuleHandle pModule, INT32 tk, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError);
-extern "C" mdFieldDef QCALLTYPE TypeBuilder_DefineField(QCall::ModuleHandle pModule, INT32 tkParent, LPCWSTR wszName, LPCBYTE pSignature, INT32 sigLength, INT32 attr);
+extern "C" mdFieldDef QCALLTYPE TypeBuilder_DefineField(QCall::ModuleHandle pModule, INT32 tkParent, LPCWSTR wszName, LPCBYTE pSignature, INT32 sigLength, INT32 attr, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE TypeBuilder_SetPInvokeData(QCall::ModuleHandle pModule, LPCWSTR wszDllName, LPCWSTR wszFunctionName, INT32 token, INT32 linkFlags);
+extern "C" void QCALLTYPE TypeBuilder_SetPInvokeData(QCall::ModuleHandle pModule, LPCWSTR wszDllName, LPCWSTR wszFunctionName, INT32 token, INT32 linkFlags, QCallExceptionStatus* qcallError);
-extern "C" INT32 QCALLTYPE TypeBuilder_DefineProperty(QCall::ModuleHandle pModule, INT32 tkParent, LPCWSTR wszName, INT32 attr, LPCBYTE pSignature, INT32 sigLength);
+extern "C" INT32 QCALLTYPE TypeBuilder_DefineProperty(QCall::ModuleHandle pModule, INT32 tkParent, LPCWSTR wszName, INT32 attr, LPCBYTE pSignature, INT32 sigLength, QCallExceptionStatus* qcallError);
-extern "C" INT32 QCALLTYPE TypeBuilder_DefineEvent(QCall::ModuleHandle pModule, INT32 tkParent, LPCWSTR wszName, INT32 attr, INT32 tkEventType);
+extern "C" INT32 QCALLTYPE TypeBuilder_DefineEvent(QCall::ModuleHandle pModule, INT32 tkParent, LPCWSTR wszName, INT32 attr, INT32 tkEventType, QCallExceptionStatus* qcallError);
// functions to set Setter, Getter, Reset, TestDefault, and other methods
-extern "C" void QCALLTYPE TypeBuilder_DefineMethodSemantics(QCall::ModuleHandle pModule, INT32 tkAssociation, INT32 attr, INT32 tkMethod);
+extern "C" void QCALLTYPE TypeBuilder_DefineMethodSemantics(QCall::ModuleHandle pModule, INT32 tkAssociation, INT32 attr, INT32 tkMethod, QCallExceptionStatus* qcallError);
// functions to set method's implementation flag
-extern "C" void QCALLTYPE TypeBuilder_SetMethodImpl(QCall::ModuleHandle pModule, INT32 tkMethod, INT32 attr);
+extern "C" void QCALLTYPE TypeBuilder_SetMethodImpl(QCall::ModuleHandle pModule, INT32 tkMethod, INT32 attr, QCallExceptionStatus* qcallError);
// functions to create MethodImpl record
-extern "C" void QCALLTYPE TypeBuilder_DefineMethodImpl(QCall::ModuleHandle pModule, UINT32 tkType, UINT32 tkBody, UINT32 tkDecl);
+extern "C" void QCALLTYPE TypeBuilder_DefineMethodImpl(QCall::ModuleHandle pModule, UINT32 tkType, UINT32 tkBody, UINT32 tkDecl, QCallExceptionStatus* qcallError);
// GetTokenFromSig's argument
-extern "C" INT32 QCALLTYPE TypeBuilder_GetTokenFromSig(QCall::ModuleHandle pModule, LPCBYTE pSignature, INT32 sigLength);
+extern "C" INT32 QCALLTYPE TypeBuilder_GetTokenFromSig(QCall::ModuleHandle pModule, LPCBYTE pSignature, INT32 sigLength, QCallExceptionStatus* qcallError);
// Set Field offset
-extern "C" void QCALLTYPE TypeBuilder_SetFieldLayoutOffset(QCall::ModuleHandle pModule, INT32 tkField, INT32 iOffset);
+extern "C" void QCALLTYPE TypeBuilder_SetFieldLayoutOffset(QCall::ModuleHandle pModule, INT32 tkField, INT32 iOffset, QCallExceptionStatus* qcallError);
// Set classlayout info
-extern "C" void QCALLTYPE TypeBuilder_SetClassLayout(QCall::ModuleHandle pModule, INT32 tk, INT32 iPackSize, UINT32 iTotalSize);
+extern "C" void QCALLTYPE TypeBuilder_SetClassLayout(QCall::ModuleHandle pModule, INT32 tk, INT32 iPackSize, UINT32 iTotalSize, QCallExceptionStatus* qcallError);
// Set a custom attribute
-extern "C" void QCALLTYPE TypeBuilder_DefineCustomAttribute(QCall::ModuleHandle pModule, INT32 token, INT32 conTok, LPCBYTE pBlob, INT32 cbBlob);
+extern "C" void QCALLTYPE TypeBuilder_DefineCustomAttribute(QCall::ModuleHandle pModule, INT32 token, INT32 conTok, LPCBYTE pBlob, INT32 cbBlob, QCallExceptionStatus* qcallError);
// functions to set ParamInfo
-extern "C" INT32 QCALLTYPE TypeBuilder_SetParamInfo(QCall::ModuleHandle pModule, UINT32 tkMethod, UINT32 iSequence, UINT32 iAttributes, LPCWSTR wszParamName);
+extern "C" INT32 QCALLTYPE TypeBuilder_SetParamInfo(QCall::ModuleHandle pModule, UINT32 tkMethod, UINT32 iSequence, UINT32 iAttributes, LPCWSTR wszParamName, QCallExceptionStatus* qcallError);
// functions to set default value
-extern "C" void QCALLTYPE TypeBuilder_SetConstantValue(QCall::ModuleHandle pModule, UINT32 tk, DWORD valueType, LPVOID pValue);
+extern "C" void QCALLTYPE TypeBuilder_SetConstantValue(QCall::ModuleHandle pModule, UINT32 tk, DWORD valueType, LPVOID pValue, QCallExceptionStatus* qcallError);
#endif // _COMDYNAMIC_H_
diff --git a/src/coreclr/vm/commodule.cpp b/src/coreclr/vm/commodule.cpp
index 40ee2900fd0759..61b48f17a6de50 100644
--- a/src/coreclr/vm/commodule.cpp
+++ b/src/coreclr/vm/commodule.cpp
@@ -24,7 +24,8 @@
extern "C" mdTypeRef QCALLTYPE ModuleBuilder_GetTypeRef(QCall::ModuleHandle pModule,
LPCWSTR wszFullName,
QCall::ModuleHandle pRefedModule,
- INT32 tkResolutionArg)
+ INT32 tkResolutionArg,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -128,7 +129,8 @@ extern "C" INT32 QCALLTYPE ModuleBuilder_GetArrayMethodToken(QCall::ModuleHandle
INT32 tkTypeSpec,
LPCWSTR wszMethodName,
LPCBYTE pSignature,
- INT32 sigLength)
+ INT32 sigLength,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -203,7 +205,7 @@ namespace
// This function will return a MemberRef token given a MethodDef token and the module where the MethodDef/FieldDef is defined.
//
//******************************************************************************
-extern "C" INT32 QCALLTYPE ModuleBuilder_GetMemberRef(QCall::ModuleHandle pModule, QCall::ModuleHandle pRefedModule, INT32 tr, INT32 token)
+extern "C" INT32 QCALLTYPE ModuleBuilder_GetMemberRef(QCall::ModuleHandle pModule, QCall::ModuleHandle pRefedModule, INT32 tr, INT32 token, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -284,7 +286,7 @@ extern "C" INT32 QCALLTYPE ModuleBuilder_GetMemberRef(QCall::ModuleHandle pModul
// Return a MemberRef token given a RuntimeMethodInfo
//
//******************************************************************************
-extern "C" INT32 QCALLTYPE ModuleBuilder_GetMemberRefOfMethodInfo(QCall::ModuleHandle pModule, INT32 tr, MethodDesc * pMeth)
+extern "C" INT32 QCALLTYPE ModuleBuilder_GetMemberRefOfMethodInfo(QCall::ModuleHandle pModule, INT32 tr, MethodDesc * pMeth, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -363,7 +365,7 @@ extern "C" INT32 QCALLTYPE ModuleBuilder_GetMemberRefOfMethodInfo(QCall::ModuleH
// Return a MemberRef token given a RuntimeFieldInfo
//
//******************************************************************************
-extern "C" mdMemberRef QCALLTYPE ModuleBuilder_GetMemberRefOfFieldInfo(QCall::ModuleHandle pModule, mdTypeDef tr, QCall::TypeHandle th, mdFieldDef tkField)
+extern "C" mdMemberRef QCALLTYPE ModuleBuilder_GetMemberRefOfFieldInfo(QCall::ModuleHandle pModule, mdTypeDef tr, QCall::TypeHandle th, mdFieldDef tkField, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -441,7 +443,8 @@ extern "C" INT32 QCALLTYPE ModuleBuilder_GetMemberRefFromSignature(QCall::Module
INT32 tr,
LPCWSTR wszMemberName,
LPCBYTE pSignature,
- INT32 sigLength)
+ INT32 sigLength,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -469,7 +472,7 @@ extern "C" INT32 QCALLTYPE ModuleBuilder_GetMemberRefFromSignature(QCall::Module
// This function is used to set the FieldRVA with the content data
//
//******************************************************************************
-extern "C" void QCALLTYPE ModuleBuilder_SetFieldRVAContent(QCall::ModuleHandle pModule, INT32 tkField, LPCBYTE pContent, INT32 length)
+extern "C" void QCALLTYPE ModuleBuilder_SetFieldRVAContent(QCall::ModuleHandle pModule, INT32 tkField, LPCBYTE pContent, INT32 length, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -525,7 +528,7 @@ extern "C" void QCALLTYPE ModuleBuilder_SetFieldRVAContent(QCall::ModuleHandle p
// string constant or return the token of an existing constant.
//
//******************************************************************************
-extern "C" mdString QCALLTYPE ModuleBuilder_GetStringConstant(QCall::ModuleHandle pModule, LPCWSTR pwzValue, INT32 iLength)
+extern "C" mdString QCALLTYPE ModuleBuilder_GetStringConstant(QCall::ModuleHandle pModule, LPCWSTR pwzValue, INT32 iLength, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -552,7 +555,7 @@ extern "C" mdString QCALLTYPE ModuleBuilder_GetStringConstant(QCall::ModuleHandl
/*=============================SetModuleName====================================
// SetModuleName
==============================================================================*/
-extern "C" void QCALLTYPE ModuleBuilder_SetModuleName(QCall::ModuleHandle pModule, LPCWSTR wszModuleName)
+extern "C" void QCALLTYPE ModuleBuilder_SetModuleName(QCall::ModuleHandle pModule, LPCWSTR wszModuleName, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -571,7 +574,7 @@ extern "C" void QCALLTYPE ModuleBuilder_SetModuleName(QCall::ModuleHandle pModul
// Return a type spec token given a byte array
//
//******************************************************************************
-extern "C" mdTypeSpec QCALLTYPE ModuleBuilder_GetTokenFromTypeSpec(QCall::ModuleHandle pModule, LPCBYTE pSignature, INT32 sigLength)
+extern "C" mdTypeSpec QCALLTYPE ModuleBuilder_GetTokenFromTypeSpec(QCall::ModuleHandle pModule, LPCBYTE pSignature, INT32 sigLength, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -592,7 +595,7 @@ extern "C" mdTypeSpec QCALLTYPE ModuleBuilder_GetTokenFromTypeSpec(QCall::Module
// GetName
// This routine will return the name of the module as a String
-extern "C" void QCALLTYPE RuntimeModule_GetScopeName(QCall::ModuleHandle pModule, QCall::StringHandleOnStack retString)
+extern "C" void QCALLTYPE RuntimeModule_GetScopeName(QCall::ModuleHandle pModule, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -616,7 +619,7 @@ extern "C" void QCALLTYPE RuntimeModule_GetScopeName(QCall::ModuleHandle pModule
**Arguments:
**Exceptions:
==============================================================================*/
-extern "C" void QCALLTYPE RuntimeModule_GetFullyQualifiedName(QCall::ModuleHandle pModule, QCall::StringHandleOnStack retString)
+extern "C" void QCALLTYPE RuntimeModule_GetFullyQualifiedName(QCall::ModuleHandle pModule, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -650,7 +653,7 @@ extern "C" void QCALLTYPE RuntimeModule_GetFullyQualifiedName(QCall::ModuleHandl
**Arguments: refThis
**Exceptions: None.
==============================================================================*/
-extern "C" HINSTANCE QCALLTYPE MarshalNative_GetHINSTANCE(QCall::ModuleHandle pModule)
+extern "C" HINSTANCE QCALLTYPE MarshalNative_GetHINSTANCE(QCall::ModuleHandle pModule, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -678,7 +681,7 @@ extern "C" HINSTANCE QCALLTYPE MarshalNative_GetHINSTANCE(QCall::ModuleHandle pM
// Get class will return an array contain all of the classes
// that are defined within this Module.
-extern "C" void QCALLTYPE RuntimeModule_GetTypes(QCall::ModuleHandle pModule, QCall::ObjectHandleOnStack retTypes, QCall::ObjectHandleOnStack retExceptions)
+extern "C" void QCALLTYPE RuntimeModule_GetTypes(QCall::ModuleHandle pModule, QCall::ObjectHandleOnStack retTypes, QCall::ObjectHandleOnStack retExceptions, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
diff --git a/src/coreclr/vm/commodule.h b/src/coreclr/vm/commodule.h
index f675c6eca9cc6f..7e365f4515cdbf 100644
--- a/src/coreclr/vm/commodule.h
+++ b/src/coreclr/vm/commodule.h
@@ -22,11 +22,12 @@ class COMModule
extern "C" mdTypeRef QCALLTYPE ModuleBuilder_GetTypeRef(QCall::ModuleHandle pModule,
LPCWSTR wszFullName,
QCall::ModuleHandle pRefedModule,
- INT32 tkResolution);
+ INT32 tkResolution,
+ QCallExceptionStatus* qcallError);
// SetFieldRVAContent
// This function is used to set the FieldRVA with the content data
-extern "C" void QCALLTYPE ModuleBuilder_SetFieldRVAContent(QCall::ModuleHandle pModule, INT32 tkField, LPCBYTE pContent, INT32 length);
+extern "C" void QCALLTYPE ModuleBuilder_SetFieldRVAContent(QCall::ModuleHandle pModule, INT32 tkField, LPCBYTE pContent, INT32 length, QCallExceptionStatus* qcallError);
//GetArrayMethodToken
@@ -34,19 +35,20 @@ extern "C" INT32 QCALLTYPE ModuleBuilder_GetArrayMethodToken(QCall::ModuleHandle
INT32 tkTypeSpec,
LPCWSTR wszMethodName,
LPCBYTE pSignature,
- INT32 sigLength);
+ INT32 sigLength,
+ QCallExceptionStatus* qcallError);
// GetMemberRefToken
// This function will return the MemberRef token
-extern "C" INT32 QCALLTYPE ModuleBuilder_GetMemberRef(QCall::ModuleHandle pModule, QCall::ModuleHandle pRefedModule, INT32 tr, INT32 token);
+extern "C" INT32 QCALLTYPE ModuleBuilder_GetMemberRef(QCall::ModuleHandle pModule, QCall::ModuleHandle pRefedModule, INT32 tr, INT32 token, QCallExceptionStatus* qcallError);
// This function return a MemberRef token given a MethodInfo describing an array method
-extern "C" INT32 QCALLTYPE ModuleBuilder_GetMemberRefOfMethodInfo(QCall::ModuleHandle pModule, INT32 tr, MethodDesc * method);
+extern "C" INT32 QCALLTYPE ModuleBuilder_GetMemberRefOfMethodInfo(QCall::ModuleHandle pModule, INT32 tr, MethodDesc * method, QCallExceptionStatus* qcallError);
// GetMemberRefOfFieldInfo
// This function will return a memberRef token given a FieldInfo
-extern "C" mdMemberRef QCALLTYPE ModuleBuilder_GetMemberRefOfFieldInfo(QCall::ModuleHandle pModule, mdTypeDef tr, QCall::TypeHandle th, mdFieldDef tkField);
+extern "C" mdMemberRef QCALLTYPE ModuleBuilder_GetMemberRefOfFieldInfo(QCall::ModuleHandle pModule, mdTypeDef tr, QCall::TypeHandle th, mdFieldDef tkField, QCallExceptionStatus* qcallError);
// GetMemberRefFromSignature
// This function will return the MemberRef token given the signature from managed code
@@ -54,25 +56,26 @@ extern "C" INT32 QCALLTYPE ModuleBuilder_GetMemberRefFromSignature(QCall::Module
INT32 tr,
LPCWSTR wszMemberName,
LPCBYTE pSignature,
- INT32 sigLength);
+ INT32 sigLength,
+ QCallExceptionStatus* qcallError);
// GetTokenFromTypeSpec
-extern "C" mdTypeSpec QCALLTYPE ModuleBuilder_GetTokenFromTypeSpec(QCall::ModuleHandle pModule, LPCBYTE pSignature, INT32 sigLength);
+extern "C" mdTypeSpec QCALLTYPE ModuleBuilder_GetTokenFromTypeSpec(QCall::ModuleHandle pModule, LPCBYTE pSignature, INT32 sigLength, QCallExceptionStatus* qcallError);
// GetStringConstant
// If this is a dynamic module, this routine will define a new
// string constant or return the token of an existing constant.
-extern "C" mdString QCALLTYPE ModuleBuilder_GetStringConstant(QCall::ModuleHandle pModule, LPCWSTR pwzValue, INT32 iLength);
+extern "C" mdString QCALLTYPE ModuleBuilder_GetStringConstant(QCall::ModuleHandle pModule, LPCWSTR pwzValue, INT32 iLength, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE ModuleBuilder_SetModuleName(QCall::ModuleHandle pModule, LPCWSTR wszModuleName);
+extern "C" void QCALLTYPE ModuleBuilder_SetModuleName(QCall::ModuleHandle pModule, LPCWSTR wszModuleName, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE RuntimeModule_GetScopeName(QCall::ModuleHandle pModule, QCall::StringHandleOnStack retString);
+extern "C" void QCALLTYPE RuntimeModule_GetScopeName(QCall::ModuleHandle pModule, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE RuntimeModule_GetFullyQualifiedName(QCall::ModuleHandle pModule, QCall::StringHandleOnStack retString);
+extern "C" void QCALLTYPE RuntimeModule_GetFullyQualifiedName(QCall::ModuleHandle pModule, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError);
// GetTypes will return an array containing all of the types that are defined within this Module.
-extern "C" void QCALLTYPE RuntimeModule_GetTypes(QCall::ModuleHandle pModule, QCall::ObjectHandleOnStack retTypes, QCall::ObjectHandleOnStack retExceptions);
+extern "C" void QCALLTYPE RuntimeModule_GetTypes(QCall::ModuleHandle pModule, QCall::ObjectHandleOnStack retTypes, QCall::ObjectHandleOnStack retExceptions, QCallExceptionStatus* qcallError);
-extern "C" HINSTANCE QCALLTYPE MarshalNative_GetHINSTANCE(QCall::ModuleHandle pModule);
+extern "C" HINSTANCE QCALLTYPE MarshalNative_GetHINSTANCE(QCall::ModuleHandle pModule, QCallExceptionStatus* qcallError);
#endif
diff --git a/src/coreclr/vm/comsynchronizable.cpp b/src/coreclr/vm/comsynchronizable.cpp
index 38d6fc55d55e11..f83f92b732babd 100644
--- a/src/coreclr/vm/comsynchronizable.cpp
+++ b/src/coreclr/vm/comsynchronizable.cpp
@@ -197,7 +197,7 @@ static ULONG WINAPI KickOffThread(void* pass)
return 0;
}
-extern "C" BOOL QCALLTYPE ThreadNative_Start(QCall::ThreadHandle thread, int threadStackSize, int priority, BOOL isThreadPool, PCWSTR pThreadName, QCall::ObjectHandleOnStack exception)
+extern "C" BOOL QCALLTYPE ThreadNative_Start(QCall::ThreadHandle thread, int threadStackSize, int priority, BOOL isThreadPool, PCWSTR pThreadName, QCall::ObjectHandleOnStack exception, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -287,7 +287,7 @@ extern "C" BOOL QCALLTYPE ThreadNative_Start(QCall::ThreadHandle thread, int thr
return result;
}
-extern "C" void QCALLTYPE ThreadNative_SetPriority(QCall::ObjectHandleOnStack thread, INT32 iPriority)
+extern "C" void QCALLTYPE ThreadNative_SetPriority(QCall::ObjectHandleOnStack thread, INT32 iPriority, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -328,7 +328,7 @@ extern "C" void QCALLTYPE ThreadNative_SetPriority(QCall::ObjectHandleOnStack th
END_QCALL;
}
-extern "C" void QCALLTYPE ThreadNative_GetCurrentThread(QCall::ObjectHandleOnStack thread)
+extern "C" void QCALLTYPE ThreadNative_GetCurrentThread(QCall::ObjectHandleOnStack thread, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -340,18 +340,19 @@ extern "C" void QCALLTYPE ThreadNative_GetCurrentThread(QCall::ObjectHandleOnSta
END_QCALL;
}
-extern "C" UINT64 QCALLTYPE ThreadNative_GetCurrentOSThreadId()
+extern "C" UINT64 QCALLTYPE ThreadNative_GetCurrentOSThreadId(QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
+ UINT64 threadId = 0;
+
+ BEGIN_QCALL;
+
// The Windows API GetCurrentThreadId returns a 32-bit integer thread ID.
// On some non-Windows platforms (e.g. OSX), the thread ID is a 64-bit value.
// We special case the API for non-Windows to get the 64-bit value and zero-extend
// the Windows value to return a single data type on all platforms.
- UINT64 threadId = 0;
-
- BEGIN_QCALL;
#ifndef TARGET_UNIX
threadId = (UINT64) GetCurrentThreadId();
#else
@@ -362,7 +363,7 @@ extern "C" UINT64 QCALLTYPE ThreadNative_GetCurrentOSThreadId()
return threadId;
}
-extern "C" void QCALLTYPE ThreadNative_Initialize(QCall::ObjectHandleOnStack t)
+extern "C" void QCALLTYPE ThreadNative_Initialize(QCall::ObjectHandleOnStack t, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -431,7 +432,7 @@ extern "C" INT32 QCALLTYPE ThreadNative_GetThreadState(QCall::ThreadHandle threa
// Return whether the thread hosts an STA, is a member of the MTA or is not
// currently initialized for COM.
-extern "C" INT32 QCALLTYPE ThreadNative_GetApartmentState(QCall::ObjectHandleOnStack t)
+extern "C" INT32 QCALLTYPE ThreadNative_GetApartmentState(QCall::ObjectHandleOnStack t, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -461,7 +462,7 @@ extern "C" INT32 QCALLTYPE ThreadNative_GetApartmentState(QCall::ObjectHandleOnS
// Indicate whether the thread will host an STA (this may fail if the thread has
// already been made part of the MTA, use GetApartmentState or the return state
// from this routine to check for this).
-extern "C" INT32 QCALLTYPE ThreadNative_SetApartmentState(QCall::ObjectHandleOnStack t, INT32 iState)
+extern "C" INT32 QCALLTYPE ThreadNative_SetApartmentState(QCall::ObjectHandleOnStack t, INT32 iState, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -506,7 +507,7 @@ extern "C" INT32 QCALLTYPE ThreadNative_SetApartmentState(QCall::ObjectHandleOnS
#endif // FEATURE_COMINTEROP_APARTMENT_SUPPORT
#if TARGET_WINDOWS
-extern "C" HANDLE QCALLTYPE ThreadNative_GetOSHandle(QCall::ThreadHandle t)
+extern "C" HANDLE QCALLTYPE ThreadNative_GetOSHandle(QCall::ThreadHandle t, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -635,7 +636,7 @@ extern "C" BOOL QCALLTYPE ThreadNative_GetIsBackground(QCall::ThreadHandle threa
}
// Set whether or not this is a background thread.
-extern "C" void QCALLTYPE ThreadNative_SetIsBackground(QCall::ThreadHandle thread, BOOL value)
+extern "C" void QCALLTYPE ThreadNative_SetIsBackground(QCall::ThreadHandle thread, BOOL value, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -651,7 +652,7 @@ extern "C" void QCALLTYPE ThreadNative_SetIsBackground(QCall::ThreadHandle threa
END_QCALL;
}
-extern "C" void QCALLTYPE ThreadNative_InformThreadNameChange(QCall::ThreadHandle thread, LPCWSTR name, INT32 len)
+extern "C" void QCALLTYPE ThreadNative_InformThreadNameChange(QCall::ThreadHandle thread, LPCWSTR name, INT32 len, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -700,6 +701,36 @@ FCIMPL0(INT32, ThreadNative::GetOptimalMaxSpinWaitsPerSpinIteration)
}
FCIMPLEND
+extern "C" void QCALLTYPE ThreadNative_GetQCallSpecialException(
+ INT_PTR status,
+ QCall::ObjectHandleOnStack exception,
+ QCallExceptionStatus* qcallError)
+{
+ QCALL_CONTRACT;
+
+ _ASSERTE(status == QCallOutOfMemoryException ||
+ status == QCallStackOverflowException);
+
+ BEGIN_QCALL;
+
+ GCX_COOP();
+
+ OBJECTREF throwable;
+ if (status == QCallOutOfMemoryException)
+ {
+ throwable = CLRException::GetPreallocatedOutOfMemoryException();
+ }
+ else
+ {
+ EEException stackOverflowException(kStackOverflowException);
+ throwable = stackOverflowException.CreateThrowable();
+ }
+
+ exception.Set(throwable);
+
+ END_QCALL;
+}
+
// Returns the address of the current thread's ThreadLocalData (&t_ThreadStatics). Used on wasm to break
// the thread-static bootstrap recursion in Thread.GetThreadStaticsBase (see the managed counterpart).
#ifdef TARGET_WASM
@@ -727,7 +758,7 @@ extern "C" void QCALLTYPE ThreadNative_SpinWait(INT32 iterations)
#ifdef TARGET_WINDOWS
// This service can be called on unstarted and dead threads. For unstarted ones, the
// next wait will be interrupted. For dead ones, this service quietly does nothing.
-extern "C" void QCALLTYPE ThreadNative_Interrupt(QCall::ThreadHandle thread)
+extern "C" void QCALLTYPE ThreadNative_Interrupt(QCall::ThreadHandle thread, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -743,7 +774,7 @@ extern "C" void QCALLTYPE ThreadNative_Interrupt(QCall::ThreadHandle thread)
END_QCALL;
}
-extern "C" void QCALLTYPE ThreadNative_CheckForPendingInterrupt()
+extern "C" void QCALLTYPE ThreadNative_CheckForPendingInterrupt(QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -775,7 +806,7 @@ extern "C" void QCALLTYPE ThreadNative_PollGC()
// and is thus marked as a GC safe point, and that the p/invoke rare path will kick in
}
-extern "C" BOOL QCALLTYPE ThreadNative_YieldThread()
+extern "C" BOOL QCALLTYPE ThreadNative_YieldThread(QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -790,7 +821,7 @@ extern "C" BOOL QCALLTYPE ThreadNative_YieldThread()
return ret;
}
-extern "C" void QCALLTYPE ThreadNative_Abort(QCall::ThreadHandle thread)
+extern "C" void QCALLTYPE ThreadNative_Abort(QCall::ThreadHandle thread, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -835,7 +866,7 @@ FCIMPL1(OBJECTHANDLE, ObjectHeader_GetLockHandleIfExists, Object* pObj)
}
FCIMPLEND
-extern "C" void QCALLTYPE ObjectHeader_GetOrCreateLockObject(QCall::ObjectHandleOnStack obj, QCall::ObjectHandleOnStack lockObj)
+extern "C" void QCALLTYPE ObjectHeader_GetOrCreateLockObject(QCall::ObjectHandleOnStack obj, QCall::ObjectHandleOnStack lockObj, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -850,7 +881,7 @@ extern "C" void QCALLTYPE ObjectHeader_GetOrCreateLockObject(QCall::ObjectHandle
END_QCALL;
}
-extern "C" INT32 QCALLTYPE ThreadNative_ReentrantWaitAny(BOOL alertable, INT32 timeout, INT32 count, HANDLE *handles)
+extern "C" INT32 QCALLTYPE ThreadNative_ReentrantWaitAny(BOOL alertable, INT32 timeout, INT32 count, HANDLE *handles, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
diff --git a/src/coreclr/vm/comsynchronizable.h b/src/coreclr/vm/comsynchronizable.h
index 826ae41566bcc8..af320d49ae4d48 100644
--- a/src/coreclr/vm/comsynchronizable.h
+++ b/src/coreclr/vm/comsynchronizable.h
@@ -48,40 +48,41 @@ class ThreadNative
FCDECL0(static FC_BOOL_RET, CurrentThreadIsFinalizerThread);
};
-extern "C" BOOL QCALLTYPE ThreadNative_Start(QCall::ThreadHandle thread, int threadStackSize, int priority, BOOL isThreadPool, PCWSTR pThreadName, QCall::ObjectHandleOnStack exception);
-extern "C" void QCALLTYPE ThreadNative_SetPriority(QCall::ObjectHandleOnStack thread, INT32 iPriority);
-extern "C" void QCALLTYPE ThreadNative_GetCurrentThread(QCall::ObjectHandleOnStack thread);
+extern "C" void QCALLTYPE ThreadNative_GetQCallSpecialException(INT_PTR status, QCall::ObjectHandleOnStack exception, QCallExceptionStatus* qcallError);
+extern "C" BOOL QCALLTYPE ThreadNative_Start(QCall::ThreadHandle thread, int threadStackSize, int priority, BOOL isThreadPool, PCWSTR pThreadName, QCall::ObjectHandleOnStack exception, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE ThreadNative_SetPriority(QCall::ObjectHandleOnStack thread, INT32 iPriority, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE ThreadNative_GetCurrentThread(QCall::ObjectHandleOnStack thread, QCallExceptionStatus* qcallError);
extern "C" BOOL QCALLTYPE ThreadNative_GetIsBackground(QCall::ThreadHandle thread);
-extern "C" void QCALLTYPE ThreadNative_SetIsBackground(QCall::ThreadHandle thread, BOOL value);
-extern "C" void QCALLTYPE ThreadNative_InformThreadNameChange(QCall::ThreadHandle thread, LPCWSTR name, INT32 len);
-extern "C" BOOL QCALLTYPE ThreadNative_YieldThread();
+extern "C" void QCALLTYPE ThreadNative_SetIsBackground(QCall::ThreadHandle thread, BOOL value, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE ThreadNative_InformThreadNameChange(QCall::ThreadHandle thread, LPCWSTR name, INT32 len, QCallExceptionStatus* qcallError);
+extern "C" BOOL QCALLTYPE ThreadNative_YieldThread(QCallExceptionStatus* qcallError);
extern "C" void QCALLTYPE ThreadNative_PollGC();
-extern "C" UINT64 QCALLTYPE ThreadNative_GetCurrentOSThreadId();
-extern "C" void QCALLTYPE ThreadNative_Initialize(QCall::ObjectHandleOnStack t);
+extern "C" UINT64 QCALLTYPE ThreadNative_GetCurrentOSThreadId(QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE ThreadNative_Initialize(QCall::ObjectHandleOnStack t, QCallExceptionStatus* qcallError);
extern "C" INT32 QCALLTYPE ThreadNative_GetThreadState(QCall::ThreadHandle thread);
-extern "C" INT32 QCALLTYPE ThreadNative_ReentrantWaitAny(BOOL alertable, INT32 timeout, INT32 count, HANDLE *handles);
+extern "C" INT32 QCALLTYPE ThreadNative_ReentrantWaitAny(BOOL alertable, INT32 timeout, INT32 count, HANDLE *handles, QCallExceptionStatus* qcallError);
#ifdef TARGET_WINDOWS
-extern "C" void QCALLTYPE ThreadNative_Interrupt(QCall::ThreadHandle thread);
-extern "C" void QCALLTYPE ThreadNative_CheckForPendingInterrupt();
+extern "C" void QCALLTYPE ThreadNative_Interrupt(QCall::ThreadHandle thread, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE ThreadNative_CheckForPendingInterrupt(QCallExceptionStatus* qcallError);
#endif // TARGET_WINDOWS
#ifdef FEATURE_COMINTEROP_APARTMENT_SUPPORT
-extern "C" INT32 QCALLTYPE ThreadNative_GetApartmentState(QCall::ObjectHandleOnStack t);
-extern "C" INT32 QCALLTYPE ThreadNative_SetApartmentState(QCall::ObjectHandleOnStack t, INT32 iState);
+extern "C" INT32 QCALLTYPE ThreadNative_GetApartmentState(QCall::ObjectHandleOnStack t, QCallExceptionStatus* qcallError);
+extern "C" INT32 QCALLTYPE ThreadNative_SetApartmentState(QCall::ObjectHandleOnStack t, INT32 iState, QCallExceptionStatus* qcallError);
#endif // FEATURE_COMINTEROP_APARTMENT_SUPPORT
#ifdef TARGET_WINDOWS
-extern "C" HANDLE QCALLTYPE ThreadNative_GetOSHandle(QCall::ThreadHandle t);
+extern "C" HANDLE QCALLTYPE ThreadNative_GetOSHandle(QCall::ThreadHandle t, QCallExceptionStatus* qcallError);
#endif // TARGET_WINDOWS
-extern "C" void QCALLTYPE ThreadNative_Abort(QCall::ThreadHandle thread);
+extern "C" void QCALLTYPE ThreadNative_Abort(QCall::ThreadHandle thread, QCallExceptionStatus* qcallError);
extern "C" void QCALLTYPE ThreadNative_ResetAbort();
extern "C" void QCALLTYPE ThreadNative_SpinWait(INT32 iterations);
#ifdef FEATURE_COMINTEROP
extern "C" void QCALLTYPE ThreadNative_DisableComObjectEagerCleanup(QCall::ThreadHandle thread);
#endif // FEATURE_COMINTEROP
-extern "C" void QCALLTYPE ObjectHeader_GetOrCreateLockObject(QCall::ObjectHandleOnStack obj, QCall::ObjectHandleOnStack lockObj);
+extern "C" void QCALLTYPE ObjectHeader_GetOrCreateLockObject(QCall::ObjectHandleOnStack obj, QCall::ObjectHandleOnStack lockObj, QCallExceptionStatus* qcallError);
FCDECL1(OBJECTHANDLE, ObjectHeader_GetLockHandleIfExists, Object* obj);
#endif // _COMSYNCHRONIZABLE_H
diff --git a/src/coreclr/vm/comutilnative.cpp b/src/coreclr/vm/comutilnative.cpp
index 39641bbd437241..3e9b9993c5c814 100644
--- a/src/coreclr/vm/comutilnative.cpp
+++ b/src/coreclr/vm/comutilnative.cpp
@@ -82,7 +82,7 @@ FCIMPLEND
// Given an exception object, this method will mark its stack trace as frozen and return it to the caller.
// Frozen stack traces are immutable, when a thread attempts to add a frame to it, the stack trace is cloned first.
-extern "C" void QCALLTYPE ExceptionNative_GetFrozenStackTrace(QCall::ObjectHandleOnStack exception, QCall::ObjectHandleOnStack ret)
+extern "C" void QCALLTYPE ExceptionNative_GetFrozenStackTrace(QCall::ObjectHandleOnStack exception, QCall::ObjectHandleOnStack ret, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -312,7 +312,7 @@ FCIMPLEND
// our locks within CER's to avoid this problem - just use the CLR's
// unmanaged resources.
//
-extern "C" void QCALLTYPE ExceptionNative_GetMessageFromNativeResources(ExceptionMessageKind kind, QCall::StringHandleOnStack retMesg)
+extern "C" void QCALLTYPE ExceptionNative_GetMessageFromNativeResources(ExceptionMessageKind kind, QCall::StringHandleOnStack retMesg, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -359,7 +359,7 @@ extern "C" void QCALLTYPE ExceptionNative_GetMessageFromNativeResources(Exceptio
END_QCALL;
}
-extern "C" void QCALLTYPE ExceptionNative_GetMethodFromStackTrace(QCall::ObjectHandleOnStack stacktrace, QCall::ObjectHandleOnStack retMethodInfo)
+extern "C" void QCALLTYPE ExceptionNative_GetMethodFromStackTrace(QCall::ObjectHandleOnStack stacktrace, QCall::ObjectHandleOnStack retMethodInfo, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -403,7 +403,8 @@ extern "C" void QCALLTYPE ExceptionNative_GetMethodFromStackTrace(QCall::ObjectH
extern "C" void QCALLTYPE ExceptionNative_ThrowAmbiguousResolutionException(
MethodTable* pTargetClass,
MethodTable* pInterfaceMT,
- MethodDesc* pInterfaceMD)
+ MethodDesc* pInterfaceMD,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -417,7 +418,8 @@ extern "C" void QCALLTYPE ExceptionNative_ThrowAmbiguousResolutionException(
extern "C" void QCALLTYPE ExceptionNative_ThrowEntryPointNotFoundException(
MethodTable* pTargetClass,
MethodTable* pInterfaceMT,
- MethodDesc* pInterfaceMD)
+ MethodDesc* pInterfaceMD,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -428,7 +430,7 @@ extern "C" void QCALLTYPE ExceptionNative_ThrowEntryPointNotFoundException(
END_QCALL;
}
-extern "C" void QCALLTYPE ExceptionNative_ThrowMethodAccessException(MethodDesc* caller, MethodDesc* callee)
+extern "C" void QCALLTYPE ExceptionNative_ThrowMethodAccessException(MethodDesc* caller, MethodDesc* callee, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -441,7 +443,7 @@ extern "C" void QCALLTYPE ExceptionNative_ThrowMethodAccessException(MethodDesc*
END_QCALL;
}
-extern "C" void QCALLTYPE ExceptionNative_ThrowFieldAccessException(MethodDesc* caller, FieldDesc* callee)
+extern "C" void QCALLTYPE ExceptionNative_ThrowFieldAccessException(MethodDesc* caller, FieldDesc* callee, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -454,7 +456,7 @@ extern "C" void QCALLTYPE ExceptionNative_ThrowFieldAccessException(MethodDesc*
END_QCALL;
}
-extern "C" void QCALLTYPE ExceptionNative_ThrowClassAccessException(MethodDesc* caller, EnregisteredTypeHandle callee)
+extern "C" void QCALLTYPE ExceptionNative_ThrowClassAccessException(MethodDesc* caller, EnregisteredTypeHandle callee, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -585,7 +587,7 @@ FCIMPL0(FC_BOOL_RET, GCInterface::CancelFullGCNotification)
}
FCIMPLEND
-extern "C" int QCALLTYPE GCInterface_WaitForFullGCApproach(int millisecondsTimeout)
+extern "C" int QCALLTYPE GCInterface_WaitForFullGCApproach(int millisecondsTimeout, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -603,7 +605,7 @@ extern "C" int QCALLTYPE GCInterface_WaitForFullGCApproach(int millisecondsTimeo
return result;
}
-extern "C" int QCALLTYPE GCInterface_WaitForFullGCComplete(int millisecondsTimeout)
+extern "C" int QCALLTYPE GCInterface_WaitForFullGCComplete(int millisecondsTimeout, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -670,7 +672,7 @@ FCIMPL2(int, GCInterface::CollectionCount, INT32 generation, INT32 getSpecialGCC
}
FCIMPLEND
-extern "C" int QCALLTYPE GCInterface_StartNoGCRegion(INT64 totalSize, BOOL lohSizeKnown, INT64 lohSize, BOOL disallowFullBlockingGC)
+extern "C" int QCALLTYPE GCInterface_StartNoGCRegion(INT64 totalSize, BOOL lohSizeKnown, INT64 lohSize, BOOL disallowFullBlockingGC, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -690,7 +692,7 @@ extern "C" int QCALLTYPE GCInterface_StartNoGCRegion(INT64 totalSize, BOOL lohSi
return retVal;
}
-extern "C" int QCALLTYPE GCInterface_EndNoGCRegion()
+extern "C" int QCALLTYPE GCInterface_EndNoGCRegion(QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -727,7 +729,7 @@ FCIMPLEND
**Arguments: None
**Exceptions: None
==============================================================================*/
-extern "C" INT64 QCALLTYPE GCInterface_GetTotalMemory()
+extern "C" INT64 QCALLTYPE GCInterface_GetTotalMemory(QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -749,7 +751,7 @@ extern "C" INT64 QCALLTYPE GCInterface_GetTotalMemory()
**Arguments: args->generation: The maximum generation to collect
**Exceptions: Argument exception if args->generation is < 0 or > GetMaxGeneration();
==============================================================================*/
-extern "C" void QCALLTYPE GCInterface_Collect(INT32 generation, INT32 mode, CLR_BOOL lowMemoryPressure)
+extern "C" void QCALLTYPE GCInterface_Collect(INT32 generation, INT32 mode, CLR_BOOL lowMemoryPressure, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -766,7 +768,7 @@ extern "C" void QCALLTYPE GCInterface_Collect(INT32 generation, INT32 mode, CLR_
END_QCALL;
}
-extern "C" void* QCALLTYPE GCInterface_GetNextFinalizableObject(QCall::ObjectHandleOnStack pObj)
+extern "C" void* QCALLTYPE GCInterface_GetNextFinalizableObject(QCall::ObjectHandleOnStack pObj, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -808,7 +810,7 @@ extern "C" void* QCALLTYPE GCInterface_GetNextFinalizableObject(QCall::ObjectHan
**Arguments: None
**Exceptions: None
==============================================================================*/
-extern "C" void QCALLTYPE GCInterface_WaitForPendingFinalizers()
+extern "C" void QCALLTYPE GCInterface_WaitForPendingFinalizers(QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -875,7 +877,7 @@ FCIMPLEND
** ret -> The allocated array.
**Exceptions: IDS_EE_ARRAY_DIMENSIONS_EXCEEDED when size is too large. OOM if can't allocate.
==============================================================================*/
-extern "C" void QCALLTYPE GCInterface_AllocateNewArray(void* typeHandlePtr, INT32 length, INT32 flags, QCall::ObjectHandleOnStack ret)
+extern "C" void QCALLTYPE GCInterface_AllocateNewArray(void* typeHandlePtr, INT32 length, INT32 flags, QCall::ObjectHandleOnStack ret, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
_ASSERTE(typeHandlePtr != NULL);
@@ -925,7 +927,7 @@ FCIMPL0(INT64, GCInterface::GetTotalAllocatedBytesApproximate)
}
FCIMPLEND;
-extern "C" INT64 QCALLTYPE GCInterface_GetTotalAllocatedBytesPrecise()
+extern "C" INT64 QCALLTYPE GCInterface_GetTotalAllocatedBytesPrecise(QCallExceptionStatus* qcallError)
{
INT64 allocated = 0;
@@ -963,7 +965,7 @@ extern "C" INT64 QCALLTYPE GCInterface_GetTotalAllocatedBytesPrecise()
**Arguments: args-> pointer to section, size of section
**Exceptions: None
==============================================================================*/
-extern "C" void* QCALLTYPE GCInterface_RegisterFrozenSegment(void* pSection, SIZE_T sizeSection)
+extern "C" void* QCALLTYPE GCInterface_RegisterFrozenSegment(void* pSection, SIZE_T sizeSection, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -996,7 +998,7 @@ extern "C" void* QCALLTYPE GCInterface_RegisterFrozenSegment(void* pSection, SIZ
**Arguments: args-> segment handle
**Exceptions: None
==============================================================================*/
-extern "C" void QCALLTYPE GCInterface_UnregisterFrozenSegment(void* segment)
+extern "C" void QCALLTYPE GCInterface_UnregisterFrozenSegment(void* segment, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1032,7 +1034,7 @@ FCIMPLEND
**Arguments: Object of interest
**Exceptions: None
==============================================================================*/
-extern "C" void QCALLTYPE GCInterface_ReRegisterForFinalize(QCall::ObjectHandleOnStack pObj)
+extern "C" void QCALLTYPE GCInterface_ReRegisterForFinalize(QCall::ObjectHandleOnStack pObj, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1090,7 +1092,7 @@ FORCEINLINE UINT64 GCInterface::InterlockedSub(UINT64 *pMinuend, UINT64 subtrahe
return newMemValue;
}
-extern "C" void QCALLTYPE GCInterface_AddMemoryPressure(UINT64 bytesAllocated)
+extern "C" void QCALLTYPE GCInterface_AddMemoryPressure(UINT64 bytesAllocated, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1099,7 +1101,7 @@ extern "C" void QCALLTYPE GCInterface_AddMemoryPressure(UINT64 bytesAllocated)
END_QCALL;
}
-extern "C" void QCALLTYPE GCInterface_EnumerateConfigurationValues(void* configurationContext, EnumerateConfigurationValuesCallback callback)
+extern "C" void QCALLTYPE GCInterface_EnumerateConfigurationValues(void* configurationContext, EnumerateConfigurationValuesCallback callback, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1127,13 +1129,14 @@ void GCInterface::EnumerateConfigurationValues(void* configurationContext, Enume
GCHeapHardLimitInfo g_gcHeapHardLimitInfo;
bool g_gcHeapHardLimitInfoSpecified = false;
-extern "C" int QCALLTYPE GCInterface_RefreshMemoryLimit(GCHeapHardLimitInfo heapHardLimitInfo)
+extern "C" int QCALLTYPE GCInterface_RefreshMemoryLimit(GCHeapHardLimitInfo heapHardLimitInfo, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
int result = 0;
BEGIN_QCALL;
+
g_gcHeapHardLimitInfo = heapHardLimitInfo;
g_gcHeapHardLimitInfoSpecified = true;
result = GCInterface::RefreshMemoryLimit();
@@ -1155,7 +1158,7 @@ int GCInterface::RefreshMemoryLimit()
return GCHeapUtilities::GetGCHeap()->RefreshMemoryLimit();
}
-extern "C" enable_no_gc_region_callback_status QCALLTYPE GCInterface_EnableNoGCRegionCallback(NoGCRegionCallbackFinalizerWorkItem* callback, INT64 totalSize)
+extern "C" enable_no_gc_region_callback_status QCALLTYPE GCInterface_EnableNoGCRegionCallback(NoGCRegionCallbackFinalizerWorkItem* callback, INT64 totalSize, QCallExceptionStatus* qcallError)
{
enable_no_gc_region_callback_status status = enable_no_gc_region_callback_status::succeed;
QCALL_CONTRACT;
@@ -1179,7 +1182,7 @@ enable_no_gc_region_callback_status GCInterface::EnableNoGCRegionCallback(NoGCRe
return GCHeapUtilities::GetGCHeap()->EnableNoGCRegionCallback(callback, totalSize);
}
-extern "C" uint64_t QCALLTYPE GCInterface_GetGenerationBudget(int generation)
+extern "C" uint64_t QCALLTYPE GCInterface_GetGenerationBudget(int generation, QCallExceptionStatus* qcallError)
{
uint64_t result = 0;
QCALL_CONTRACT;
@@ -1328,7 +1331,7 @@ void GCInterface::AddMemoryPressure(UINT64 bytesAllocated)
}
}
-extern "C" void QCALLTYPE GCInterface_RemoveMemoryPressure(UINT64 bytesAllocated)
+extern "C" void QCALLTYPE GCInterface_RemoveMemoryPressure(UINT64 bytesAllocated, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1412,7 +1415,7 @@ NOINLINE void GCInterface::GarbageCollectModeAny(int generation)
//
// EnvironmentNative
//
-extern "C" VOID QCALLTYPE Environment_Exit(INT32 exitcode)
+extern "C" VOID QCALLTYPE Environment_Exit(INT32 exitcode, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1450,7 +1453,7 @@ FCIMPL0(INT32, EnvironmentNative::GetExitCode)
}
FCIMPLEND
-extern "C" INT32 QCALLTYPE Environment_GetProcessorCount()
+extern "C" INT32 QCALLTYPE Environment_GetProcessorCount(QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1499,7 +1502,7 @@ static StackWalkAction FindFailFastCallerCallback(CrawlFrame* frame, VOID* data)
static thread_local int8_t alreadyFailing = 0;
-extern "C" void QCALLTYPE Environment_FailFast(QCall::StackCrawlMarkHandle mark, PCWSTR message, QCall::ObjectHandleOnStack exception, PCWSTR errorSource)
+extern "C" void QCALLTYPE Environment_FailFast(QCall::StackCrawlMarkHandle mark, PCWSTR message, QCall::ObjectHandleOnStack exception, PCWSTR errorSource, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1574,7 +1577,7 @@ extern "C" void QCALLTYPE Environment_FailFast(QCall::StackCrawlMarkHandle mark,
//
// ObjectNative
//
-extern "C" INT32 QCALLTYPE ObjectNative_GetHashCodeSlow(QCall::ObjectHandleOnStack objHandle)
+extern "C" INT32 QCALLTYPE ObjectNative_GetHashCodeSlow(QCall::ObjectHandleOnStack objHandle, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1625,7 +1628,7 @@ FCIMPL2(FC_BOOL_RET, ObjectNative::ContentEquals, Object *pThisRef, Object *pCom
}
FCIMPLEND
-extern "C" void QCALLTYPE ObjectNative_AllocateUninitializedClone(QCall::ObjectHandleOnStack objHandle)
+extern "C" void QCALLTYPE ObjectNative_AllocateUninitializedClone(QCall::ObjectHandleOnStack objHandle, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1841,7 +1844,7 @@ BOOL CanCompareBitsOrUseFastGetHashCode(MethodTable* mt)
return canCompareBitsOrUseFastGetHashCode;
}
-extern "C" BOOL QCALLTYPE MethodTable_CanCompareBitsOrUseFastGetHashCode(MethodTable* mt)
+extern "C" BOOL QCALLTYPE MethodTable_CanCompareBitsOrUseFastGetHashCode(MethodTable* mt, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1960,15 +1963,16 @@ static ValueTypeHashCodeStrategy GetHashCodeStrategy(MethodTable* mt, QCall::Obj
return ret;
}
-extern "C" INT32 QCALLTYPE ValueType_GetHashCodeStrategy(MethodTable* mt, QCall::ObjectHandleOnStack objHandle, UINT32* fieldOffset, UINT32* fieldSize, MethodTable** fieldMT)
+extern "C" INT32 QCALLTYPE ValueType_GetHashCodeStrategy(MethodTable* mt, QCall::ObjectHandleOnStack objHandle, UINT32* fieldOffset, UINT32* fieldSize, MethodTable** fieldMT, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
- ValueTypeHashCodeStrategy ret = ValueTypeHashCodeStrategy::None;
*fieldOffset = 0;
*fieldSize = 0;
*fieldMT = NULL;
+ ValueTypeHashCodeStrategy ret = ValueTypeHashCodeStrategy::None;
+
BEGIN_QCALL;
ret = GetHashCodeStrategy(mt, objHandle, fieldOffset, fieldSize, fieldMT);
@@ -2021,7 +2025,7 @@ FCIMPL1(OBJECTHANDLE, MethodTableNative::GetLoaderAllocatorHandle, MethodTable *
}
FCIMPLEND
-extern "C" BOOL QCALLTYPE MethodTable_AreTypesEquivalent(MethodTable* mta, MethodTable* mtb)
+extern "C" BOOL QCALLTYPE MethodTable_AreTypesEquivalent(MethodTable* mta, MethodTable* mtb, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -2036,7 +2040,7 @@ extern "C" BOOL QCALLTYPE MethodTable_AreTypesEquivalent(MethodTable* mta, Metho
return bResult;
}
-extern "C" BOOL QCALLTYPE TypeHandle_CanCastTo_NoCacheLookup(void* fromTypeHnd, void* toTypeHnd)
+extern "C" BOOL QCALLTYPE TypeHandle_CanCastTo_NoCacheLookup(void* fromTypeHnd, void* toTypeHnd, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -2094,7 +2098,7 @@ static bool HasOverriddenStreamMethod(MethodTable* streamMT, MethodTable* pMT, W
return NonVirtualEntry2MethodDesc(actual) != NonVirtualEntry2MethodDesc(base);
}
-extern "C" BOOL QCALLTYPE Stream_HasOverriddenSlow(MethodTable* pMT, BOOL isRead)
+extern "C" BOOL QCALLTYPE Stream_HasOverriddenSlow(MethodTable* pMT, BOOL isRead, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
_ASSERTE(pMT != NULL);
diff --git a/src/coreclr/vm/comutilnative.h b/src/coreclr/vm/comutilnative.h
index cd1c31211d7064..e68ede7b519e0b 100644
--- a/src/coreclr/vm/comutilnative.h
+++ b/src/coreclr/vm/comutilnative.h
@@ -48,30 +48,32 @@ class ExceptionNative
FCDECL0(static UINT32, GetExceptionCount);
};
-extern "C" void QCALLTYPE ExceptionNative_GetFrozenStackTrace(QCall::ObjectHandleOnStack exception, QCall::ObjectHandleOnStack ret);
+extern "C" void QCALLTYPE ExceptionNative_GetFrozenStackTrace(QCall::ObjectHandleOnStack exception, QCall::ObjectHandleOnStack ret, QCallExceptionStatus* qcallError);
enum class ExceptionMessageKind {
ThreadAbort = 1,
ThreadInterrupted = 2,
OutOfMemory = 3
};
-extern "C" void QCALLTYPE ExceptionNative_GetMessageFromNativeResources(ExceptionMessageKind kind, QCall::StringHandleOnStack retMesg);
+extern "C" void QCALLTYPE ExceptionNative_GetMessageFromNativeResources(ExceptionMessageKind kind, QCall::StringHandleOnStack retMesg, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE ExceptionNative_GetMethodFromStackTrace(QCall::ObjectHandleOnStack array, QCall::ObjectHandleOnStack retMethodInfo);
+extern "C" void QCALLTYPE ExceptionNative_GetMethodFromStackTrace(QCall::ObjectHandleOnStack array, QCall::ObjectHandleOnStack retMethodInfo, QCallExceptionStatus* qcallError);
extern "C" void QCALLTYPE ExceptionNative_ThrowAmbiguousResolutionException(
MethodTable* pTargetClass,
MethodTable* pInterfaceMT,
- MethodDesc* pInterfaceMD);
+ MethodDesc* pInterfaceMD,
+ QCallExceptionStatus* qcallError);
extern "C" void QCALLTYPE ExceptionNative_ThrowEntryPointNotFoundException(
MethodTable* pTargetClass,
MethodTable* pInterfaceMT,
- MethodDesc* pInterfaceMD);
+ MethodDesc* pInterfaceMD,
+ QCallExceptionStatus* qcallError);
-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);
+extern "C" void QCALLTYPE ExceptionNative_ThrowMethodAccessException(MethodDesc* caller, MethodDesc* callee, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE ExceptionNative_ThrowFieldAccessException(MethodDesc* caller, FieldDesc* callee, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE ExceptionNative_ThrowClassAccessException(MethodDesc* caller, EnregisteredTypeHandle callee, QCallExceptionStatus* qcallError);
//
// Buffer
@@ -191,42 +193,42 @@ class GCInterface {
NOINLINE static void GarbageCollectModeAny(int generation);
};
-extern "C" INT64 QCALLTYPE GCInterface_GetTotalAllocatedBytesPrecise();
+extern "C" INT64 QCALLTYPE GCInterface_GetTotalAllocatedBytesPrecise(QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE GCInterface_AllocateNewArray(void* typeHandlePtr, INT32 length, INT32 flags, QCall::ObjectHandleOnStack ret);
+extern "C" void QCALLTYPE GCInterface_AllocateNewArray(void* typeHandlePtr, INT32 length, INT32 flags, QCall::ObjectHandleOnStack ret, QCallExceptionStatus* qcallError);
-extern "C" INT64 QCALLTYPE GCInterface_GetTotalMemory();
+extern "C" INT64 QCALLTYPE GCInterface_GetTotalMemory(QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE GCInterface_Collect(INT32 generation, INT32 mode, CLR_BOOL lowMemoryPressure);
+extern "C" void QCALLTYPE GCInterface_Collect(INT32 generation, INT32 mode, CLR_BOOL lowMemoryPressure, QCallExceptionStatus* qcallError);
-extern "C" void* QCALLTYPE GCInterface_GetNextFinalizableObject(QCall::ObjectHandleOnStack pObj);
+extern "C" void* QCALLTYPE GCInterface_GetNextFinalizableObject(QCall::ObjectHandleOnStack pObj, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE GCInterface_WaitForPendingFinalizers();
-extern "C" void* QCALLTYPE GCInterface_RegisterFrozenSegment(void *pSection, SIZE_T sizeSection);
+extern "C" void QCALLTYPE GCInterface_WaitForPendingFinalizers(QCallExceptionStatus* qcallError);
+extern "C" void* QCALLTYPE GCInterface_RegisterFrozenSegment(void *pSection, SIZE_T sizeSection, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE GCInterface_UnregisterFrozenSegment(void *segmentHandle);
+extern "C" void QCALLTYPE GCInterface_UnregisterFrozenSegment(void *segmentHandle, QCallExceptionStatus* qcallError);
-extern "C" int QCALLTYPE GCInterface_WaitForFullGCApproach(int millisecondsTimeout);
+extern "C" int QCALLTYPE GCInterface_WaitForFullGCApproach(int millisecondsTimeout, QCallExceptionStatus* qcallError);
-extern "C" int QCALLTYPE GCInterface_WaitForFullGCComplete(int millisecondsTimeout);
+extern "C" int QCALLTYPE GCInterface_WaitForFullGCComplete(int millisecondsTimeout, QCallExceptionStatus* qcallError);
-extern "C" int QCALLTYPE GCInterface_StartNoGCRegion(INT64 totalSize, BOOL lohSizeKnown, INT64 lohSize, BOOL disallowFullBlockingGC);
+extern "C" int QCALLTYPE GCInterface_StartNoGCRegion(INT64 totalSize, BOOL lohSizeKnown, INT64 lohSize, BOOL disallowFullBlockingGC, QCallExceptionStatus* qcallError);
-extern "C" int QCALLTYPE GCInterface_EndNoGCRegion();
+extern "C" int QCALLTYPE GCInterface_EndNoGCRegion(QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE GCInterface_AddMemoryPressure(UINT64 bytesAllocated);
+extern "C" void QCALLTYPE GCInterface_AddMemoryPressure(UINT64 bytesAllocated, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE GCInterface_RemoveMemoryPressure(UINT64 bytesAllocated);
+extern "C" void QCALLTYPE GCInterface_RemoveMemoryPressure(UINT64 bytesAllocated, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE GCInterface_ReRegisterForFinalize(QCall::ObjectHandleOnStack pObj);
+extern "C" void QCALLTYPE GCInterface_ReRegisterForFinalize(QCall::ObjectHandleOnStack pObj, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE GCInterface_EnumerateConfigurationValues(void* configurationContext, EnumerateConfigurationValuesCallback callback);
+extern "C" void QCALLTYPE GCInterface_EnumerateConfigurationValues(void* configurationContext, EnumerateConfigurationValuesCallback callback, QCallExceptionStatus* qcallError);
-extern "C" int QCALLTYPE GCInterface_RefreshMemoryLimit(GCHeapHardLimitInfo heapHardLimitInfo);
+extern "C" int QCALLTYPE GCInterface_RefreshMemoryLimit(GCHeapHardLimitInfo heapHardLimitInfo, QCallExceptionStatus* qcallError);
-extern "C" enable_no_gc_region_callback_status QCALLTYPE GCInterface_EnableNoGCRegionCallback(NoGCRegionCallbackFinalizerWorkItem* callback, INT64 totalSize);
+extern "C" enable_no_gc_region_callback_status QCALLTYPE GCInterface_EnableNoGCRegionCallback(NoGCRegionCallbackFinalizerWorkItem* callback, INT64 totalSize, QCallExceptionStatus* qcallError);
-extern "C" uint64_t QCALLTYPE GCInterface_GetGenerationBudget(int generation);
+extern "C" uint64_t QCALLTYPE GCInterface_GetGenerationBudget(int generation, QCallExceptionStatus* qcallError);
//
// EnvironmentNative
@@ -239,18 +241,18 @@ class EnvironmentNative
FCDECL0(static INT32, GetExitCode);
};
-extern "C" void QCALLTYPE Environment_Exit(INT32 exitcode);
+extern "C" void QCALLTYPE Environment_Exit(INT32 exitcode, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE Environment_FailFast(QCall::StackCrawlMarkHandle mark, PCWSTR message, QCall::ObjectHandleOnStack exception, PCWSTR errorSource);
+extern "C" void QCALLTYPE Environment_FailFast(QCall::StackCrawlMarkHandle mark, PCWSTR message, QCall::ObjectHandleOnStack exception, PCWSTR errorSource, QCallExceptionStatus* qcallError);
// Returns the number of logical processors that can be used by managed code
-extern "C" INT32 QCALLTYPE Environment_GetProcessorCount();
+extern "C" INT32 QCALLTYPE Environment_GetProcessorCount(QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE GetTypeLoadExceptionMessage(UINT32 resId, QCall::StringHandleOnStack retString);
+extern "C" void QCALLTYPE GetTypeLoadExceptionMessage(UINT32 resId, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE GetFileLoadExceptionMessage(UINT32 hr, QCall::StringHandleOnStack retString);
+extern "C" void QCALLTYPE GetFileLoadExceptionMessage(UINT32 hr, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE FileLoadException_GetMessageForHR(UINT32 hresult, QCall::StringHandleOnStack retString);
+extern "C" void QCALLTYPE FileLoadException_GetMessageForHR(UINT32 hresult, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError);
class ObjectNative
{
@@ -259,8 +261,8 @@ class ObjectNative
FCDECL2(static FC_BOOL_RET, ContentEquals, Object *pThisRef, Object *pCompareRef);
};
-extern "C" INT32 QCALLTYPE ObjectNative_GetHashCodeSlow(QCall::ObjectHandleOnStack objHandle);
-extern "C" void QCALLTYPE ObjectNative_AllocateUninitializedClone(QCall::ObjectHandleOnStack objHandle);
+extern "C" INT32 QCALLTYPE ObjectNative_GetHashCodeSlow(QCall::ObjectHandleOnStack objHandle, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE ObjectNative_AllocateUninitializedClone(QCall::ObjectHandleOnStack objHandle, QCallExceptionStatus* qcallError);
class COMInterlocked
{
@@ -284,14 +286,14 @@ class MethodTableNative {
FCDECL1(static OBJECTHANDLE, GetLoaderAllocatorHandle, MethodTable* mt);
};
-extern "C" BOOL QCALLTYPE MethodTable_AreTypesEquivalent(MethodTable* mta, MethodTable* mtb);
-extern "C" BOOL QCALLTYPE MethodTable_CanCompareBitsOrUseFastGetHashCode(MethodTable* mt);
-extern "C" BOOL QCALLTYPE TypeHandle_CanCastTo_NoCacheLookup(void* fromTypeHnd, void* toTypeHnd);
+extern "C" BOOL QCALLTYPE MethodTable_AreTypesEquivalent(MethodTable* mta, MethodTable* mtb, QCallExceptionStatus* qcallError);
+extern "C" BOOL QCALLTYPE MethodTable_CanCompareBitsOrUseFastGetHashCode(MethodTable* mt, QCallExceptionStatus* qcallError);
+extern "C" BOOL QCALLTYPE TypeHandle_CanCastTo_NoCacheLookup(void* fromTypeHnd, void* toTypeHnd, QCallExceptionStatus* qcallError);
extern "C" INT32 QCALLTYPE TypeHandle_GetCorElementType(void* typeHnd);
-extern "C" INT32 QCALLTYPE ValueType_GetHashCodeStrategy(MethodTable* mt, QCall::ObjectHandleOnStack objHandle, UINT32* fieldOffset, UINT32* fieldSize, MethodTable** fieldMT);
+extern "C" INT32 QCALLTYPE ValueType_GetHashCodeStrategy(MethodTable* mt, QCall::ObjectHandleOnStack objHandle, UINT32* fieldOffset, UINT32* fieldSize, MethodTable** fieldMT, QCallExceptionStatus* qcallError);
BOOL CanCompareBitsOrUseFastGetHashCode(MethodTable* mt);
-extern "C" BOOL QCALLTYPE Stream_HasOverriddenSlow(MethodTable* pMT, BOOL isRead);
+extern "C" BOOL QCALLTYPE Stream_HasOverriddenSlow(MethodTable* pMT, BOOL isRead, QCallExceptionStatus* qcallError);
#endif // _COMUTILNATIVE_H_
diff --git a/src/coreclr/vm/coreassemblyspec.cpp b/src/coreclr/vm/coreassemblyspec.cpp
index b289c69257d2a8..30d16fcd2196a3 100644
--- a/src/coreclr/vm/coreassemblyspec.cpp
+++ b/src/coreclr/vm/coreassemblyspec.cpp
@@ -184,7 +184,7 @@ void BaseAssemblySpec::Init(SString& assemblyDisplayName)
parseAsAssemblySpec.InvokeThrowing(pAssemblyDisplayName, (void*)this);
}
-extern "C" void QCALLTYPE AssemblyName_InitializeAssemblySpec(NativeAssemblyNameParts* pAssemblyNameParts, BaseAssemblySpec* pAssemblySpec)
+extern "C" void QCALLTYPE AssemblyName_InitializeAssemblySpec(NativeAssemblyNameParts* pAssemblyNameParts, BaseAssemblySpec* pAssemblySpec, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
diff --git a/src/coreclr/vm/customattribute.cpp b/src/coreclr/vm/customattribute.cpp
index 82fcdbf0941eac..8896cf37f7a3b6 100644
--- a/src/coreclr/vm/customattribute.cpp
+++ b/src/coreclr/vm/customattribute.cpp
@@ -904,7 +904,8 @@ extern "C" void QCALLTYPE CustomAttribute_CreateCustomAttributeInstance(
BYTE** ppBlob,
BYTE* pEndBlob,
INT32* pcNamedArgs,
- QCall::ObjectHandleOnStack result)
+ QCall::ObjectHandleOnStack result,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1033,7 +1034,8 @@ extern "C" void QCALLTYPE CustomAttribute_CreatePropertyOrFieldData(
QCall::StringHandleOnStack pName,
BOOL* pbIsProperty,
QCall::ObjectHandleOnStack pType,
- QCall::ObjectHandleOnStack pValue)
+ QCall::ObjectHandleOnStack pValue,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
diff --git a/src/coreclr/vm/customattribute.h b/src/coreclr/vm/customattribute.h
index 2cbc846bff8f10..210cd238d85f07 100644
--- a/src/coreclr/vm/customattribute.h
+++ b/src/coreclr/vm/customattribute.h
@@ -37,7 +37,8 @@ extern "C" void QCALLTYPE CustomAttribute_CreateCustomAttributeInstance(
BYTE** ppBlob,
BYTE* pEndBlob,
INT32* pcNamedArgs,
- QCall::ObjectHandleOnStack result);
+ QCall::ObjectHandleOnStack result,
+ QCallExceptionStatus* qcallError);
extern "C" void QCALLTYPE CustomAttribute_CreatePropertyOrFieldData(
QCall::ModuleHandle pModule,
@@ -46,6 +47,7 @@ extern "C" void QCALLTYPE CustomAttribute_CreatePropertyOrFieldData(
QCall::StringHandleOnStack pName,
BOOL* pbIsProperty,
QCall::ObjectHandleOnStack pType,
- QCall::ObjectHandleOnStack value);
+ QCall::ObjectHandleOnStack value,
+ QCallExceptionStatus* qcallError);
#endif // _CUSTOMATTRIBUTE_H_
diff --git a/src/coreclr/vm/debugdebugger.cpp b/src/coreclr/vm/debugdebugger.cpp
index dcb17d68da4e1a..500560c8284927 100644
--- a/src/coreclr/vm/debugdebugger.cpp
+++ b/src/coreclr/vm/debugdebugger.cpp
@@ -38,7 +38,7 @@
// Else if a native debugger is attached, this should send a native break event (kernel32!DebugBreak)
// Else, this should invoke Watson.
//
-extern "C" void QCALLTYPE DebugDebugger_Break()
+extern "C" void QCALLTYPE DebugDebugger_Break(QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -80,6 +80,8 @@ extern "C" void QCALLTYPE DebugDebugger_Break()
}
END_QCALL;
+#else
+ *qcallError = 0;
#endif // DEBUGGING_SUPPORTED
}
@@ -291,7 +293,8 @@ static void GetStackFrames(DebugStackTrace::GetStackFramesData *pData)
extern "C" void QCALLTYPE AsyncHelpers_AddContinuationToExInternal(
void* diagnosticIP,
- QCall::ObjectHandleOnStack exception)
+ QCall::ObjectHandleOnStack exception,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -319,7 +322,8 @@ extern "C" void QCALLTYPE AsyncHelpers_AddContinuationToExInternal(
extern "C" void QCALLTYPE StackTrace_GetStackFramesInternal(
QCall::ObjectHandleOnStack stackFrameHelper,
BOOL fNeedFileInfo,
- QCall::ObjectHandleOnStack exception)
+ QCall::ObjectHandleOnStack exception,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -822,7 +826,7 @@ extern "C" void QCALLTYPE StackTrace_GetStackFramesInternal(
END_QCALL;
}
-extern "C" MethodDesc* QCALLTYPE StackFrame_GetMethodDescFromNativeIP(LPVOID ip)
+extern "C" MethodDesc* QCALLTYPE StackFrame_GetMethodDescFromNativeIP(LPVOID ip, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -861,14 +865,17 @@ using StrongHandleHolder = LifetimeHolder;
// receives a custom notification object from the target and sends it to the RS via
// code:Debugger::SendCustomDebuggerNotification
// Argument: dataUNSAFE - a pointer the custom notification object being sent
-extern "C" void QCALLTYPE DebugDebugger_CustomNotification(QCall::ObjectHandleOnStack data)
+extern "C" void QCALLTYPE DebugDebugger_CustomNotification(QCall::ObjectHandleOnStack data, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
#ifdef DEBUGGING_SUPPORTED
// Send notification only if the debugger is attached
if (!CORDebuggerAttached())
+ {
+ *qcallError = 0;
return;
+ }
BEGIN_QCALL;
@@ -893,6 +900,8 @@ extern "C" void QCALLTYPE DebugDebugger_CustomNotification(QCall::ObjectHandleOn
}
END_QCALL;
+#else
+ *qcallError = 0;
#endif // DEBUGGING_SUPPORTED
}
diff --git a/src/coreclr/vm/debugdebugger.h b/src/coreclr/vm/debugdebugger.h
index 8cd17439db17cc..d8d6cbc3f927df 100644
--- a/src/coreclr/vm/debugdebugger.h
+++ b/src/coreclr/vm/debugdebugger.h
@@ -13,10 +13,10 @@
#define __DEBUG_DEBUGGER_h__
#include
-extern "C" void QCALLTYPE DebugDebugger_Break();
+extern "C" void QCALLTYPE DebugDebugger_Break(QCallExceptionStatus* qcallError);
extern "C" BOOL QCALLTYPE DebugDebugger_Launch();
extern "C" void QCALLTYPE DebugDebugger_Log(INT32 Level, PCWSTR pwzModule, PCWSTR pwzMessage);
-extern "C" void QCALLTYPE DebugDebugger_CustomNotification(QCall::ObjectHandleOnStack data);
+extern "C" void QCALLTYPE DebugDebugger_CustomNotification(QCall::ObjectHandleOnStack data, QCallExceptionStatus* qcallError);
extern "C" BOOL QCALLTYPE DebugDebugger_IsLoggingHelper();
extern "C" BOOL QCALLTYPE DebugDebugger_IsManagedDebuggerAttached();
@@ -133,13 +133,15 @@ class DebugStackTrace
extern "C" void QCALLTYPE StackTrace_GetStackFramesInternal(
QCall::ObjectHandleOnStack stackFrameHelper,
BOOL fNeedFileInfo,
- QCall::ObjectHandleOnStack exception);
+ QCall::ObjectHandleOnStack exception,
+ QCallExceptionStatus* qcallError);
extern "C" void QCALLTYPE AsyncHelpers_AddContinuationToExInternal(
void* diagnosticIP,
- QCall::ObjectHandleOnStack exception);
+ QCall::ObjectHandleOnStack exception,
+ QCallExceptionStatus* qcallError);
-extern "C" MethodDesc* QCALLTYPE StackFrame_GetMethodDescFromNativeIP(LPVOID ip);
+extern "C" MethodDesc* QCALLTYPE StackFrame_GetMethodDescFromNativeIP(LPVOID ip, QCallExceptionStatus* qcallError);
class ILToNativeMapArrays
diff --git a/src/coreclr/vm/eventpipeinternal.cpp b/src/coreclr/vm/eventpipeinternal.cpp
index e981e629055530..5a2dc9933c800c 100644
--- a/src/coreclr/vm/eventpipeinternal.cpp
+++ b/src/coreclr/vm/eventpipeinternal.cpp
@@ -19,7 +19,8 @@ extern "C" UINT64 QCALLTYPE EventPipeInternal_Enable(
EventPipeSerializationFormat format,
UINT32 circularBufferSizeInMB,
/* COR_PRF_EVENTPIPE_PROVIDER_CONFIG */ LPCVOID pProviders,
- UINT32 numProviders)
+ UINT32 numProviders,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -31,6 +32,7 @@ extern "C" UINT64 QCALLTYPE EventPipeInternal_Enable(
numProviders == 0 ||
pProviders == nullptr)
{
+ *qcallError = 0;
return 0;
}
@@ -57,7 +59,7 @@ extern "C" UINT64 QCALLTYPE EventPipeInternal_Enable(
return sessionID;
}
-extern "C" void QCALLTYPE EventPipeInternal_Disable(UINT64 sessionID)
+extern "C" void QCALLTYPE EventPipeInternal_Disable(UINT64 sessionID, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -66,11 +68,12 @@ extern "C" void QCALLTYPE EventPipeInternal_Disable(UINT64 sessionID)
END_QCALL;
}
-extern "C" BOOL QCALLTYPE EventPipeInternal_GetSessionInfo(UINT64 sessionID, EventPipeSessionInfo *pSessionInfo)
+extern "C" BOOL QCALLTYPE EventPipeInternal_GetSessionInfo(UINT64 sessionID, EventPipeSessionInfo *pSessionInfo, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
bool retVal = false;
+
BEGIN_QCALL;
if (pSessionInfo != NULL)
@@ -92,7 +95,8 @@ extern "C" BOOL QCALLTYPE EventPipeInternal_GetSessionInfo(UINT64 sessionID, Eve
extern "C" INT_PTR QCALLTYPE EventPipeInternal_CreateProvider(
_In_z_ LPCWSTR providerName,
EventPipeCallback pCallbackFunc,
- void* pCallbackContext)
+ void* pCallbackContext,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -114,7 +118,8 @@ extern "C" INT_PTR QCALLTYPE EventPipeInternal_DefineEvent(
UINT32 eventVersion,
UINT32 level,
void *pMetadata,
- UINT32 metadataLength)
+ UINT32 metadataLength,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -132,7 +137,7 @@ extern "C" INT_PTR QCALLTYPE EventPipeInternal_DefineEvent(
return reinterpret_cast(pEvent);
}
-extern "C" INT_PTR QCALLTYPE EventPipeInternal_GetProvider(_In_z_ LPCWSTR providerName)
+extern "C" INT_PTR QCALLTYPE EventPipeInternal_GetProvider(_In_z_ LPCWSTR providerName, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -147,7 +152,7 @@ extern "C" INT_PTR QCALLTYPE EventPipeInternal_GetProvider(_In_z_ LPCWSTR provid
return reinterpret_cast(pProvider);
}
-extern "C" void QCALLTYPE EventPipeInternal_DeleteProvider(INT_PTR provHandle)
+extern "C" void QCALLTYPE EventPipeInternal_DeleteProvider(INT_PTR provHandle, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -161,7 +166,7 @@ extern "C" void QCALLTYPE EventPipeInternal_DeleteProvider(INT_PTR provHandle)
END_QCALL;
}
-extern "C" int QCALLTYPE EventPipeInternal_EventActivityIdControl(uint32_t controlCode, GUID *pActivityId)
+extern "C" int QCALLTYPE EventPipeInternal_EventActivityIdControl(uint32_t controlCode, GUID *pActivityId, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -224,7 +229,8 @@ extern "C" void QCALLTYPE EventPipeInternal_WriteEventData(
EventData *pEventData,
UINT32 eventDataCount,
LPCGUID pActivityId,
- LPCGUID pRelatedActivityId)
+ LPCGUID pRelatedActivityId,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -236,7 +242,7 @@ extern "C" void QCALLTYPE EventPipeInternal_WriteEventData(
END_QCALL;
}
-extern "C" BOOL QCALLTYPE EventPipeInternal_GetNextEvent(UINT64 sessionID, EventPipeEventInstanceData *pInstance)
+extern "C" BOOL QCALLTYPE EventPipeInternal_GetNextEvent(UINT64 sessionID, EventPipeEventInstanceData *pInstance, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -262,11 +268,12 @@ extern "C" BOOL QCALLTYPE EventPipeInternal_GetNextEvent(UINT64 sessionID, Event
return pNextInstance != NULL;
}
-extern "C" BOOL QCALLTYPE EventPipeInternal_SignalSession(UINT64 sessionID)
+extern "C" BOOL QCALLTYPE EventPipeInternal_SignalSession(UINT64 sessionID, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
bool result = false;
+
BEGIN_QCALL;
result = EventPipeAdapter::SignalSession(sessionID);
@@ -275,11 +282,12 @@ extern "C" BOOL QCALLTYPE EventPipeInternal_SignalSession(UINT64 sessionID)
return result;
}
-extern "C" BOOL QCALLTYPE EventPipeInternal_WaitForSessionSignal(UINT64 sessionID, INT32 timeoutMs)
+extern "C" BOOL QCALLTYPE EventPipeInternal_WaitForSessionSignal(UINT64 sessionID, INT32 timeoutMs, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
bool result = false;
+
BEGIN_QCALL;
result = EventPipeAdapter::WaitForSessionSignal(sessionID, timeoutMs);
diff --git a/src/coreclr/vm/eventpipeinternal.h b/src/coreclr/vm/eventpipeinternal.h
index 24740c821c784c..09cb9acedaca28 100644
--- a/src/coreclr/vm/eventpipeinternal.h
+++ b/src/coreclr/vm/eventpipeinternal.h
@@ -44,19 +44,21 @@ extern "C" UINT64 QCALLTYPE EventPipeInternal_Enable(
EventPipeSerializationFormat format,
UINT32 circularBufferSizeInMB,
/* COR_PRF_EVENTPIPE_PROVIDER_CONFIG */ LPCVOID pProviders,
- UINT32 numProviders);
+ UINT32 numProviders,
+ QCallExceptionStatus* qcallError);
//!
//! Disables the specified session Id.
//!
-extern "C" void QCALLTYPE EventPipeInternal_Disable(UINT64 sessionID);
+extern "C" void QCALLTYPE EventPipeInternal_Disable(UINT64 sessionID, QCallExceptionStatus* qcallError);
-extern "C" BOOL QCALLTYPE EventPipeInternal_GetSessionInfo(UINT64 sessionID, EventPipeSessionInfo *pSessionInfo);
+extern "C" BOOL QCALLTYPE EventPipeInternal_GetSessionInfo(UINT64 sessionID, EventPipeSessionInfo *pSessionInfo, QCallExceptionStatus* qcallError);
extern "C" INT_PTR QCALLTYPE EventPipeInternal_CreateProvider(
_In_z_ LPCWSTR providerName,
EventPipeCallback pCallbackFunc,
- void* pCallbackContext);
+ void* pCallbackContext,
+ QCallExceptionStatus* qcallError);
extern "C" INT_PTR QCALLTYPE EventPipeInternal_DefineEvent(
INT_PTR provHandle,
@@ -65,34 +67,42 @@ extern "C" INT_PTR QCALLTYPE EventPipeInternal_DefineEvent(
UINT32 eventVersion,
UINT32 level,
void *pMetadata,
- UINT32 metadataLength);
+ UINT32 metadataLength,
+ QCallExceptionStatus* qcallError);
extern "C" INT_PTR QCALLTYPE EventPipeInternal_GetProvider(
- _In_z_ LPCWSTR providerName);
+ _In_z_ LPCWSTR providerName,
+ QCallExceptionStatus* qcallError);
extern "C" void QCALLTYPE EventPipeInternal_DeleteProvider(
- INT_PTR provHandle);
+ INT_PTR provHandle,
+ QCallExceptionStatus* qcallError);
extern "C" int QCALLTYPE EventPipeInternal_EventActivityIdControl(
UINT32 controlCode,
- GUID *pActivityId);
+ GUID *pActivityId,
+ QCallExceptionStatus* qcallError);
extern "C" void QCALLTYPE EventPipeInternal_WriteEventData(
INT_PTR eventHandle,
EventData *pEventData,
UINT32 eventDataCount,
- LPCGUID pActivityId, LPCGUID pRelatedActivityId);
+ LPCGUID pActivityId, LPCGUID pRelatedActivityId,
+ QCallExceptionStatus* qcallError);
extern "C" BOOL QCALLTYPE EventPipeInternal_GetNextEvent(
UINT64 sessionID,
- EventPipeEventInstanceData *pInstance);
+ EventPipeEventInstanceData *pInstance,
+ QCallExceptionStatus* qcallError);
extern "C" BOOL QCALLTYPE EventPipeInternal_SignalSession(
- UINT64 sessionID);
+ UINT64 sessionID,
+ QCallExceptionStatus* qcallError);
extern "C" BOOL QCALLTYPE EventPipeInternal_WaitForSessionSignal(
UINT64 sessionID,
- INT32 timeoutMs);
+ INT32 timeoutMs,
+ QCallExceptionStatus* qcallError);
#endif // FEATURE_PERFTRACING
diff --git a/src/coreclr/vm/excep.cpp b/src/coreclr/vm/excep.cpp
index a9d8cee58df64e..dc14556e81a602 100644
--- a/src/coreclr/vm/excep.cpp
+++ b/src/coreclr/vm/excep.cpp
@@ -4718,7 +4718,7 @@ static BOOL GetManagedFormatStringForResourceID(UINT32 resId, SString & converte
//==========================================================================
// Private helper for TypeLoadException.
//==========================================================================
-extern "C" void QCALLTYPE GetTypeLoadExceptionMessage(UINT32 resId, QCall::StringHandleOnStack retString)
+extern "C" void QCALLTYPE GetTypeLoadExceptionMessage(UINT32 resId, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -4737,7 +4737,7 @@ extern "C" void QCALLTYPE GetTypeLoadExceptionMessage(UINT32 resId, QCall::Strin
// Private helper for FileLoadException and FileNotFoundException.
//==========================================================================
-extern "C" void QCALLTYPE GetFileLoadExceptionMessage(UINT32 hr, QCall::StringHandleOnStack retString)
+extern "C" void QCALLTYPE GetFileLoadExceptionMessage(UINT32 hr, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -4753,7 +4753,7 @@ extern "C" void QCALLTYPE GetFileLoadExceptionMessage(UINT32 hr, QCall::StringHa
//==========================================================================
// Private helper for FileLoadException and FileNotFoundException.
//==========================================================================
-extern "C" void QCALLTYPE FileLoadException_GetMessageForHR(UINT32 hresult, QCall::StringHandleOnStack retString)
+extern "C" void QCALLTYPE FileLoadException_GetMessageForHR(UINT32 hresult, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -6575,7 +6575,7 @@ void CLRAddVectoredHandlers(void)
}
//
-// This does the work of the Unwind and Continue Hanlder inside the catch clause of that handler. The stack has not
+// This does the work of the Unwind and Continue Handler inside the catch clause of that handler. The stack has not
// been unwound when this is called. Keep that in mind when deciding where to put new code :)
//
void UnwindAndContinueRethrowHelperInsideCatch(Frame* pEntryFrame, Exception* pException)
@@ -6613,7 +6613,75 @@ void UnwindAndContinueRethrowHelperInsideCatch(Frame* pEntryFrame, Exception* pE
}
//
-// This does the work of the Unwind and Continue Hanlder after the catch clause of that handler. The stack has been
+// This does the work of the Unwind and Continue Handler inside the catch clause of that handler. The stack has not
+// been unwound when this is called. Keep that in mind when deciding where to put new code :)
+//
+void UnwindAndContinueRethrowHelperInsideQCallCatch(
+ Exception* pException,
+ QCallExceptionStatus* pQCallException DEBUG_ARG(Frame* pEntryFrame))
+{
+ STATIC_CONTRACT_NOTHROW;
+ STATIC_CONTRACT_GC_TRIGGERS;
+ STATIC_CONTRACT_MODE_ANY;
+
+ Thread* pThread = GetThread();
+
+ // The native exception unwind can leave stale entries below the current stack pointer
+ // on the Frame chain. Find the first enclosing InlinedCallFrame without inspecting them.
+ Frame* pCurrentSP = static_cast(GetCurrentSP());
+ Frame* pInlinedCallFrame = pThread->GetFrame();
+ while ((pInlinedCallFrame != FRAME_TOP) &&
+ ((pInlinedCallFrame < pCurrentSP) ||
+ (pInlinedCallFrame->GetFrameIdentifier() != FrameIdentifier::InlinedCallFrame)))
+ {
+ pInlinedCallFrame = pInlinedCallFrame->PtrNextFrame();
+ }
+
+ _ASSERTE(pInlinedCallFrame != FRAME_TOP);
+ _ASSERTE(pInlinedCallFrame == pEntryFrame);
+
+ GCX_COOP();
+
+ LOG((LF_EH, LL_INFO1000, "UNWIND_AND_CONTINUE inside catch, unwinding frame chain\n"));
+
+ // This SetFrame is OK because we will not have frames that require ExceptionUnwind in strictly unmanaged EE
+ // code chunks which is all that an UnC handler can guard.
+ //
+ // @todo: we'd rather use UnwindFrameChain, but there is a concern: some of the ExceptionUnwind methods on some
+ // of the Frame types do a great deal of work; load classes, throw exceptions, etc. We need to decide on some
+ // policy here. Do we want to let such functions throw, etc.? Right now, we believe that there are no such
+ // frames on the stack to be unwound, so the SetFrame is alright (see the first comment above.) At the very
+ // least, we should add some way to assert that.
+ pThread->SetFrame(pInlinedCallFrame);
+
+ // Call CLRException::GetThrowableFromException to force us to retrieve the THROWABLE
+ // while we are still within the context of the catch block. This will help diagnose
+ // cases where the last thrown object is NULL.
+ OBJECTREF orThrowable = CLRException::GetThrowableFromException(pException);
+ CONSISTENCY_CHECK(orThrowable != NULL);
+ SetQCallExceptionStatusThrowable(pQCallException, orThrowable);
+
+ // The exception status now owns a handle to the throwable. Release the native
+ // exception and its cached throwable handle, as the normal rethrow path does.
+ Exception::Delete(pException);
+}
+
+#ifdef TARGET_UNIX
+void CaptureQCallExceptionFromPALException(PAL_SEHException& exception, QCallExceptionStatus* pQCallException)
+{
+ STATIC_CONTRACT_NOTHROW;
+ STATIC_CONTRACT_GC_TRIGGERS;
+ STATIC_CONTRACT_MODE_ANY;
+
+ GCX_COOP();
+
+ OBJECTREF throwable = ExInfo::CreateThrowable(exception.GetExceptionRecord(), FALSE);
+ SetQCallExceptionStatusThrowable(pQCallException, throwable);
+}
+#endif
+
+//
+// This does the work of the Unwind and Continue Handler after the catch clause of that handler. The stack has been
// unwound by the time this is called. Keep that in mind when deciding where to put new code :)
//
VOID DECLSPEC_NORETURN UnwindAndContinueRethrowHelperAfterCatch(Frame* pEntryFrame, Exception* pException, bool nativeRethrow)
diff --git a/src/coreclr/vm/exceptionhandling.cpp b/src/coreclr/vm/exceptionhandling.cpp
index 114ba756d11621..e039dc2a146857 100644
--- a/src/coreclr/vm/exceptionhandling.cpp
+++ b/src/coreclr/vm/exceptionhandling.cpp
@@ -3133,13 +3133,13 @@ static TADDR GetSpForDiagnosticReporting(REGDISPLAY *pRD)
#endif
}
-extern "C" void QCALLTYPE AppendExceptionStackFrame(QCall::ObjectHandleOnStack exceptionObj, SIZE_T ip, SIZE_T sp, int flags, ExInfo *pExInfo)
+extern "C" void QCALLTYPE AppendExceptionStackFrame(QCall::ObjectHandleOnStack exceptionObj, SIZE_T ip, SIZE_T sp, int flags, ExInfo *pExInfo, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
- Thread* pThread = GET_THREAD();
+ Thread* pThread = GetThread();
{
GCX_COOP_THREAD_EXISTS(pThread);
@@ -3266,7 +3266,7 @@ void CallCatchFunclet(BYTE* pHandlerIP, REGDISPLAY* pvRegDisplay, ExInfo* exInfo
}
CONTRACTL_END;
- Thread* pThread = GET_THREAD();
+ Thread* pThread = GetThread();
pThread->DecPreventAbort();
exInfo->m_ScannedStackRange.ExtendUpperBound(exInfo->m_frameIter.m_crawl.GetRegisterSet()->SP);
@@ -3456,7 +3456,7 @@ void CallCatchFunclet(BYTE* pHandlerIP, REGDISPLAY* pvRegDisplay, ExInfo* exInfo
void ResumeAtInterceptionLocation(REGDISPLAY* pvRegDisplay)
{
- Thread* pThread = GET_THREAD();
+ Thread* pThread = GetThread();
pThread->DecPreventAbort();
UINT_PTR targetSp = GetSP(pvRegDisplay->pCurrentContext);
@@ -3509,7 +3509,7 @@ void CallFinallyFunclet(BYTE* pHandlerIP, REGDISPLAY* pvRegDisplay, ExInfo* exIn
STATIC_CONTRACT_GC_TRIGGERS;
STATIC_CONTRACT_MODE_COOPERATIVE;
- Thread* pThread = GET_THREAD();
+ Thread* pThread = GetThread();
pThread->DecPreventAbort();
exInfo->m_csfEnclosingClause = CallerStackFrame::FromRegDisplay(exInfo->m_frameIter.m_crawl.GetRegisterSet());
@@ -3530,16 +3530,17 @@ void CallFinallyFunclet(BYTE* pHandlerIP, REGDISPLAY* pvRegDisplay, ExInfo* exIn
exInfo->MakeCallbacksRelatedToHandler(false, pThread, pMD, &exInfo->m_CurrentClause, (DWORD_PTR)pHandlerIP, spForDebugger);
}
-extern "C" CLR_BOOL QCALLTYPE CallFilterFunclet(QCall::ObjectHandleOnStack exceptionObj, BYTE* pFilterIP, REGDISPLAY* pvRegDisplay)
+extern "C" CLR_BOOL QCALLTYPE CallFilterFunclet(QCall::ObjectHandleOnStack exceptionObj, BYTE* pFilterIP, REGDISPLAY* pvRegDisplay, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
DWORD_PTR dwResult = 0;
BEGIN_QCALL;
+
GCX_COOP();
- Thread* pThread = GET_THREAD();
+ Thread* pThread = GetThread();
Frame* pFrame = pThread->GetFrame();
MarkInlinedCallFrameAsEHHelperCall(pFrame);
@@ -3621,7 +3622,7 @@ CLR_BOOL EHEnumNextWorker(EH_CLAUSE_ENUMERATOR* pEHEnum, RhEHClause* pEHClause,
EE_ILEXCEPTION_CLAUSE EHClause;
memset(&EHClause, 0, sizeof(EE_ILEXCEPTION_CLAUSE));
PTR_EXCEPTION_CLAUSE_TOKEN pEHClauseToken = pJitMan->GetNextEHClause(pEHEnum, &EHClause);
- Thread* pThread = GET_THREAD();
+ Thread* pThread = GetThread();
ExInfo* pExInfo = (ExInfo*)pThread->GetExceptionState()->GetCurrentExceptionTracker();
pExInfo->m_CurrentClause = EHClause;
@@ -3698,7 +3699,7 @@ CLR_BOOL EHEnumNextWorker(EH_CLAUSE_ENUMERATOR* pEHEnum, RhEHClause* pEHClause,
return result;
}
-extern "C" CLR_BOOL QCALLTYPE EHEnumNext(EH_CLAUSE_ENUMERATOR* pEHEnum, RhEHClause* pEHClause)
+extern "C" CLR_BOOL QCALLTYPE EHEnumNext(EH_CLAUSE_ENUMERATOR* pEHEnum, RhEHClause* pEHClause, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -3706,7 +3707,7 @@ extern "C" CLR_BOOL QCALLTYPE EHEnumNext(EH_CLAUSE_ENUMERATOR* pEHEnum, RhEHClau
BEGIN_QCALL;
- Thread* pThread = GET_THREAD();
+ Thread* pThread = GetThread();
Frame* pFrame = pThread->GetFrame();
MarkInlinedCallFrameAsEHHelperCall(pFrame);
@@ -3914,7 +3915,7 @@ CLR_BOOL SfiInitWorker(StackFrameIterator* pThis, CONTEXT* pStackwalkCtx, CLR_BO
CONTRACTL_END;
CLR_BOOL result = FALSE;
- Thread* pThread = GET_THREAD();
+ Thread* pThread = GetThread();
ExInfo* pExInfo = (ExInfo*)pThread->GetExceptionState()->GetCurrentExceptionTracker();
Frame* pFrame = pThread->GetFrame();
@@ -4049,14 +4050,15 @@ CLR_BOOL SfiInitWorker(StackFrameIterator* pThis, CONTEXT* pStackwalkCtx, CLR_BO
return result;
}
-extern "C" CLR_BOOL QCALLTYPE SfiInit(StackFrameIterator* pThis, CONTEXT* pStackwalkCtx, CLR_BOOL instructionFault, CLR_BOOL* pfIsExceptionIntercepted)
+extern "C" CLR_BOOL QCALLTYPE SfiInit(StackFrameIterator* pThis, CONTEXT* pStackwalkCtx, CLR_BOOL instructionFault, CLR_BOOL* pfIsExceptionIntercepted, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
CLR_BOOL result = FALSE;
+
BEGIN_QCALL;
- Thread* pThread = GET_THREAD();
+ Thread* pThread = GetThread();
Frame* pFrame = pThread->GetFrame();
MarkInlinedCallFrameAsEHHelperCall(pFrame);
@@ -4096,7 +4098,7 @@ CLR_BOOL SfiNextWorker(StackFrameIterator* pThis, uint* uExCollideClauseIdx, CLR
StackWalkAction retVal = SWA_FAILED;
CLR_BOOL success = FALSE;
- Thread* pThread = GET_THREAD();
+ Thread* pThread = GetThread();
ExInfo* pTopExInfo = (ExInfo*)pThread->GetExceptionState()->GetCurrentExceptionTracker();
Frame* pFrame = pThread->GetFrame();
@@ -4369,7 +4371,7 @@ Exit:;
return success;
}
-extern "C" CLR_BOOL QCALLTYPE SfiNext(StackFrameIterator* pThis, uint* uExCollideClauseIdx, CLR_BOOL* fUnwoundReversePInvoke, CLR_BOOL* pfIsExceptionIntercepted)
+extern "C" CLR_BOOL QCALLTYPE SfiNext(StackFrameIterator* pThis, uint* uExCollideClauseIdx, CLR_BOOL* fUnwoundReversePInvoke, CLR_BOOL* pfIsExceptionIntercepted, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -4377,7 +4379,7 @@ extern "C" CLR_BOOL QCALLTYPE SfiNext(StackFrameIterator* pThis, uint* uExCollid
BEGIN_QCALL;
- Thread* pThread = GET_THREAD();
+ Thread* pThread = GetThread();
Frame* pFrame = pThread->GetFrame();
MarkInlinedCallFrameAsEHHelperCall(pFrame);
diff --git a/src/coreclr/vm/exceptionhandlingqcalls.h b/src/coreclr/vm/exceptionhandlingqcalls.h
index ca0a25826c15d8..ddb20be42aa651 100644
--- a/src/coreclr/vm/exceptionhandlingqcalls.h
+++ b/src/coreclr/vm/exceptionhandlingqcalls.h
@@ -9,12 +9,12 @@ struct ExInfo;
#ifndef DACCESS_COMPILE
-extern "C" CLR_BOOL QCALLTYPE CallFilterFunclet(QCall::ObjectHandleOnStack exceptionObj, BYTE* pFilterP, REGDISPLAY* pvRegDisplay);
-extern "C" void QCALLTYPE AppendExceptionStackFrame(QCall::ObjectHandleOnStack exceptionObj, SIZE_T ip, SIZE_T sp, int flags, ExInfo *pExInfo);
+extern "C" CLR_BOOL QCALLTYPE CallFilterFunclet(QCall::ObjectHandleOnStack exceptionObj, BYTE* pFilterP, REGDISPLAY* pvRegDisplay, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE AppendExceptionStackFrame(QCall::ObjectHandleOnStack exceptionObj, SIZE_T ip, SIZE_T sp, int flags, ExInfo *pExInfo, QCallExceptionStatus* qcallError);
extern "C" CLR_BOOL QCALLTYPE EHEnumInitFromStackFrameIterator(StackFrameIterator *pFrameIter, IJitManager::MethodRegionInfo *pMethodRegionInfo, EH_CLAUSE_ENUMERATOR * pEHEnum);
-extern "C" CLR_BOOL QCALLTYPE EHEnumNext(EH_CLAUSE_ENUMERATOR* pEHEnum, RhEHClause* pEHClause);
-extern "C" CLR_BOOL QCALLTYPE SfiInit(StackFrameIterator* pThis, CONTEXT* pStackwalkCtx, CLR_BOOL instructionFault, CLR_BOOL* pIsExceptionIntercepted);
-extern "C" CLR_BOOL QCALLTYPE SfiNext(StackFrameIterator* pThis, unsigned int* uExCollideClauseIdx, CLR_BOOL* fUnwoundReversePInvoke, CLR_BOOL* pIsExceptionIntercepted);
+extern "C" CLR_BOOL QCALLTYPE EHEnumNext(EH_CLAUSE_ENUMERATOR* pEHEnum, RhEHClause* pEHClause, QCallExceptionStatus* qcallError);
+extern "C" CLR_BOOL QCALLTYPE SfiInit(StackFrameIterator* pThis, CONTEXT* pStackwalkCtx, CLR_BOOL instructionFault, CLR_BOOL* pIsExceptionIntercepted, QCallExceptionStatus* qcallError);
+extern "C" CLR_BOOL QCALLTYPE SfiNext(StackFrameIterator* pThis, unsigned int* uExCollideClauseIdx, CLR_BOOL* fUnwoundReversePInvoke, CLR_BOOL* pIsExceptionIntercepted, QCallExceptionStatus* qcallError);
#endif // DACCESS_COMPILE
#endif // EXCEPTION_HANDLING_QCALLS_H
diff --git a/src/coreclr/vm/exceptmacros.h b/src/coreclr/vm/exceptmacros.h
index 7fea6c62f1ecc9..f6e21f5c8cfcd6 100644
--- a/src/coreclr/vm/exceptmacros.h
+++ b/src/coreclr/vm/exceptmacros.h
@@ -193,6 +193,8 @@ extern LONG InternalUnhandledExceptionFilter_Worker(PEXCEPTION_POINTERS pExcepti
VOID DECLSPEC_NORETURN RaiseTheExceptionInternalOnly(OBJECTREF throwable);
+typedef UINT_PTR QCallExceptionStatus;
+
#if defined(DACCESS_COMPILE)
#define INSTALL_UNWIND_AND_CONTINUE_HANDLER
@@ -202,7 +204,22 @@ VOID DECLSPEC_NORETURN RaiseTheExceptionInternalOnly(OBJECTREF throwable);
#define UNINSTALL_UNWIND_AND_CONTINUE_HANDLER_EX
#else // DACCESS_COMPILE
+constexpr QCallExceptionStatus QCallOutOfMemoryException = 1;
+constexpr QCallExceptionStatus QCallStackOverflowException = 2;
+
+void SetQCallExceptionStatusThrowable(QCallExceptionStatus* pStatus, OBJECTREF throwable);
+
+static_assert(sizeof(QCallExceptionStatus) == sizeof(void*));
+
void UnwindAndContinueRethrowHelperInsideCatch(Frame* pEntryFrame, Exception* pException);
+void UnwindAndContinueRethrowHelperInsideQCallCatch(
+ Exception* pException,
+ QCallExceptionStatus* pQCallException DEBUG_ARG(Frame* pEntryFrame));
+
+#ifdef TARGET_UNIX
+void CaptureQCallExceptionFromPALException(PAL_SEHException& exception, QCallExceptionStatus* pQCallException);
+#endif
+
VOID DECLSPEC_NORETURN UnwindAndContinueRethrowHelperAfterCatch(Frame* pEntryFrame, Exception* pException, bool nativeRethrow);
#ifdef FEATURE_INTERPRETER
@@ -318,6 +335,35 @@ VOID DECLSPEC_NORETURN DispatchManagedException(PAL_SEHException& ex, bool isHar
UNREACHABLE(); \
}
+
+#define INSTALL_MANAGED_EXCEPTION_CAPTURE_DISPATCHER \
+ { \
+ INDEBUG(MAKE_CURRENT_THREAD_AVAILABLE();) \
+ INDEBUG(Frame* __pUnCEntryFrame = CURRENT_THREAD->GetFrame();) \
+ _ASSERTE(__pUnCEntryFrame->GetFrameIdentifier() == FrameIdentifier::InlinedCallFrame); \
+ PAL_CPP_TRY {
+
+#define UNINSTALL_MANAGED_EXCEPTION_CAPTURE_DISPATCHER \
+ } \
+ PAL_CPP_CATCH_NON_DERIVED (PAL_SEHException&, ex) \
+ { \
+ _ASSERTE(CURRENT_THREAD->GetFrame() == __pUnCEntryFrame); \
+ _ASSERTE(CURRENT_THREAD->GetFrame()->GetFrameIdentifier() == FrameIdentifier::InlinedCallFrame); \
+ CaptureQCallExceptionFromPALException(ex, qcallError); \
+ } \
+ PAL_CPP_CATCH_NON_DERIVED_NOARG (const std::bad_alloc&) \
+ { \
+ UnwindAndContinueRethrowHelperInsideQCallCatch(Exception::GetOOMException(), qcallError DEBUG_ARG(__pUnCEntryFrame)); \
+ } \
+ PAL_CPP_CATCH_DERIVED (Exception, __pException) \
+ { \
+ CONSISTENCY_CHECK(NULL != __pException); \
+ UnwindAndContinueRethrowHelperInsideQCallCatch(__pException, qcallError DEBUG_ARG(__pUnCEntryFrame)); \
+ } \
+ PAL_CPP_ENDTRY \
+ }
+
+
#elif defined(TARGET_X86) && defined(TARGET_WINDOWS)
#define INSTALL_MANAGED_EXCEPTION_DISPATCHER
@@ -404,6 +450,35 @@ VOID DECLSPEC_NORETURN DispatchManagedException(PAL_SEHException& ex, bool isHar
#define UNINSTALL_UNWIND_AND_CONTINUE_HANDLER \
UNINSTALL_UNWIND_AND_CONTINUE_HANDLER_EX(false);
+
+#if !defined(TARGET_UNIX)
+ // The Windows implementation of the INSTALL_MANAGED_EXCEPTION_CAPTURE_DISPATCHER is very similar
+ // to the unix one, but the major distinction is that the Windows version allows for an existing
+ // eh which has been converted into SEH, to flow directly into managed code. The unix version
+ // catches the PAL_SEHException and converts it into a managed exception before it hits managed code.
+
+#define INSTALL_MANAGED_EXCEPTION_CAPTURE_DISPATCHER \
+ { \
+ INDEBUG(MAKE_CURRENT_THREAD_AVAILABLE();) \
+ INDEBUG(Frame* __pUnCEntryFrame = CURRENT_THREAD->GetFrame();) \
+ _ASSERTE(__pUnCEntryFrame->GetFrameIdentifier() == FrameIdentifier::InlinedCallFrame); \
+ PAL_CPP_TRY {
+
+#define UNINSTALL_MANAGED_EXCEPTION_CAPTURE_DISPATCHER \
+ } \
+ PAL_CPP_CATCH_NON_DERIVED_NOARG (const std::bad_alloc&) \
+ { \
+ UnwindAndContinueRethrowHelperInsideQCallCatch(Exception::GetOOMException(), qcallError DEBUG_ARG(__pUnCEntryFrame)); \
+ } \
+ PAL_CPP_CATCH_DERIVED (Exception, __pException) \
+ { \
+ CONSISTENCY_CHECK(NULL != __pException); \
+ UnwindAndContinueRethrowHelperInsideQCallCatch(__pException, qcallError DEBUG_ARG(__pUnCEntryFrame)); \
+ } \
+ PAL_CPP_ENDTRY \
+ }
+#endif
+
#endif // DACCESS_COMPILE
diff --git a/src/coreclr/vm/finalizerthread.cpp b/src/coreclr/vm/finalizerthread.cpp
index 56db5891234347..67aa221972e19c 100644
--- a/src/coreclr/vm/finalizerthread.cpp
+++ b/src/coreclr/vm/finalizerthread.cpp
@@ -87,7 +87,7 @@ extern "C" void SystemJS_ExecuteFinalizationCallback()
RunFinalizerIterationOnCurrentThread();
}
#else // TARGET_WASI
-extern "C" void QCALLTYPE WasiFinalizer_RunWorker()
+extern "C" void QCALLTYPE WasiFinalizer_RunWorker(QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -128,11 +128,13 @@ extern "C" void WasiFinalizer_Schedule()
s_finalizationPending = true;
}
-extern "C" CLR_BOOL QCALLTYPE WasiFinalizer_TryClearPending()
+extern "C" CLR_BOOL QCALLTYPE WasiFinalizer_TryClearPending(QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
CLR_BOOL pending = FALSE;
+
BEGIN_QCALL;
+
// Volatile load + clear. Single-threaded WASI: no atomic swap needed.
pending = s_finalizationPending ? TRUE : FALSE;
if (pending)
diff --git a/src/coreclr/vm/ilmarshalers.cpp b/src/coreclr/vm/ilmarshalers.cpp
index bdb01098a96b94..5bc11efd47995e 100644
--- a/src/coreclr/vm/ilmarshalers.cpp
+++ b/src/coreclr/vm/ilmarshalers.cpp
@@ -4761,7 +4761,7 @@ extern "C" void QCALLTYPE MngdSafeArrayMarshaler_CreateMarshaler(MngdSafeArrayMa
pThis->m_pConvertContentsToManagedCode = pConvertToManaged;
}
-extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertSpaceToNative(MngdSafeArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void** pNativeHome)
+extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertSpaceToNative(MngdSafeArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void** pNativeHome, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -4772,7 +4772,10 @@ extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertSpaceToNative(MngdSafeAr
CONTRACTL_END;
if (pThis->m_fStatic & MngdSafeArrayMarshaler::SCSF_IsStatic)
+ {
+ *qcallError = 0;
return;
+ }
BEGIN_QCALL;
@@ -4796,7 +4799,7 @@ extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertSpaceToNative(MngdSafeAr
END_QCALL;
}
-extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertContentsToNative(MngdSafeArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void** pNativeHome, QCall::ObjectHandleOnStack pOriginalManaged)
+extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertContentsToNative(MngdSafeArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void** pNativeHome, QCall::ObjectHandleOnStack pOriginalManaged, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -4839,7 +4842,7 @@ extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertContentsToNative(MngdSaf
END_QCALL;
}
-extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertSpaceToManaged(MngdSafeArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void** pNativeHome)
+extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertSpaceToManaged(MngdSafeArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void** pNativeHome, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -4896,7 +4899,7 @@ extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertSpaceToManaged(MngdSafeA
END_QCALL;
}
-extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertContentsToManaged(MngdSafeArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void** pNativeHome)
+extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertContentsToManaged(MngdSafeArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void** pNativeHome, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -4933,12 +4936,15 @@ extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertContentsToManaged(MngdSa
END_QCALL;
}
-extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ClearNative(MngdSafeArrayMarshaler* pThis, void** pNativeHome)
+extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ClearNative(MngdSafeArrayMarshaler* pThis, void** pNativeHome, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
if (pThis->m_fStatic & MngdSafeArrayMarshaler::SCSF_IsStatic)
+ {
+ *qcallError = 0;
return;
+ }
BEGIN_QCALL;
@@ -4983,4 +4989,3 @@ void ILReferenceCustomMarshaler::EmitCreateMngdMarshaler(ILCodeStream* pslILEmit
pslILEmit->EmitSTLOC(m_dwMngdMarshalerLocalNum); // Store the ICustomMarshaler as our marshaler state
}
-
diff --git a/src/coreclr/vm/ilmarshalers.h b/src/coreclr/vm/ilmarshalers.h
index 566b7bb886a795..523a7e5ea87e0d 100644
--- a/src/coreclr/vm/ilmarshalers.h
+++ b/src/coreclr/vm/ilmarshalers.h
@@ -3465,11 +3465,11 @@ class MngdSafeArrayMarshaler
};
extern "C" void QCALLTYPE MngdSafeArrayMarshaler_CreateMarshaler(MngdSafeArrayMarshaler* pThis, MethodTable* pMT, UINT32 iRank, UINT32 dwFlags, PCODE pConvertToNative, PCODE pConvertToManaged);
-extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertSpaceToNative(MngdSafeArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void** pNativeHome);
-extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertContentsToNative(MngdSafeArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void** pNativeHome, QCall::ObjectHandleOnStack pOriginalManaged);
-extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertSpaceToManaged(MngdSafeArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void** pNativeHome);
-extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertContentsToManaged(MngdSafeArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void** pNativeHome);
-extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ClearNative(MngdSafeArrayMarshaler* pThis, void** pNativeHome);
+extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertSpaceToNative(MngdSafeArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void** pNativeHome, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertContentsToNative(MngdSafeArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void** pNativeHome, QCall::ObjectHandleOnStack pOriginalManaged, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertSpaceToManaged(MngdSafeArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void** pNativeHome, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ConvertContentsToManaged(MngdSafeArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void** pNativeHome, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE MngdSafeArrayMarshaler_ClearNative(MngdSafeArrayMarshaler* pThis, void** pNativeHome, QCallExceptionStatus* qcallError);
#endif // FEATURE_COMINTEROP
class ILReferenceCustomMarshaler : public ILMngdMarshaler
diff --git a/src/coreclr/vm/interoplibinterface.h b/src/coreclr/vm/interoplibinterface.h
index 18e8944a3a1fdb..c9da0f7eaeeef3 100644
--- a/src/coreclr/vm/interoplibinterface.h
+++ b/src/coreclr/vm/interoplibinterface.h
@@ -71,9 +71,10 @@ extern "C" BOOL QCALLTYPE ObjCMarshal_TryInitializeReferenceTracker(
_In_ ObjCMarshalNative::BeginEndCallback beginEndCallback,
_In_ ObjCMarshalNative::IsReferencedCallback isReferencedCallback,
_In_ ObjCMarshalNative::EnteredFinalizationCallback trackedObjectEnteredFinalization,
- _In_ QCall::ObjectHandleOnStack objectTrackingInfoTable);
+ _In_ QCall::ObjectHandleOnStack objectTrackingInfoTable,
+ QCallExceptionStatus* qcallError);
-extern "C" void* QCALLTYPE ObjCMarshal_AllocateReferenceTrackingHandle(_In_ QCall::ObjectHandleOnStack obj);
+extern "C" void* QCALLTYPE ObjCMarshal_AllocateReferenceTrackingHandle(_In_ QCall::ObjectHandleOnStack obj, QCallExceptionStatus* qcallError);
extern "C" void QCALLTYPE ObjCMarshal_GetOrCreateReferenceTrackingMemory(
_In_ QCall::ObjectHandleOnStack obj,
@@ -82,7 +83,8 @@ extern "C" void QCALLTYPE ObjCMarshal_GetOrCreateReferenceTrackingMemory(
extern "C" BOOL QCALLTYPE ObjCMarshal_TrySetGlobalMessageSendCallback(
_In_ ObjCMarshalNative::MessageSendFunction msgSendFunction,
- _In_ void* fptr);
+ _In_ void* fptr,
+ QCallExceptionStatus* qcallError);
#endif // FEATURE_OBJCMARSHAL
@@ -95,16 +97,19 @@ class JavaNative
};
extern "C" BOOL QCALLTYPE JavaMarshal_Initialize(
- _In_ void* markCrossReferences);
+ _In_ void* markCrossReferences,
+ QCallExceptionStatus* qcallError);
extern "C" void* QCALLTYPE JavaMarshal_CreateReferenceTrackingHandle(
_In_ QCall::ObjectHandleOnStack obj,
- _In_ void* context);
+ _In_ void* context,
+ QCallExceptionStatus* qcallError);
extern "C" void QCALLTYPE JavaMarshal_FinishCrossReferenceProcessing(
_In_ MarkCrossReferencesArgs *crossReferences,
_In_ size_t length,
- _In_ void* unreachableObjectHandles);
+ _In_ void* unreachableObjectHandles,
+ QCallExceptionStatus* qcallError);
extern "C" BOOL QCALLTYPE JavaMarshal_GetContext(
_In_ OBJECTHANDLE handle,
diff --git a/src/coreclr/vm/interoplibinterface_comwrappers.cpp b/src/coreclr/vm/interoplibinterface_comwrappers.cpp
index 0d7eddb9b195fc..1666f2f33ad9d6 100644
--- a/src/coreclr/vm/interoplibinterface_comwrappers.cpp
+++ b/src/coreclr/vm/interoplibinterface_comwrappers.cpp
@@ -112,7 +112,7 @@ bool GlobalComWrappersForMarshalling::TryGetOrCreateObjectForComInstance(
return obj != NULL;
}
-extern "C" void* QCALLTYPE ComWrappers_AllocateRefCountedHandle(_In_ QCall::ObjectHandleOnStack obj)
+extern "C" void* QCALLTYPE ComWrappers_AllocateRefCountedHandle(_In_ QCall::ObjectHandleOnStack obj, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -567,7 +567,7 @@ void ComWrappersNative::OnAfterGCScanRoots()
(void)InteropLib::Com::DetachNonPromotedObjects(&cxt);
}
-extern "C" void QCALLTYPE ComWrappers_RegisterIsRootedCallback()
+extern "C" void QCALLTYPE ComWrappers_RegisterIsRootedCallback(QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -579,7 +579,7 @@ extern "C" void QCALLTYPE ComWrappers_RegisterIsRootedCallback()
END_QCALL;
}
-extern "C" void QCALLTYPE TrackerObjectManager_RegisterNativeObjectWrapperCache(_In_ QCall::ObjectHandleOnStack cache)
+extern "C" void QCALLTYPE TrackerObjectManager_RegisterNativeObjectWrapperCache(_In_ QCall::ObjectHandleOnStack cache, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
diff --git a/src/coreclr/vm/interoplibinterface_comwrappers.h b/src/coreclr/vm/interoplibinterface_comwrappers.h
index 205456136b9d6b..61e414b1389f78 100644
--- a/src/coreclr/vm/interoplibinterface_comwrappers.h
+++ b/src/coreclr/vm/interoplibinterface_comwrappers.h
@@ -34,19 +34,19 @@ extern "C" void QCALLTYPE ComWrappers_GetIUnknownImpl(
extern "C" void* QCALLTYPE ComWrappers_GetUntrackedAddRefRelease();
-extern "C" void* QCALLTYPE ComWrappers_AllocateRefCountedHandle(_In_ QCall::ObjectHandleOnStack obj);
+extern "C" void* QCALLTYPE ComWrappers_AllocateRefCountedHandle(_In_ QCall::ObjectHandleOnStack obj, QCallExceptionStatus* qcallError);
extern "C" void const* QCALLTYPE ComWrappers_GetIReferenceTrackerTargetVftbl();
extern "C" void const* QCALLTYPE ComWrappers_GetTaggedImpl();
-extern "C" void QCALLTYPE ComWrappers_RegisterIsRootedCallback();
+extern "C" void QCALLTYPE ComWrappers_RegisterIsRootedCallback(QCallExceptionStatus* qcallError);
extern "C" CLR_BOOL QCALLTYPE TrackerObjectManager_HasReferenceTrackerManager();
extern "C" CLR_BOOL QCALLTYPE TrackerObjectManager_TryRegisterReferenceTrackerManager(_In_ void* manager);
-extern "C" void QCALLTYPE TrackerObjectManager_RegisterNativeObjectWrapperCache(_In_ QCall::ObjectHandleOnStack cache);
+extern "C" void QCALLTYPE TrackerObjectManager_RegisterNativeObjectWrapperCache(_In_ QCall::ObjectHandleOnStack cache, QCallExceptionStatus* qcallError);
extern "C" CLR_BOOL QCALLTYPE TrackerObjectManager_IsGlobalPeggingEnabled();
diff --git a/src/coreclr/vm/interoplibinterface_java.cpp b/src/coreclr/vm/interoplibinterface_java.cpp
index e4f1f07f11997b..59784c08d20192 100644
--- a/src/coreclr/vm/interoplibinterface_java.cpp
+++ b/src/coreclr/vm/interoplibinterface_java.cpp
@@ -135,7 +135,8 @@ void Interop::FinishCrossReferenceProcessing(
}
extern "C" BOOL QCALLTYPE JavaMarshal_Initialize(
- _In_ void* markCrossReferences)
+ _In_ void* markCrossReferences,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
_ASSERTE(markCrossReferences != NULL);
@@ -164,7 +165,8 @@ extern "C" BOOL QCALLTYPE JavaMarshal_Initialize(
extern "C" void* QCALLTYPE JavaMarshal_CreateReferenceTrackingHandle(
_In_ QCall::ObjectHandleOnStack obj,
- _In_ void* context)
+ _In_ void* context,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -183,7 +185,8 @@ extern "C" void* QCALLTYPE JavaMarshal_CreateReferenceTrackingHandle(
extern "C" void QCALLTYPE JavaMarshal_FinishCrossReferenceProcessing(
_In_ MarkCrossReferencesArgs *crossReferences,
_In_ size_t length,
- _In_ void* unreachableObjectHandles)
+ _In_ void* unreachableObjectHandles,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
_ASSERTE(crossReferences->ComponentCount >= 0);
diff --git a/src/coreclr/vm/interoplibinterface_objc.cpp b/src/coreclr/vm/interoplibinterface_objc.cpp
index 924cca2c031f6a..18330649847af3 100644
--- a/src/coreclr/vm/interoplibinterface_objc.cpp
+++ b/src/coreclr/vm/interoplibinterface_objc.cpp
@@ -28,7 +28,8 @@ extern "C" BOOL QCALLTYPE ObjCMarshal_TryInitializeReferenceTracker(
_In_ ObjCMarshalNative::BeginEndCallback beginEndCallback,
_In_ ObjCMarshalNative::IsReferencedCallback isReferencedCallback,
_In_ ObjCMarshalNative::EnteredFinalizationCallback trackedObjectEnteredFinalization,
- _In_ QCall::ObjectHandleOnStack objectTrackingInfoTable)
+ _In_ QCall::ObjectHandleOnStack objectTrackingInfoTable,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
_ASSERTE(beginEndCallback != NULL
@@ -60,7 +61,7 @@ extern "C" BOOL QCALLTYPE ObjCMarshal_TryInitializeReferenceTracker(
return success;
}
-extern "C" void* QCALLTYPE ObjCMarshal_AllocateReferenceTrackingHandle(_In_ QCall::ObjectHandleOnStack obj)
+extern "C" void* QCALLTYPE ObjCMarshal_AllocateReferenceTrackingHandle(_In_ QCall::ObjectHandleOnStack obj, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -121,7 +122,8 @@ namespace
extern "C" BOOL QCALLTYPE ObjCMarshal_TrySetGlobalMessageSendCallback(
_In_ ObjCMarshalNative::MessageSendFunction msgSendFunction,
- _In_ void* fptr)
+ _In_ void* fptr,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
diff --git a/src/coreclr/vm/jithelpers.cpp b/src/coreclr/vm/jithelpers.cpp
index cb33a1e47cebc1..3075ed58850c7b 100644
--- a/src/coreclr/vm/jithelpers.cpp
+++ b/src/coreclr/vm/jithelpers.cpp
@@ -245,7 +245,7 @@ HCIMPLEND
#include
// Helper for the managed InitClass implementations
-extern "C" void QCALLTYPE InitClassHelper(MethodTable* pMT)
+extern "C" void QCALLTYPE InitClassHelper(MethodTable* pMT, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -318,7 +318,7 @@ __declspec(selectany)
#endif // _MSC_VER
PLATFORM_THREAD_LOCAL ThreadLocalData t_ThreadStatics;
-extern "C" void QCALLTYPE GetThreadStaticsByMethodTable(QCall::ByteRefOnStack refHandle, MethodTable* pMT, BOOL gcStatic)
+extern "C" void QCALLTYPE GetThreadStaticsByMethodTable(QCall::ByteRefOnStack refHandle, MethodTable* pMT, BOOL gcStatic, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -339,7 +339,7 @@ extern "C" void QCALLTYPE GetThreadStaticsByMethodTable(QCall::ByteRefOnStack re
END_QCALL;
}
-extern "C" void QCALLTYPE GetThreadStaticsByIndex(QCall::ByteRefOnStack refHandle, uint32_t staticBlockIndex, BOOL gcStatic)
+extern "C" void QCALLTYPE GetThreadStaticsByIndex(QCall::ByteRefOnStack refHandle, uint32_t staticBlockIndex, BOOL gcStatic, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -473,9 +473,10 @@ BOOL ObjIsInstanceOf(Object* pObject, TypeHandle toTypeHnd, BOOL throwCastExcept
return ObjIsInstanceOfCore(pObject, toTypeHnd, throwCastException);
}
-extern "C" BOOL QCALLTYPE IsInstanceOf_NoCacheLookup(EnregisteredTypeHandle type, BOOL throwCastException, QCall::ObjectHandleOnStack objOnStack)
+extern "C" BOOL QCALLTYPE IsInstanceOf_NoCacheLookup(EnregisteredTypeHandle type, BOOL throwCastException, QCall::ObjectHandleOnStack objOnStack, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
+
BOOL result = FALSE;
BEGIN_QCALL;
@@ -502,7 +503,7 @@ HCIMPL2(BOOL, JIT_IsInstanceOfException, EnregisteredTypeHandle type, Object* ob
}
HCIMPLEND
-extern "C" void QCALLTYPE ThrowInvalidCastException(EnregisteredTypeHandle pSourceType, EnregisteredTypeHandle pTargetType)
+extern "C" void QCALLTYPE ThrowInvalidCastException(EnregisteredTypeHandle pSourceType, EnregisteredTypeHandle pTargetType, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -600,7 +601,7 @@ DictionaryEntry GenericHandleWorkerCore(MethodDesc * pMD, MethodTable * pMT, LPV
return result;
}
-extern "C" void* QCALLTYPE GenericHandleWorker(MethodDesc * pMD, MethodTable * pMT, LPVOID signature, DWORD dictionaryIndexAndSlot, Module* pModule)
+extern "C" void* QCALLTYPE GenericHandleWorker(MethodDesc * pMD, MethodTable * pMT, LPVOID signature, DWORD dictionaryIndexAndSlot, Module* pModule, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -675,7 +676,8 @@ void FlushVirtualFunctionPointerCaches()
// slow helper to call from the fast one
extern "C" PCODE QCALLTYPE ResolveVirtualFunctionPointer(QCall::ObjectHandleOnStack obj,
EnregisteredTypeHandle classHnd,
- MethodDesc* pStaticMD)
+ MethodDesc* pStaticMD,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1133,12 +1135,15 @@ NOINLINE void JIT_PInvokeEndRarePath()
// or ThreadAbort is requested. This means that the pinvoke frame is still on the stack and
// enabled, but the thread has been marked as returning to cooperative mode. Thus we can
// use that frame to provide GC suspension safety, but we need to manually call EnablePreemptiveGC
- // and DisablePreemptiveGC to put the function in a state where the BEGIN_QCALL/END_QCALL macros
- // will work correctly.
+ // and DisablePreemptiveGC around the exception dispatch handlers.
thread->EnablePreemptiveGC();
- BEGIN_QCALL;
+ INSTALL_RESUME_AFTER_CATCH_HANDLER_WITH_FRAME(GetThread()->GetFrame())
+ INSTALL_MANAGED_EXCEPTION_DISPATCHER
+ INSTALL_UNWIND_AND_CONTINUE_HANDLER
thread->HandleThreadAbort();
- END_QCALL;
+ UNINSTALL_UNWIND_AND_CONTINUE_HANDLER
+ UNINSTALL_MANAGED_EXCEPTION_DISPATCHER
+ UNINSTALL_RESUME_AFTER_CATCH_HANDLER_WITH_FRAME
thread->DisablePreemptiveGC();
}
@@ -1162,7 +1167,7 @@ void JIT_RareDisableHelperWorker()
void JIT_RareDisableHelper()
#endif
{
- // We do this here (before we enter the BEGIN_QCALL macro), because the following scenario
+ // We do this before installing the exception handlers because of the following scenario.
// We are in the process of doing an inlined pinvoke. Since we are in preemtive
// mode, the thread is allowed to continue. The thread continues and gets a context
// switch just after it has cleared the preemptive mode bit but before it gets
@@ -1194,12 +1199,15 @@ void JIT_RareDisableHelper()
// or ThreadAbort is requested. This means that the pinvoke frame is still on the stack and
// enabled, but the thread has been marked as returning to cooperative mode. Thus we can
// use that frame to provide GC suspension safety, but we need to manually call EnablePreemptiveGC
- // and DisablePreemptiveGC to put the function in a state where the BEGIN_QCALL/END_QCALL macros
- // will work correctly.
+ // and DisablePreemptiveGC around the exception dispatch handlers.
thread->EnablePreemptiveGC();
- BEGIN_QCALL;
+ INSTALL_RESUME_AFTER_CATCH_HANDLER_WITH_FRAME(GetThread()->GetFrame())
+ INSTALL_MANAGED_EXCEPTION_DISPATCHER
+ INSTALL_UNWIND_AND_CONTINUE_HANDLER
thread->HandleThreadAbort();
- END_QCALL;
+ UNINSTALL_UNWIND_AND_CONTINUE_HANDLER
+ UNINSTALL_MANAGED_EXCEPTION_DISPATCHER
+ UNINSTALL_RESUME_AFTER_CATCH_HANDLER_WITH_FRAME
thread->DisablePreemptiveGC();
}
}
diff --git a/src/coreclr/vm/loaderallocator.cpp b/src/coreclr/vm/loaderallocator.cpp
index 171e857208b4ae..656a9b21624f18 100644
--- a/src/coreclr/vm/loaderallocator.cpp
+++ b/src/coreclr/vm/loaderallocator.cpp
@@ -757,7 +757,7 @@ BOOL LoaderAllocator::Destroy(QCall::LoaderAllocatorHandle pLoaderAllocator)
return FALSE;
} // LoaderAllocator::Destroy
-extern "C" BOOL QCALLTYPE LoaderAllocator_Destroy(QCall::LoaderAllocatorHandle pLoaderAllocator)
+extern "C" BOOL QCALLTYPE LoaderAllocator_Destroy(QCall::LoaderAllocatorHandle pLoaderAllocator, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
diff --git a/src/coreclr/vm/loaderallocator.hpp b/src/coreclr/vm/loaderallocator.hpp
index 0ddffcd79ec57f..5c717beebad038 100644
--- a/src/coreclr/vm/loaderallocator.hpp
+++ b/src/coreclr/vm/loaderallocator.hpp
@@ -960,7 +960,7 @@ struct cdac_data
typedef VPTR(LoaderAllocator) PTR_LoaderAllocator;
-extern "C" BOOL QCALLTYPE LoaderAllocator_Destroy(QCall::LoaderAllocatorHandle pLoaderAllocator);
+extern "C" BOOL QCALLTYPE LoaderAllocator_Destroy(QCall::LoaderAllocatorHandle pLoaderAllocator, QCallExceptionStatus* qcallError);
class GlobalLoaderAllocator : public LoaderAllocator
{
diff --git a/src/coreclr/vm/managedmdimport.cpp b/src/coreclr/vm/managedmdimport.cpp
index 864f0bec4fa00e..e83ccc2ae32517 100644
--- a/src/coreclr/vm/managedmdimport.cpp
+++ b/src/coreclr/vm/managedmdimport.cpp
@@ -539,7 +539,8 @@ extern "C" void QCALLTYPE MetadataImport_Enum(
mdToken tkParent,
/* in/out */ INT32* length,
INT32* shortResult,
- QCall::ObjectHandleOnStack longResult)
+ QCall::ObjectHandleOnStack longResult,
+ QCallExceptionStatus* qcallError)
{
CONTRACTL
{
diff --git a/src/coreclr/vm/managedmdimport.hpp b/src/coreclr/vm/managedmdimport.hpp
index aae7563b71edad..b0d8fcf67f1ee6 100644
--- a/src/coreclr/vm/managedmdimport.hpp
+++ b/src/coreclr/vm/managedmdimport.hpp
@@ -78,6 +78,7 @@ extern "C" void QCALLTYPE MetadataImport_Enum(
mdToken tkParent,
INT32* length,
INT32* shortResult,
- QCall::ObjectHandleOnStack longResult);
+ QCall::ObjectHandleOnStack longResult,
+ QCallExceptionStatus* qcallError);
#endif
diff --git a/src/coreclr/vm/marshalnative.cpp b/src/coreclr/vm/marshalnative.cpp
index de5285443fcd23..44fbaaac59f847 100644
--- a/src/coreclr/vm/marshalnative.cpp
+++ b/src/coreclr/vm/marshalnative.cpp
@@ -50,7 +50,7 @@
// Prelink
// Does advance loading of an PInvoke library
-extern "C" VOID QCALLTYPE MarshalNative_Prelink(MethodDesc * pMD)
+extern "C" VOID QCALLTYPE MarshalNative_Prelink(MethodDesc * pMD, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -60,11 +60,17 @@ extern "C" VOID QCALLTYPE MarshalNative_Prelink(MethodDesc * pMD)
// If the code is already ready, we are done. Else, we need to execute the prestub
// This is a perf thing since it's always safe to execute the prestub twice.
if (!pMD->ShouldCallPrestub())
+ {
+ *qcallError = 0;
return;
+ }
// Silently ignore if not PInvoke and not runtime generated.
if (!(pMD->IsPInvoke()) && !(pMD->IsRuntimeSupplied()))
+ {
+ *qcallError = 0;
return;
+ }
BEGIN_QCALL;
@@ -77,7 +83,7 @@ extern "C" VOID QCALLTYPE MarshalNative_Prelink(MethodDesc * pMD)
// IsBuiltInComSupported
// Built-in COM support is only checked from the native side to ensure the runtime
// is in a consistent state
-extern "C" BOOL QCALLTYPE MarshalNative_IsBuiltInComSupported()
+extern "C" BOOL QCALLTYPE MarshalNative_IsBuiltInComSupported(QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -96,7 +102,7 @@ extern "C" BOOL QCALLTYPE MarshalNative_IsBuiltInComSupported()
return ret;
}
-extern "C" BOOL QCALLTYPE MarshalNative_HasLayout(QCall::TypeHandle t, BOOL* pIsBlittable, DWORD* pNativeSize)
+extern "C" BOOL QCALLTYPE MarshalNative_HasLayout(QCall::TypeHandle t, BOOL* pIsBlittable, DWORD* pNativeSize, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -133,7 +139,7 @@ extern "C" BOOL QCALLTYPE MarshalNative_HasLayout(QCall::TypeHandle t, BOOL* pIs
/************************************************************************
* PInvoke.SizeOf(Class)
*/
-extern "C" INT32 QCALLTYPE MarshalNative_SizeOfHelper(QCall::TypeHandle t, BOOL throwIfNotMarshalable)
+extern "C" INT32 QCALLTYPE MarshalNative_SizeOfHelper(QCall::TypeHandle t, BOOL throwIfNotMarshalable, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -163,7 +169,7 @@ extern "C" INT32 QCALLTYPE MarshalNative_SizeOfHelper(QCall::TypeHandle t, BOOL
return rv;
}
-extern "C" SIZE_T QCALLTYPE MarshalNative_OffsetOf(FieldDesc* pFD)
+extern "C" SIZE_T QCALLTYPE MarshalNative_OffsetOf(FieldDesc* pFD, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -215,7 +221,7 @@ extern "C" SIZE_T QCALLTYPE MarshalNative_OffsetOf(FieldDesc* pFD)
return offset;
}
-extern "C" void QCALLTYPE MarshalNative_GetDelegateForFunctionPointerInternal(PVOID FPtr, QCall::TypeHandle t, QCall::ObjectHandleOnStack retDelegate)
+extern "C" void QCALLTYPE MarshalNative_GetDelegateForFunctionPointerInternal(PVOID FPtr, QCall::TypeHandle t, QCall::ObjectHandleOnStack retDelegate, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -232,7 +238,7 @@ extern "C" void QCALLTYPE MarshalNative_GetDelegateForFunctionPointerInternal(PV
END_QCALL;
}
-extern "C" PVOID QCALLTYPE MarshalNative_GetFunctionPointerForDelegateInternal(QCall::ObjectHandleOnStack d)
+extern "C" PVOID QCALLTYPE MarshalNative_GetFunctionPointerForDelegateInternal(QCall::ObjectHandleOnStack d, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -261,15 +267,7 @@ extern "C" IsInCooperativeGCMode_fn QCALLTYPE MarshalNative_GetIsInCooperativeGC
{
QCALL_CONTRACT;
- IsInCooperativeGCMode_fn ret = NULL;
-
- BEGIN_QCALL;
-
- ret = IsInCooperativeGCMode;
-
- END_QCALL;
-
- return ret;
+ return IsInCooperativeGCMode;
}
#endif
@@ -319,7 +317,7 @@ DWORD STDMETHODCALLTYPE FalseGetLastError()
* Support for the GCHandle class.
*/
-extern "C" OBJECTHANDLE QCALLTYPE GCHandle_InternalAllocWithGCTransition(QCall::ObjectHandleOnStack obj, int type)
+extern "C" OBJECTHANDLE QCALLTYPE GCHandle_InternalAllocWithGCTransition(QCall::ObjectHandleOnStack obj, int type, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -350,7 +348,7 @@ FCIMPL2(LPVOID, MarshalNative::GCHandleInternalAlloc, Object *obj, int type)
}
FCIMPLEND
-extern "C" void QCALLTYPE GCHandle_InternalFreeWithGCTransition(OBJECTHANDLE handle)
+extern "C" void QCALLTYPE GCHandle_InternalFreeWithGCTransition(OBJECTHANDLE handle, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -410,7 +408,7 @@ FCIMPL2(FC_BOOL_RET, MarshalNative::GCHandleInternalTryGetBridgeWait, OBJECTHAND
FCIMPLEND
// Unlike the fast call above, this can block
-extern "C" void QCALLTYPE GCHandle_InternalGetBridgeWait(OBJECTHANDLE handle, QCall::ObjectHandleOnStack result)
+extern "C" void QCALLTYPE GCHandle_InternalGetBridgeWait(OBJECTHANDLE handle, QCall::ObjectHandleOnStack result, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -460,7 +458,7 @@ FCIMPLEND
// *** Interop Helpers ***
//====================================================================
-extern "C" void QCALLTYPE MarshalNative_GetExceptionForHR(INT32 errorCode, LPVOID errorInfo, QCall::ObjectHandleOnStack retVal)
+extern "C" void QCALLTYPE MarshalNative_GetExceptionForHR(INT32 errorCode, LPVOID errorInfo, QCall::ObjectHandleOnStack retVal, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -502,7 +500,7 @@ extern "C" void QCALLTYPE MarshalNative_GetExceptionForHR(INT32 errorCode, LPVOI
}
#ifdef FEATURE_COMINTEROP
-extern "C" int32_t QCALLTYPE MarshalNative_GetHRForException(QCall::ObjectHandleOnStack obj)
+extern "C" int32_t QCALLTYPE MarshalNative_GetHRForException(QCall::ObjectHandleOnStack obj, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -527,7 +525,7 @@ extern "C" int32_t QCALLTYPE MarshalNative_GetHRForException(QCall::ObjectHandle
//====================================================================
// return the IUnknown* for an Object.
//====================================================================
-extern "C" IUnknown* QCALLTYPE MarshalNative_GetIUnknownForObject(QCall::ObjectHandleOnStack o)
+extern "C" IUnknown* QCALLTYPE MarshalNative_GetIUnknownForObject(QCall::ObjectHandleOnStack o, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -552,7 +550,7 @@ extern "C" IUnknown* QCALLTYPE MarshalNative_GetIUnknownForObject(QCall::ObjectH
//====================================================================
// return the IDispatch* for an Object.
//====================================================================
-extern "C" IDispatch* QCALLTYPE MarshalNative_GetIDispatchForObject(QCall::ObjectHandleOnStack o)
+extern "C" IDispatch* QCALLTYPE MarshalNative_GetIDispatchForObject(QCall::ObjectHandleOnStack o, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -577,7 +575,7 @@ extern "C" IDispatch* QCALLTYPE MarshalNative_GetIDispatchForObject(QCall::Objec
//====================================================================
// return the IUnknown* or IDispatch* for an Object.
//====================================================================
-extern "C" void* QCALLTYPE MarshalNative_GetIUnknownOrIDispatchForObject(QCall::ObjectHandleOnStack o, BOOL* isIDispatch)
+extern "C" void* QCALLTYPE MarshalNative_GetIUnknownOrIDispatchForObject(QCall::ObjectHandleOnStack o, BOOL* isIDispatch, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -605,7 +603,7 @@ extern "C" void* QCALLTYPE MarshalNative_GetIUnknownOrIDispatchForObject(QCall::
// return the IUnknown* representing the interface for the Object
// Object o should support Type T
//====================================================================
-extern "C" IUnknown* QCALLTYPE MarshalNative_GetComInterfaceForObject(QCall::ObjectHandleOnStack o, QCall::TypeHandle t, BOOL bEnableCustomizedQueryInterface)
+extern "C" IUnknown* QCALLTYPE MarshalNative_GetComInterfaceForObject(QCall::ObjectHandleOnStack o, QCall::TypeHandle t, BOOL bEnableCustomizedQueryInterface, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -651,7 +649,7 @@ extern "C" IUnknown* QCALLTYPE MarshalNative_GetComInterfaceForObject(QCall::Obj
//====================================================================
// return an Object for IUnknown
//====================================================================
-extern "C" void QCALLTYPE MarshalNative_GetObjectForIUnknown(IUnknown* pUnk, QCall::ObjectHandleOnStack retObject)
+extern "C" void QCALLTYPE MarshalNative_GetObjectForIUnknown(IUnknown* pUnk, QCall::ObjectHandleOnStack retObject, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -676,7 +674,7 @@ extern "C" void QCALLTYPE MarshalNative_GetObjectForIUnknown(IUnknown* pUnk, QCa
END_QCALL;
}
-extern "C" void QCALLTYPE MarshalNative_GetUniqueObjectForIUnknown(IUnknown* pUnk, QCall::ObjectHandleOnStack retObject)
+extern "C" void QCALLTYPE MarshalNative_GetUniqueObjectForIUnknown(IUnknown* pUnk, QCall::ObjectHandleOnStack retObject, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -706,7 +704,7 @@ extern "C" void QCALLTYPE MarshalNative_GetUniqueObjectForIUnknown(IUnknown* pUn
// NOTE:
// Type T should be either a COM imported Type or a sub-type of COM imported Type
//====================================================================
-extern "C" void QCALLTYPE MarshalNative_GetTypedObjectForIUnknown(IUnknown* pUnk, QCall::TypeHandle t, QCall::ObjectHandleOnStack retObject)
+extern "C" void QCALLTYPE MarshalNative_GetTypedObjectForIUnknown(IUnknown* pUnk, QCall::TypeHandle t, QCall::ObjectHandleOnStack retObject, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -738,7 +736,7 @@ extern "C" void QCALLTYPE MarshalNative_GetTypedObjectForIUnknown(IUnknown* pUnk
END_QCALL;
}
-extern "C" IUnknown* QCALLTYPE MarshalNative_CreateAggregatedObject(IUnknown* pOuter, QCall::ObjectHandleOnStack o)
+extern "C" IUnknown* QCALLTYPE MarshalNative_CreateAggregatedObject(IUnknown* pOuter, QCall::ObjectHandleOnStack o, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -781,7 +779,7 @@ extern "C" IUnknown* QCALLTYPE MarshalNative_CreateAggregatedObject(IUnknown* pO
//====================================================================
// Free unused RCWs in the current CLR context.
//====================================================================
-extern "C" void QCALLTYPE MarshalNative_CleanupUnusedObjectsInCurrentContext()
+extern "C" void QCALLTYPE MarshalNative_CleanupUnusedObjectsInCurrentContext(QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -820,7 +818,7 @@ FCIMPLEND
// free the COM component and zombie this object if the ref count hits 0
// further usage of this Object might throw an exception,
//====================================================================
-extern "C" INT32 QCALLTYPE MarshalNative_ReleaseComObject(QCall::ObjectHandleOnStack objUNSAFE)
+extern "C" INT32 QCALLTYPE MarshalNative_ReleaseComObject(QCall::ObjectHandleOnStack objUNSAFE, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -852,7 +850,7 @@ extern "C" INT32 QCALLTYPE MarshalNative_ReleaseComObject(QCall::ObjectHandleOnS
// free the COM component and zombie this object
// further usage of this Object might throw an exception,
//====================================================================
-extern "C" void QCALLTYPE MarshalNative_FinalReleaseComObject(QCall::ObjectHandleOnStack objUNSAFE)
+extern "C" void QCALLTYPE MarshalNative_FinalReleaseComObject(QCall::ObjectHandleOnStack objUNSAFE, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -880,7 +878,7 @@ extern "C" void QCALLTYPE MarshalNative_FinalReleaseComObject(QCall::ObjectHandl
// This method takes the given COM object and wraps it in an object
// of the specified type. The type must be derived from __ComObject.
//====================================================================
-extern "C" void QCALLTYPE MarshalNative_InternalCreateWrapperOfType(QCall::ObjectHandleOnStack o, QCall::TypeHandle t, QCall::ObjectHandleOnStack retObject)
+extern "C" void QCALLTYPE MarshalNative_InternalCreateWrapperOfType(QCall::ObjectHandleOnStack o, QCall::TypeHandle t, QCall::ObjectHandleOnStack retObject, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -942,7 +940,7 @@ extern "C" void QCALLTYPE MarshalNative_InternalCreateWrapperOfType(QCall::Objec
//====================================================================
// check if the type is visible from COM.
//====================================================================
-extern "C" BOOL QCALLTYPE MarshalNative_IsTypeVisibleFromCom(QCall::TypeHandle t)
+extern "C" BOOL QCALLTYPE MarshalNative_IsTypeVisibleFromCom(QCall::TypeHandle t, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -958,7 +956,7 @@ extern "C" BOOL QCALLTYPE MarshalNative_IsTypeVisibleFromCom(QCall::TypeHandle t
return retVal;
}
-extern "C" void QCALLTYPE MarshalNative_GetNativeVariantForObject(QCall::ObjectHandleOnStack ObjUNSAFE, LPVOID pDestNativeVariant)
+extern "C" void QCALLTYPE MarshalNative_GetNativeVariantForObject(QCall::ObjectHandleOnStack ObjUNSAFE, LPVOID pDestNativeVariant, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -992,7 +990,7 @@ extern "C" void QCALLTYPE MarshalNative_GetNativeVariantForObject(QCall::ObjectH
END_QCALL;
}
-extern "C" void QCALLTYPE MarshalNative_GetObjectForNativeVariant(LPVOID pSrcNativeVariant, QCall::ObjectHandleOnStack retObject)
+extern "C" void QCALLTYPE MarshalNative_GetObjectForNativeVariant(LPVOID pSrcNativeVariant, QCall::ObjectHandleOnStack retObject, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -1015,7 +1013,7 @@ extern "C" void QCALLTYPE MarshalNative_GetObjectForNativeVariant(LPVOID pSrcNat
}
-extern "C" void QCALLTYPE MarshalNative_GetObjectsForNativeVariants(VARIANT* aSrcNativeVariant, int cVars, QCall::ObjectHandleOnStack retArray)
+extern "C" void QCALLTYPE MarshalNative_GetObjectsForNativeVariants(VARIANT* aSrcNativeVariant, int cVars, QCall::ObjectHandleOnStack retArray, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -1102,7 +1100,7 @@ static int GetComSlotInfo(MethodTable *pMT, MethodTable **ppDefItfMT)
}
}
-extern "C" INT32 QCALLTYPE MarshalNative_GetStartComSlot(QCall::TypeHandle t)
+extern "C" INT32 QCALLTYPE MarshalNative_GetStartComSlot(QCall::TypeHandle t, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1125,7 +1123,7 @@ extern "C" INT32 QCALLTYPE MarshalNative_GetStartComSlot(QCall::TypeHandle t)
return retVal;
}
-extern "C" INT32 QCALLTYPE MarshalNative_GetEndComSlot(QCall::TypeHandle t)
+extern "C" INT32 QCALLTYPE MarshalNative_GetEndComSlot(QCall::TypeHandle t, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1164,7 +1162,7 @@ extern "C" INT32 QCALLTYPE MarshalNative_GetEndComSlot(QCall::TypeHandle t)
return retVal;
}
-extern "C" VOID QCALLTYPE MarshalNative_ChangeWrapperHandleStrength(QCall::ObjectHandleOnStack otp, BOOL fIsWeak)
+extern "C" VOID QCALLTYPE MarshalNative_ChangeWrapperHandleStrength(QCall::ObjectHandleOnStack otp, BOOL fIsWeak, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1190,7 +1188,7 @@ extern "C" VOID QCALLTYPE MarshalNative_ChangeWrapperHandleStrength(QCall::Objec
END_QCALL;
}
-extern "C" void QCALLTYPE MarshalNative_GetTypeFromCLSID(REFCLSID clsid, PCWSTR wszServer, QCall::ObjectHandleOnStack retType)
+extern "C" void QCALLTYPE MarshalNative_GetTypeFromCLSID(REFCLSID clsid, PCWSTR wszServer, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
diff --git a/src/coreclr/vm/marshalnative.h b/src/coreclr/vm/marshalnative.h
index aafcfadb161df8..01a9cb3c8e58c5 100644
--- a/src/coreclr/vm/marshalnative.h
+++ b/src/coreclr/vm/marshalnative.h
@@ -37,29 +37,29 @@ class MarshalNative
#endif // FEATURE_COMINTEROP
};
-extern "C" SIZE_T QCALLTYPE MarshalNative_OffsetOf(FieldDesc* pFD);
+extern "C" SIZE_T QCALLTYPE MarshalNative_OffsetOf(FieldDesc* pFD, QCallExceptionStatus* qcallError);
-extern "C" VOID QCALLTYPE MarshalNative_Prelink(MethodDesc * pMD);
-extern "C" BOOL QCALLTYPE MarshalNative_IsBuiltInComSupported();
+extern "C" VOID QCALLTYPE MarshalNative_Prelink(MethodDesc * pMD, QCallExceptionStatus* qcallError);
+extern "C" BOOL QCALLTYPE MarshalNative_IsBuiltInComSupported(QCallExceptionStatus* qcallError);
-extern "C" BOOL QCALLTYPE MarshalNative_HasLayout(QCall::TypeHandle t, BOOL* pIsBlittable, DWORD* pNativeSize);
-extern "C" INT32 QCALLTYPE MarshalNative_SizeOfHelper(QCall::TypeHandle t, BOOL throwIfNotMarshalable);
+extern "C" BOOL QCALLTYPE MarshalNative_HasLayout(QCall::TypeHandle t, BOOL* pIsBlittable, DWORD* pNativeSize, QCallExceptionStatus* qcallError);
+extern "C" INT32 QCALLTYPE MarshalNative_SizeOfHelper(QCall::TypeHandle t, BOOL throwIfNotMarshalable, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE MarshalNative_GetDelegateForFunctionPointerInternal(PVOID FPtr, QCall::TypeHandle t, QCall::ObjectHandleOnStack retDelegate);
-extern "C" PVOID QCALLTYPE MarshalNative_GetFunctionPointerForDelegateInternal(QCall::ObjectHandleOnStack delegate);
+extern "C" void QCALLTYPE MarshalNative_GetDelegateForFunctionPointerInternal(PVOID FPtr, QCall::TypeHandle t, QCall::ObjectHandleOnStack retDelegate, QCallExceptionStatus* qcallError);
+extern "C" PVOID QCALLTYPE MarshalNative_GetFunctionPointerForDelegateInternal(QCall::ObjectHandleOnStack delegate, QCallExceptionStatus* qcallError);
//====================================================================
// These methods convert between an HR and and a managed exception.
//====================================================================
-extern "C" void QCALLTYPE MarshalNative_GetExceptionForHR(INT32 errorCode, LPVOID errorInfo, QCall::ObjectHandleOnStack obj);
+extern "C" void QCALLTYPE MarshalNative_GetExceptionForHR(INT32 errorCode, LPVOID errorInfo, QCall::ObjectHandleOnStack obj, QCallExceptionStatus* qcallError);
#ifdef FEATURE_COMINTEROP
-extern "C" int32_t QCALLTYPE MarshalNative_GetHRForException(QCall::ObjectHandleOnStack obj);
+extern "C" int32_t QCALLTYPE MarshalNative_GetHRForException(QCall::ObjectHandleOnStack obj, QCallExceptionStatus* qcallError);
#endif // FEATURE_COMINTEROP
-extern "C" OBJECTHANDLE QCALLTYPE GCHandle_InternalAllocWithGCTransition(QCall::ObjectHandleOnStack obj, int type);
-extern "C" void QCALLTYPE GCHandle_InternalFreeWithGCTransition(OBJECTHANDLE handle);
+extern "C" OBJECTHANDLE QCALLTYPE GCHandle_InternalAllocWithGCTransition(QCall::ObjectHandleOnStack obj, int type, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE GCHandle_InternalFreeWithGCTransition(OBJECTHANDLE handle, QCallExceptionStatus* qcallError);
#ifdef FEATURE_JAVAMARSHAL
-extern "C" void QCALLTYPE GCHandle_InternalGetBridgeWait(OBJECTHANDLE handle, QCall::ObjectHandleOnStack result);
+extern "C" void QCALLTYPE GCHandle_InternalGetBridgeWait(OBJECTHANDLE handle, QCall::ObjectHandleOnStack result, QCallExceptionStatus* qcallError);
#endif
#ifdef _DEBUG
@@ -71,88 +71,88 @@ extern "C" IsInCooperativeGCMode_fn QCALLTYPE MarshalNative_GetIsInCooperativeGC
//====================================================================
// Create type for given CLSID.
//====================================================================
-extern "C" void QCALLTYPE MarshalNative_GetTypeFromCLSID(REFCLSID clsid, PCWSTR wszServer, QCall::ObjectHandleOnStack retType);
+extern "C" void QCALLTYPE MarshalNative_GetTypeFromCLSID(REFCLSID clsid, PCWSTR wszServer, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError);
//====================================================================
// return the IUnknown* for an Object
//====================================================================
-extern "C" IUnknown* QCALLTYPE MarshalNative_GetIUnknownForObject(QCall::ObjectHandleOnStack o);
+extern "C" IUnknown* QCALLTYPE MarshalNative_GetIUnknownForObject(QCall::ObjectHandleOnStack o, QCallExceptionStatus* qcallError);
//====================================================================
// return the IDispatch* for an Object
//====================================================================
-extern "C" IDispatch* QCALLTYPE MarshalNative_GetIDispatchForObject(QCall::ObjectHandleOnStack o);
+extern "C" IDispatch* QCALLTYPE MarshalNative_GetIDispatchForObject(QCall::ObjectHandleOnStack o, QCallExceptionStatus* qcallError);
//====================================================================
// return the IUnknown* or IDispatch* for an Object.
//====================================================================
-extern "C" void* QCALLTYPE MarshalNative_GetIUnknownOrIDispatchForObject(QCall::ObjectHandleOnStack o, BOOL* isIDispatch);
+extern "C" void* QCALLTYPE MarshalNative_GetIUnknownOrIDispatchForObject(QCall::ObjectHandleOnStack o, BOOL* isIDispatch, QCallExceptionStatus* qcallError);
//====================================================================
// return the IUnknown* representing the interface for the Object
// Object o should support Type T
//====================================================================
-extern "C" IUnknown* QCALLTYPE MarshalNative_GetComInterfaceForObject(QCall::ObjectHandleOnStack o, QCall::TypeHandle t, BOOL bEnableCustomizedQueryInterface);
+extern "C" IUnknown* QCALLTYPE MarshalNative_GetComInterfaceForObject(QCall::ObjectHandleOnStack o, QCall::TypeHandle t, BOOL bEnableCustomizedQueryInterface, QCallExceptionStatus* qcallError);
//====================================================================
// return an Object for IUnknown
//====================================================================
-extern "C" void QCALLTYPE MarshalNative_GetObjectForIUnknown(IUnknown* pUnk, QCall::ObjectHandleOnStack retObject);
+extern "C" void QCALLTYPE MarshalNative_GetObjectForIUnknown(IUnknown* pUnk, QCall::ObjectHandleOnStack retObject, QCallExceptionStatus* qcallError);
//====================================================================
// return a unique cacheless Object for IUnknown
//====================================================================
-extern "C" void QCALLTYPE MarshalNative_GetUniqueObjectForIUnknown(IUnknown* pUnk, QCall::ObjectHandleOnStack retObject);
+extern "C" void QCALLTYPE MarshalNative_GetUniqueObjectForIUnknown(IUnknown* pUnk, QCall::ObjectHandleOnStack retObject, QCallExceptionStatus* qcallError);
//====================================================================
// return an Object for IUnknown, using the Type T,
// NOTE:
// Type T should be either a COM imported Type or a sub-type of COM imported Type
//====================================================================
-extern "C" void QCALLTYPE MarshalNative_GetTypedObjectForIUnknown(IUnknown* pUnk, QCall::TypeHandle t, QCall::ObjectHandleOnStack retObject);
+extern "C" void QCALLTYPE MarshalNative_GetTypedObjectForIUnknown(IUnknown* pUnk, QCall::TypeHandle t, QCall::ObjectHandleOnStack retObject, QCallExceptionStatus* qcallError);
//====================================================================
// Create an object and aggregate it, then return the inner unknown.
//====================================================================
-extern "C" IUnknown* QCALLTYPE MarshalNative_CreateAggregatedObject(IUnknown* pOuter, QCall::ObjectHandleOnStack o);
+extern "C" IUnknown* QCALLTYPE MarshalNative_CreateAggregatedObject(IUnknown* pOuter, QCall::ObjectHandleOnStack o, QCallExceptionStatus* qcallError);
//====================================================================
// Free unused RCWs in the current CLR context.
//====================================================================
-extern "C" void QCALLTYPE MarshalNative_CleanupUnusedObjectsInCurrentContext();
+extern "C" void QCALLTYPE MarshalNative_CleanupUnusedObjectsInCurrentContext(QCallExceptionStatus* qcallError);
//====================================================================
// free the COM component and zombie this object
// further usage of this Object might throw an exception,
//====================================================================
-extern "C" INT32 QCALLTYPE MarshalNative_ReleaseComObject(QCall::ObjectHandleOnStack objUNSAFE);
-extern "C" void QCALLTYPE MarshalNative_FinalReleaseComObject(QCall::ObjectHandleOnStack objUNSAFE);
+extern "C" INT32 QCALLTYPE MarshalNative_ReleaseComObject(QCall::ObjectHandleOnStack objUNSAFE, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE MarshalNative_FinalReleaseComObject(QCall::ObjectHandleOnStack objUNSAFE, QCallExceptionStatus* qcallError);
//====================================================================
// This method takes the given COM object and wraps it in an object
// of the specified type. The type must be derived from __ComObject.
//====================================================================
-extern "C" void QCALLTYPE MarshalNative_InternalCreateWrapperOfType(QCall::ObjectHandleOnStack o, QCall::TypeHandle t, QCall::ObjectHandleOnStack retObject);
+extern "C" void QCALLTYPE MarshalNative_InternalCreateWrapperOfType(QCall::ObjectHandleOnStack o, QCall::TypeHandle t, QCall::ObjectHandleOnStack retObject, QCallExceptionStatus* qcallError);
//====================================================================
// check if the type is visible from COM.
//====================================================================
-extern "C" BOOL QCALLTYPE MarshalNative_IsTypeVisibleFromCom(QCall::TypeHandle t);
+extern "C" BOOL QCALLTYPE MarshalNative_IsTypeVisibleFromCom(QCall::TypeHandle t, QCallExceptionStatus* qcallError);
//====================================================================
// These methods convert OLE variants to and from objects.
//====================================================================
-extern "C" void QCALLTYPE MarshalNative_GetNativeVariantForObject(QCall::ObjectHandleOnStack ObjUNSAFE, LPVOID pDestNativeVariant);
-extern "C" void QCALLTYPE MarshalNative_GetObjectForNativeVariant(LPVOID pSrcNativeVariant, QCall::ObjectHandleOnStack retObject);
-extern "C" void QCALLTYPE MarshalNative_GetObjectsForNativeVariants(VARIANT* aSrcNativeVariant, int cVars, QCall::ObjectHandleOnStack retArray);
+extern "C" void QCALLTYPE MarshalNative_GetNativeVariantForObject(QCall::ObjectHandleOnStack ObjUNSAFE, LPVOID pDestNativeVariant, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE MarshalNative_GetObjectForNativeVariant(LPVOID pSrcNativeVariant, QCall::ObjectHandleOnStack retObject, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE MarshalNative_GetObjectsForNativeVariants(VARIANT* aSrcNativeVariant, int cVars, QCall::ObjectHandleOnStack retArray, QCallExceptionStatus* qcallError);
//====================================================================
// These methods are used to map COM slots to method info's.
//====================================================================
-extern "C" INT32 QCALLTYPE MarshalNative_GetStartComSlot(QCall::TypeHandle t);
-extern "C" INT32 QCALLTYPE MarshalNative_GetEndComSlot(QCall::TypeHandle t);
+extern "C" INT32 QCALLTYPE MarshalNative_GetStartComSlot(QCall::TypeHandle t, QCallExceptionStatus* qcallError);
+extern "C" INT32 QCALLTYPE MarshalNative_GetEndComSlot(QCall::TypeHandle t, QCallExceptionStatus* qcallError);
-extern "C" VOID QCALLTYPE MarshalNative_ChangeWrapperHandleStrength(QCall::ObjectHandleOnStack otp, BOOL fIsWeak);
+extern "C" VOID QCALLTYPE MarshalNative_ChangeWrapperHandleStrength(QCall::ObjectHandleOnStack otp, BOOL fIsWeak, QCallExceptionStatus* qcallError);
#endif // FEATURE_COMINTEROP
#endif
diff --git a/src/coreclr/vm/method.hpp b/src/coreclr/vm/method.hpp
index acfe1a4a8a3d72..fd6722c1bf3635 100644
--- a/src/coreclr/vm/method.hpp
+++ b/src/coreclr/vm/method.hpp
@@ -2397,7 +2397,7 @@ class MethodDesc
};
#ifndef DACCESS_COMPILE
-extern "C" void* QCALLTYPE UnsafeAccessors_ResolveGenericParamToTypeHandle(MethodDesc* unsafeAccessorMethod, BOOL isMethodParam, DWORD paramIndex);
+extern "C" void* QCALLTYPE UnsafeAccessors_ResolveGenericParamToTypeHandle(MethodDesc* unsafeAccessorMethod, BOOL isMethodParam, DWORD paramIndex, QCallExceptionStatus* qcallError);
#endif // DACCESS_COMPILE
template<> struct cdac_data
diff --git a/src/coreclr/vm/mlinfo.cpp b/src/coreclr/vm/mlinfo.cpp
index 899822d7177317..7f88dec1f568f4 100644
--- a/src/coreclr/vm/mlinfo.cpp
+++ b/src/coreclr/vm/mlinfo.cpp
@@ -3589,7 +3589,7 @@ bool IsUnsupportedTypedrefReturn(MetaSig& msig)
#include "stubhelpers.h"
-extern "C" void QCALLTYPE StubHelpers_CreateCustomMarshaler(MethodDesc* pMD, mdToken paramToken, TypeHandle hndManagedType, QCall::ObjectHandleOnStack retObject)
+extern "C" void QCALLTYPE StubHelpers_CreateCustomMarshaler(MethodDesc* pMD, mdToken paramToken, TypeHandle hndManagedType, QCall::ObjectHandleOnStack retObject, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
diff --git a/src/coreclr/vm/multicorejit.cpp b/src/coreclr/vm/multicorejit.cpp
index 5b1f0fcb957c96..3196553ba423fe 100644
--- a/src/coreclr/vm/multicorejit.cpp
+++ b/src/coreclr/vm/multicorejit.cpp
@@ -1546,7 +1546,7 @@ DWORD MulticoreJitManager::EncodeModuleHelper(void * pModuleContext, Module * pR
// wszProfile - profile name
// ptrNativeAssemblyBinder - the binding context
//
-extern "C" void QCALLTYPE MultiCoreJIT_InternalStartProfile(_In_z_ LPCWSTR wszProfile, INT_PTR ptrNativeAssemblyBinder)
+extern "C" void QCALLTYPE MultiCoreJIT_InternalStartProfile(_In_z_ LPCWSTR wszProfile, INT_PTR ptrNativeAssemblyBinder, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1565,7 +1565,7 @@ extern "C" void QCALLTYPE MultiCoreJIT_InternalStartProfile(_In_z_ LPCWSTR wszPr
}
-extern "C" void QCALLTYPE MultiCoreJIT_InternalSetProfileRoot(_In_z_ LPCWSTR wszProfilePath)
+extern "C" void QCALLTYPE MultiCoreJIT_InternalSetProfileRoot(_In_z_ LPCWSTR wszProfilePath, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
diff --git a/src/coreclr/vm/multicorejit.h b/src/coreclr/vm/multicorejit.h
index 37eea5782156c6..5577d1c77e3c11 100644
--- a/src/coreclr/vm/multicorejit.h
+++ b/src/coreclr/vm/multicorejit.h
@@ -315,7 +315,7 @@ class MulticoreJitManager
// For qcallentrypoints.cpp
-extern "C" void QCALLTYPE MultiCoreJIT_InternalSetProfileRoot(_In_z_ LPCWSTR directoryPath);
-extern "C" void QCALLTYPE MultiCoreJIT_InternalStartProfile(_In_z_ LPCWSTR wszProfile, INT_PTR ptrNativeAssemblyBinder);
+extern "C" void QCALLTYPE MultiCoreJIT_InternalSetProfileRoot(_In_z_ LPCWSTR directoryPath, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE MultiCoreJIT_InternalStartProfile(_In_z_ LPCWSTR wszProfile, INT_PTR ptrNativeAssemblyBinder, QCallExceptionStatus* qcallError);
#endif // __MULTICORE_JIT_H__
diff --git a/src/coreclr/vm/nativeeventsource.cpp b/src/coreclr/vm/nativeeventsource.cpp
index 70d0989748313f..232f09c208e06a 100644
--- a/src/coreclr/vm/nativeeventsource.cpp
+++ b/src/coreclr/vm/nativeeventsource.cpp
@@ -13,7 +13,7 @@
#if defined(FEATURE_EVENTSOURCE_XPLAT)
-extern "C" void QCALLTYPE LogEventSource(_In_z_ int eventID, _In_z_ LPCWSTR eventName, _In_z_ LPCWSTR eventSourceName, _In_z_ LPCWSTR payload)
+extern "C" void QCALLTYPE LogEventSource(_In_z_ int eventID, _In_z_ LPCWSTR eventName, _In_z_ LPCWSTR eventSourceName, _In_z_ LPCWSTR payload, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -21,26 +21,28 @@ extern "C" void QCALLTYPE LogEventSource(_In_z_ int eventID, _In_z_ LPCWSTR even
END_QCALL;
}
-extern "C" BOOL QCALLTYPE IsEventSourceLoggingEnabled()
+extern "C" BOOL QCALLTYPE IsEventSourceLoggingEnabled(QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BOOL retVal = FALSE;
BEGIN_QCALL;
+
retVal = XplatEventLogger::IsEventLoggingEnabled();
END_QCALL;
return retVal;
}
-extern "C" LPWSTR QCALLTYPE EventSource_GetClrConfig(LPCWSTR configName)
+extern "C" LPWSTR QCALLTYPE EventSource_GetClrConfig(LPCWSTR configName, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
LPWSTR ret = NULL;
BEGIN_QCALL;
+
CLRConfig::ConfigStringInfo info;
info.name = configName;
info.options = CLRConfig::LookupOptions::Default;
@@ -60,7 +62,7 @@ extern "C" LPWSTR QCALLTYPE EventSource_GetClrConfig(LPCWSTR configName)
// change genRuntimeEventSources.py script to not emit the body that throws NotImplementedException for the event that
// want to be fired from managed code.
// See https://github.com/dotnet/runtime/pull/47829 for an example of how to do this.
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadStart(_In_z_ uint activeWorkerThreadCount, _In_z_ uint retiredWorkerThreadCount, _In_z_ short clrInstanceID)
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadStart(_In_z_ uint activeWorkerThreadCount, _In_z_ uint retiredWorkerThreadCount, _In_z_ short clrInstanceID, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -70,7 +72,7 @@ extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadStar
END_QCALL;
}
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadStop(_In_z_ uint activeWorkerThreadCount, _In_z_ uint retiredWorkerThreadCount, _In_z_ short clrInstanceID)
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadStop(_In_z_ uint activeWorkerThreadCount, _In_z_ uint retiredWorkerThreadCount, _In_z_ short clrInstanceID, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -80,7 +82,7 @@ extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadStop
END_QCALL;
}
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadWait(_In_z_ uint activeWorkerThreadCount, _In_z_ uint retiredWorkerThreadCount, _In_z_ short clrInstanceID)
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadWait(_In_z_ uint activeWorkerThreadCount, _In_z_ uint retiredWorkerThreadCount, _In_z_ short clrInstanceID, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -90,7 +92,7 @@ extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadWait
END_QCALL;
}
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolMinMaxThreads(_In_z_ short minWorkerThreads, _In_z_ short maxWorkerThreads, _In_z_ short minIOCompletionThreads, _In_z_ short maxIOCompletionThreads, _In_z_ short clrInstanceID)
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolMinMaxThreads(_In_z_ short minWorkerThreads, _In_z_ short maxWorkerThreads, _In_z_ short minIOCompletionThreads, _In_z_ short maxIOCompletionThreads, _In_z_ short clrInstanceID, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -100,7 +102,7 @@ extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolMinMaxThreads(_I
END_QCALL;
}
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadAdjustmentSample(_In_z_ double throughput, _In_z_ short clrInstanceID)
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadAdjustmentSample(_In_z_ double throughput, _In_z_ short clrInstanceID, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -110,7 +112,7 @@ extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadAdju
END_QCALL;
}
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadAdjustmentAdjustment(_In_z_ double averageThroughput, _In_z_ uint newWorkerThreadCount, _In_z_ uint reason, _In_z_ short clrInstanceID)
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadAdjustmentAdjustment(_In_z_ double averageThroughput, _In_z_ uint newWorkerThreadCount, _In_z_ uint reason, _In_z_ short clrInstanceID, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -120,7 +122,7 @@ extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadAdju
END_QCALL;
}
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadAdjustmentStats(_In_z_ double duration, _In_z_ double throughput, _In_z_ double threadWave, _In_z_ double throughputWave, _In_z_ double throughputErrorEstimate, _In_z_ double AverageThroughputErrorEstimate, _In_z_ double ThroughputRatio, _In_z_ double confidence, _In_z_ double newControlSetting, _In_z_ short newThreadWaveMagnitude, _In_z_ short ClrInstanceID)
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadAdjustmentStats(_In_z_ double duration, _In_z_ double throughput, _In_z_ double threadWave, _In_z_ double throughputWave, _In_z_ double throughputErrorEstimate, _In_z_ double AverageThroughputErrorEstimate, _In_z_ double ThroughputRatio, _In_z_ double confidence, _In_z_ double newControlSetting, _In_z_ short newThreadWaveMagnitude, _In_z_ short ClrInstanceID, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -130,7 +132,7 @@ extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadAdju
END_QCALL;
}
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolIOEnqueue(_In_z_ void* nativeOverlapped, _In_z_ void* overlapped, _In_z_ BOOL multiDequeues, _In_z_ short ClrInstanceID)
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolIOEnqueue(_In_z_ void* nativeOverlapped, _In_z_ void* overlapped, _In_z_ BOOL multiDequeues, _In_z_ short ClrInstanceID, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -140,7 +142,7 @@ extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolIOEnqueue(_In_z_
END_QCALL;
}
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolIODequeue(_In_z_ void* nativeOverlapped, _In_z_ void* overlapped, _In_z_ short ClrInstanceID)
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolIODequeue(_In_z_ void* nativeOverlapped, _In_z_ void* overlapped, _In_z_ short ClrInstanceID, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -150,7 +152,7 @@ extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolIODequeue(_In_z_
END_QCALL;
}
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkingThreadCount(_In_z_ uint count, _In_z_ short ClrInstanceID)
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkingThreadCount(_In_z_ uint count, _In_z_ short ClrInstanceID, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -160,7 +162,7 @@ extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkingThreadCou
END_QCALL;
}
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolIOPack(_In_z_ void* nativeOverlapped, _In_z_ void* overlapped, _In_z_ short ClrInstanceID)
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolIOPack(_In_z_ void* nativeOverlapped, _In_z_ void* overlapped, _In_z_ short ClrInstanceID, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -170,7 +172,7 @@ extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolIOPack(_In_z_ vo
END_QCALL;
}
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogContentionLockCreated(void* LockID, void* AssociatedObjectID, uint16_t ClrInstanceID)
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogContentionLockCreated(void* LockID, void* AssociatedObjectID, uint16_t ClrInstanceID, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -185,7 +187,8 @@ extern "C" void QCALLTYPE NativeRuntimeEventSource_LogContentionStart(
uint16_t ClrInstanceID,
void* LockID,
void* AssociatedObjectID,
- uint64_t LockOwnerThreadID)
+ uint64_t LockOwnerThreadID,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -195,7 +198,7 @@ extern "C" void QCALLTYPE NativeRuntimeEventSource_LogContentionStart(
END_QCALL;
}
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogContentionStop(uint8_t ContentionFlags, uint16_t ClrInstanceID, double DurationNs)
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogContentionStop(uint8_t ContentionFlags, uint16_t ClrInstanceID, double DurationNs, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -205,7 +208,7 @@ extern "C" void QCALLTYPE NativeRuntimeEventSource_LogContentionStop(uint8_t Con
END_QCALL;
}
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogWaitHandleWaitStart(uint8_t WaitSource, intptr_t AssociatedObjectID, uint16_t ClrInstanceID)
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogWaitHandleWaitStart(uint8_t WaitSource, intptr_t AssociatedObjectID, uint16_t ClrInstanceID, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -215,7 +218,7 @@ extern "C" void QCALLTYPE NativeRuntimeEventSource_LogWaitHandleWaitStart(uint8_
END_QCALL;
}
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogWaitHandleWaitStop(uint16_t ClrInstanceID)
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogWaitHandleWaitStop(uint16_t ClrInstanceID, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
diff --git a/src/coreclr/vm/nativeeventsource.h b/src/coreclr/vm/nativeeventsource.h
index 850eb9dfa25899..66785fc054a55c 100644
--- a/src/coreclr/vm/nativeeventsource.h
+++ b/src/coreclr/vm/nativeeventsource.h
@@ -15,28 +15,28 @@
#include "qcall.h"
#if defined(FEATURE_EVENTSOURCE_XPLAT)
-extern "C" void QCALLTYPE LogEventSource(_In_z_ int eventID, _In_z_ LPCWSTR eventName, _In_z_ LPCWSTR eventSourceName, _In_z_ LPCWSTR payload);
-extern "C" BOOL QCALLTYPE IsEventSourceLoggingEnabled();
-extern "C" LPWSTR QCALLTYPE EventSource_GetClrConfig(LPCWSTR configName);
+extern "C" void QCALLTYPE LogEventSource(_In_z_ int eventID, _In_z_ LPCWSTR eventName, _In_z_ LPCWSTR eventSourceName, _In_z_ LPCWSTR payload, QCallExceptionStatus* qcallError);
+extern "C" BOOL QCALLTYPE IsEventSourceLoggingEnabled(QCallExceptionStatus* qcallError);
+extern "C" LPWSTR QCALLTYPE EventSource_GetClrConfig(LPCWSTR configName, QCallExceptionStatus* qcallError);
#endif //defined(FEATURE_EVENTSOURCE_XPLAT)
#if defined(FEATURE_PERFTRACING)
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadStart(_In_z_ uint activeWorkerThreadCount, _In_z_ uint retiredWorkerThreadCount, _In_z_ short clrInstanceID);
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadStop(_In_z_ uint activeWorkerThreadCount, _In_z_ uint retiredWorkerThreadCount, _In_z_ short clrInstanceID);
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadWait(_In_z_ uint activeWorkerThreadCount, _In_z_ uint retiredWorkerThreadCount, _In_z_ short clrInstanceID);
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolMinMaxThreads(_In_z_ short minWorkerThreads, _In_z_ short maxWorkerThreads, _In_z_ short minIOCompletionThreads, _In_z_ short maxIOCompletionThreads, _In_z_ short clrInstanceID);
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadAdjustmentSample(_In_z_ double throughput, _In_z_ short clrInstanceID);
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadAdjustmentAdjustment(_In_z_ double averageThroughput, _In_z_ uint newWorkerThreadCount, _In_z_ uint reason, _In_z_ short clrInstanceID);
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadAdjustmentStats(_In_z_ double duration, _In_z_ double throughput, _In_z_ double threadWave, _In_z_ double throughputWave, _In_z_ double throughputErrorEstimate, _In_z_ double AverageThroughputErrorEstimate, _In_z_ double ThroughputRatio, _In_z_ double confidence, _In_z_ double newControlSetting, _In_z_ short newThreadWaveMagnitude, _In_z_ short ClrInstanceID);
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolIOEnqueue(_In_z_ void* nativeOverlapped, _In_z_ void* overlapped, _In_z_ BOOL multiDequeues, _In_z_ short ClrInstanceID);
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolIODequeue(_In_z_ void* nativeOverlapped, _In_z_ void* overlapped, _In_z_ short ClrInstanceID);
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkingThreadCount(_In_z_ uint count, _In_z_ short ClrInstanceID);
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolIOPack(_In_z_ void* nativeOverlapped, _In_z_ void* overlapped, _In_z_ short ClrInstanceID);
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogContentionLockCreated(void* LockID, void* AssociatedObjectID, uint16_t ClrInstanceID);
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogContentionStart(uint8_t ContentionFlags, uint16_t ClrInstanceID, void* LockID, void* AssociatedObjectID, uint64_t LockOwnerThreadID);
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogContentionStop(uint8_t ContentionFlags, uint16_t ClrInstanceID, double DurationNs);
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogWaitHandleWaitStart(uint8_t WaitSource, intptr_t AssociatedObjectID, uint16_t ClrInstanceID);
-extern "C" void QCALLTYPE NativeRuntimeEventSource_LogWaitHandleWaitStop(uint16_t ClrInstanceID);
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadStart(_In_z_ uint activeWorkerThreadCount, _In_z_ uint retiredWorkerThreadCount, _In_z_ short clrInstanceID, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadStop(_In_z_ uint activeWorkerThreadCount, _In_z_ uint retiredWorkerThreadCount, _In_z_ short clrInstanceID, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadWait(_In_z_ uint activeWorkerThreadCount, _In_z_ uint retiredWorkerThreadCount, _In_z_ short clrInstanceID, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolMinMaxThreads(_In_z_ short minWorkerThreads, _In_z_ short maxWorkerThreads, _In_z_ short minIOCompletionThreads, _In_z_ short maxIOCompletionThreads, _In_z_ short clrInstanceID, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadAdjustmentSample(_In_z_ double throughput, _In_z_ short clrInstanceID, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadAdjustmentAdjustment(_In_z_ double averageThroughput, _In_z_ uint newWorkerThreadCount, _In_z_ uint reason, _In_z_ short clrInstanceID, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkerThreadAdjustmentStats(_In_z_ double duration, _In_z_ double throughput, _In_z_ double threadWave, _In_z_ double throughputWave, _In_z_ double throughputErrorEstimate, _In_z_ double AverageThroughputErrorEstimate, _In_z_ double ThroughputRatio, _In_z_ double confidence, _In_z_ double newControlSetting, _In_z_ short newThreadWaveMagnitude, _In_z_ short ClrInstanceID, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolIOEnqueue(_In_z_ void* nativeOverlapped, _In_z_ void* overlapped, _In_z_ BOOL multiDequeues, _In_z_ short ClrInstanceID, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolIODequeue(_In_z_ void* nativeOverlapped, _In_z_ void* overlapped, _In_z_ short ClrInstanceID, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolWorkingThreadCount(_In_z_ uint count, _In_z_ short ClrInstanceID, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogThreadPoolIOPack(_In_z_ void* nativeOverlapped, _In_z_ void* overlapped, _In_z_ short ClrInstanceID, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogContentionLockCreated(void* LockID, void* AssociatedObjectID, uint16_t ClrInstanceID, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogContentionStart(uint8_t ContentionFlags, uint16_t ClrInstanceID, void* LockID, void* AssociatedObjectID, uint64_t LockOwnerThreadID, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogContentionStop(uint8_t ContentionFlags, uint16_t ClrInstanceID, double DurationNs, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogWaitHandleWaitStart(uint8_t WaitSource, intptr_t AssociatedObjectID, uint16_t ClrInstanceID, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE NativeRuntimeEventSource_LogWaitHandleWaitStop(uint16_t ClrInstanceID, QCallExceptionStatus* qcallError);
#endif // defined(FEATURE_PERFTRACING)
diff --git a/src/coreclr/vm/nativelibrarynative.cpp b/src/coreclr/vm/nativelibrarynative.cpp
index 7a8af3c489ecb2..713ae1b62ec097 100644
--- a/src/coreclr/vm/nativelibrarynative.cpp
+++ b/src/coreclr/vm/nativelibrarynative.cpp
@@ -11,7 +11,8 @@
// static
extern "C" INT_PTR QCALLTYPE NativeLibrary_LoadByName(LPCWSTR name, QCall::AssemblyHandle callingAssembly,
BOOL hasDllImportSearchPathFlag, DWORD dllImportSearchPathFlag,
- BOOL throwOnError)
+ BOOL throwOnError,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
diff --git a/src/coreclr/vm/nativelibrarynative.h b/src/coreclr/vm/nativelibrarynative.h
index d78cfdcedafef6..a30217d657e30b 100644
--- a/src/coreclr/vm/nativelibrarynative.h
+++ b/src/coreclr/vm/nativelibrarynative.h
@@ -12,6 +12,7 @@
extern "C" INT_PTR QCALLTYPE NativeLibrary_LoadByName(LPCWSTR name, QCall::AssemblyHandle callingAssembly,
BOOL hasDllImportSearchPathFlag, DWORD dllImportSearchPathFlag,
- BOOL throwOnError);
+ BOOL throwOnError,
+ QCallExceptionStatus* qcallError);
#endif // __NATIVELIBRARYNATIVE_H__
diff --git a/src/coreclr/vm/olevariant.cpp b/src/coreclr/vm/olevariant.cpp
index ecacef1977ec47..270d982f1e0d4d 100644
--- a/src/coreclr/vm/olevariant.cpp
+++ b/src/coreclr/vm/olevariant.cpp
@@ -2662,7 +2662,7 @@ BSTR OleVariant::ConvertStringToBSTR(STRINGREF *pStringObj)
return result;
}
-extern "C" void QCALLTYPE Variant_ConvertValueTypeToRecord(QCall::ObjectHandleOnStack obj, VARIANT * pOle)
+extern "C" void QCALLTYPE Variant_ConvertValueTypeToRecord(QCall::ObjectHandleOnStack obj, VARIANT * pOle, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
diff --git a/src/coreclr/vm/olevariant.h b/src/coreclr/vm/olevariant.h
index a3dd84ab287a88..ba83ded23c7941 100644
--- a/src/coreclr/vm/olevariant.h
+++ b/src/coreclr/vm/olevariant.h
@@ -107,6 +107,6 @@ class OleVariant
// SAFEARRAY VARTYPE and element MethodTable.
MethodDesc* GetInstantiatedSafeArrayMethod(BinderMethodID methodId, VARTYPE vt, MethodTable* pElementMT, BOOL bHeterogeneous, BOOL bNativeDataValid = FALSE);
-extern "C" void QCALLTYPE Variant_ConvertValueTypeToRecord(QCall::ObjectHandleOnStack obj, VARIANT* pOle);
+extern "C" void QCALLTYPE Variant_ConvertValueTypeToRecord(QCall::ObjectHandleOnStack obj, VARIANT* pOle, QCallExceptionStatus* qcallError);
#endif
diff --git a/src/coreclr/vm/qcall.cpp b/src/coreclr/vm/qcall.cpp
index 497cdff7adf000..2a1a4292a96084 100644
--- a/src/coreclr/vm/qcall.cpp
+++ b/src/coreclr/vm/qcall.cpp
@@ -7,6 +7,46 @@
#include "common.h"
+void SetQCallExceptionStatusThrowable(QCallExceptionStatus* pStatus, OBJECTREF throwable)
+{
+ CONTRACTL
+ {
+ NOTHROW;
+ GC_NOTRIGGER;
+ MODE_COOPERATIVE;
+ }
+ CONTRACTL_END;
+
+ _ASSERTE(throwable != NULL);
+ _ASSERTE(*pStatus == 0);
+
+ MethodTable* exceptionType = throwable->GetMethodTable();
+ if (exceptionType == g_pOutOfMemoryExceptionClass)
+ {
+ *pStatus = QCallOutOfMemoryException;
+ return;
+ }
+
+ if (exceptionType == g_pStackOverflowExceptionClass)
+ {
+ *pStatus = QCallStackOverflowException;
+ return;
+ }
+
+ OBJECTHANDLE exceptionHandle = GetAppDomain()->GetHandleStore()->CreateHandleOfType(
+ OBJECTREFToObject(throwable),
+ HNDTYPE_DEFAULT);
+ if (exceptionHandle == NULL)
+ {
+ *pStatus = QCallOutOfMemoryException;
+ return;
+ }
+
+ DiagHandleCreated(exceptionHandle, throwable);
+ _ASSERTE(reinterpret_cast(exceptionHandle) > QCallStackOverflowException);
+ *pStatus = reinterpret_cast(exceptionHandle);
+}
+
//
// Helpers for returning managed string from QCall
//
diff --git a/src/coreclr/vm/qcall.h b/src/coreclr/vm/qcall.h
index 96d59421ae50dc..797d55a78a5bce 100644
--- a/src/coreclr/vm/qcall.h
+++ b/src/coreclr/vm/qcall.h
@@ -36,12 +36,13 @@
// QCall example - managed part (do not replicate the comments into your actual QCall implementation):
// ---------------------------------------------------------------------------------------------------
//
-// class Foo {
+// class Foo
+// {
//
-// // All QCalls should have the following DllImport and SuppressUnmanagedCodeSecurity attributes
-// [DllImport(JitHelpers.QCall, EntryPoint = "FooNative_Bar", CharSet = CharSet.Unicode)]
-// // QCalls should always be static extern.
-// private static extern bool Bar(int flags, string inString, StringHandleOnStack retString);
+// // All QCalls that use BEGIN_QCALL must use the hidden last parameter error handler.
+// [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+// [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "FooNative_Bar", StringMarshalling = StringMarshalling.Utf16)]
+// private static partial bool Bar(int flags, string inString, StringHandleOnStack retString);
//
// // Many QCalls have a thin managed wrapper around them to expose them to the world in more meaningful way.
// public string Bar(int flags)
@@ -50,7 +51,7 @@
//
// // The strings are returned from QCalls by taking address
// // of a local variable using JitHelpers.GetStringHandleOnStack method
-// if (!Bar(flags, this.Id, JitHelpers.GetStringHandleOnStack(ref retString)))
+// if (!Bar(flags, this.Id, StringHandleOnStack.Create(ref retString)))
// FatalError();
//
// return retString;
@@ -65,7 +66,8 @@
// The entrypoints of all QCalls has to be registered in tables in vm\qcallentrypoints.cpp using the DllImportEntry macro,
// For example: DllImportEntry(FooNative_Bar)
//
-// extern "C" BOOL QCALLTYPE FooNative_Bar(int flags, LPCWSTR wszString, QCall::StringHandleOnStack retString)
+// extern "C" BOOL QCALLTYPE FooNative_Bar(
+// int flags, LPCWSTR wszString, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError)
// {
// // All QCalls should have QCALL_CONTRACT. It is alias for THROWS; GC_TRIGGERS; MODE_PREEMPTIVE.
// QCALL_CONTRACT;
@@ -76,8 +78,6 @@
// // PRECONDITION(wszString != NULL);
// // } CONTRACTL_END;
//
-// // The only line between QCALL_CONTRACT and BEGIN_QCALL
-// // should be the return value declaration if there is one.
// BOOL retVal = FALSE;
//
// // The body has to be enclosed in BEGIN_QCALL/END_QCALL macro. It is necessary to make the exception handling work.
@@ -110,13 +110,12 @@
#endif // !TARGET_UNIX
#define BEGIN_QCALL \
+ *qcallError = 0; \
INSTALL_RESUME_AFTER_CATCH_HANDLER_WITH_FRAME(GetThread()->GetFrame()) \
- INSTALL_MANAGED_EXCEPTION_DISPATCHER \
- INSTALL_UNWIND_AND_CONTINUE_HANDLER
+ INSTALL_MANAGED_EXCEPTION_CAPTURE_DISPATCHER
#define END_QCALL \
- UNINSTALL_UNWIND_AND_CONTINUE_HANDLER \
- UNINSTALL_MANAGED_EXCEPTION_DISPATCHER \
+ UNINSTALL_MANAGED_EXCEPTION_CAPTURE_DISPATCHER \
UNINSTALL_RESUME_AFTER_CATCH_HANDLER_WITH_FRAME
#define QCALL_CHECK \
diff --git a/src/coreclr/vm/qcallentrypoints.cpp b/src/coreclr/vm/qcallentrypoints.cpp
index 5ca91d39263b27..06f6c895914696 100644
--- a/src/coreclr/vm/qcallentrypoints.cpp
+++ b/src/coreclr/vm/qcallentrypoints.cpp
@@ -301,6 +301,7 @@ static const Entry s_QCall[] =
DllImportEntry(AppDomain_CreateDynamicAssembly)
DllImportEntry(AppContext_SetFirstChanceExceptionHandler)
DllImportEntry(AppContext_TryGetHostPropertyValue)
+ DllImportEntry(ThreadNative_GetQCallSpecialException)
DllImportEntry(ThreadNative_Start)
DllImportEntry(ThreadNative_SetPriority)
DllImportEntry(ThreadNative_GetCurrentThread)
diff --git a/src/coreclr/vm/reflectioninvocation.cpp b/src/coreclr/vm/reflectioninvocation.cpp
index 138ebca1576c1a..973927d691fc82 100644
--- a/src/coreclr/vm/reflectioninvocation.cpp
+++ b/src/coreclr/vm/reflectioninvocation.cpp
@@ -27,7 +27,7 @@
#include "interpexec.h"
-extern "C" void QCALLTYPE RuntimeFieldHandle_GetValue(FieldDesc* fieldDesc, QCall::ObjectHandleOnStack instance, QCall::TypeHandle fieldType, QCall::TypeHandle declaringType, BOOL* pIsClassInitialized, QCall::ObjectHandleOnStack result)
+extern "C" void QCALLTYPE RuntimeFieldHandle_GetValue(FieldDesc* fieldDesc, QCall::ObjectHandleOnStack instance, QCall::TypeHandle fieldType, QCall::TypeHandle declaringType, BOOL* pIsClassInitialized, QCall::ObjectHandleOnStack result, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -45,7 +45,7 @@ extern "C" void QCALLTYPE RuntimeFieldHandle_GetValue(FieldDesc* fieldDesc, QCal
END_QCALL;
}
-extern "C" void QCALLTYPE RuntimeFieldHandle_SetValue(FieldDesc* fieldDesc, QCall::ObjectHandleOnStack instance, QCall::ObjectHandleOnStack value, QCall::TypeHandle fieldType, QCall::TypeHandle declaringType, BOOL* pIsClassInitialized)
+extern "C" void QCALLTYPE RuntimeFieldHandle_SetValue(FieldDesc* fieldDesc, QCall::ObjectHandleOnStack instance, QCall::ObjectHandleOnStack value, QCall::TypeHandle fieldType, QCall::TypeHandle declaringType, BOOL* pIsClassInitialized, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -73,7 +73,8 @@ extern "C" void QCALLTYPE RuntimeTypeHandle_CreateInstanceForAnotherGenericParam
QCall::TypeHandle pTypeHandle,
TypeHandle* pInstArray,
INT32 cInstArray,
- QCall::ObjectHandleOnStack pInstantiatedObject
+ QCall::ObjectHandleOnStack pInstantiatedObject,
+ QCallExceptionStatus* qcallError
)
{
CONTRACTL
@@ -118,7 +119,7 @@ extern "C" void QCALLTYPE RuntimeTypeHandle_CreateInstanceForAnotherGenericParam
END_QCALL;
}
-extern "C" void QCALLTYPE RuntimeTypeHandle_InternalAlloc(MethodTable* pMT, QCall::ObjectHandleOnStack allocated)
+extern "C" void QCALLTYPE RuntimeTypeHandle_InternalAlloc(MethodTable* pMT, QCall::ObjectHandleOnStack allocated, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -133,7 +134,7 @@ extern "C" void QCALLTYPE RuntimeTypeHandle_InternalAlloc(MethodTable* pMT, QCal
END_QCALL;
}
-extern "C" void QCALLTYPE RuntimeTypeHandle_InternalAllocNoChecks(MethodTable* pMT, QCall::ObjectHandleOnStack allocated)
+extern "C" void QCALLTYPE RuntimeTypeHandle_InternalAllocNoChecks(MethodTable* pMT, QCall::ObjectHandleOnStack allocated, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -329,12 +330,14 @@ extern "C" void QCALLTYPE RuntimeMethodHandle_InvokeMethod(
PVOID* args, // An array of byrefs
QCall::ObjectHandleOnStack pSig,
BOOL fConstructor,
- QCall::ObjectHandleOnStack result)
+ QCall::ObjectHandleOnStack result,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
+ Thread * pThread = GetThread();
GCX_COOP();
struct
@@ -398,8 +401,6 @@ extern "C" void QCALLTYPE RuntimeMethodHandle_InvokeMethod(
// Note that SizeOfFrameArgumentArray does overflow checks with sufficient margin to prevent overflows here
SIZE_T nAllocaSize = TransitionBlock::GetNegSpaceSize() + sizeof(TransitionBlock) + nStackBytes;
- Thread * pThread = GET_THREAD();
-
LPBYTE pAlloc = (LPBYTE)_alloca(nAllocaSize);
LPBYTE pTransitionBlock = pAlloc + TransitionBlock::GetNegSpaceSize();
@@ -792,7 +793,7 @@ static StackWalkAction SkipMethods(CrawlFrame* frame, VOID* data) {
}
// Return the MethodInfo that represents the current method (two above this one)
-extern "C" MethodDesc* QCALLTYPE MethodBase_GetCurrentMethod(QCall::StackCrawlMarkHandle stackMark) {
+extern "C" MethodDesc* QCALLTYPE MethodBase_GetCurrentMethod(QCall::StackCrawlMarkHandle stackMark, QCallExceptionStatus* qcallError) {
QCALL_CONTRACT;
@@ -841,7 +842,7 @@ static OBJECTREF DirectObjectFieldGet(FieldDesc *pField, TypeHandle fieldType, T
return refRet;
}
-extern "C" void QCALLTYPE RuntimeFieldHandle_GetValueDirect(FieldDesc* fieldDesc, TypedByRef *pTarget, QCall::TypeHandle fieldTypeHandle, QCall::TypeHandle declaringTypeHandle, QCall::ObjectHandleOnStack result)
+extern "C" void QCALLTYPE RuntimeFieldHandle_GetValueDirect(FieldDesc* fieldDesc, TypedByRef *pTarget, QCall::TypeHandle fieldTypeHandle, QCall::TypeHandle declaringTypeHandle, QCall::ObjectHandleOnStack result, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -946,7 +947,7 @@ static void DirectObjectFieldSet(FieldDesc *pField, TypeHandle fieldType, TypeHa
GCPROTECT_END();
}
-extern "C" void QCALLTYPE RuntimeFieldHandle_SetValueDirect(FieldDesc* fieldDesc, TypedByRef *pTarget, QCall::ObjectHandleOnStack newValue, QCall::TypeHandle fieldTypeHandle, QCall::TypeHandle declaringType)
+extern "C" void QCALLTYPE RuntimeFieldHandle_SetValueDirect(FieldDesc* fieldDesc, TypedByRef *pTarget, QCall::ObjectHandleOnStack newValue, QCall::TypeHandle fieldTypeHandle, QCall::TypeHandle declaringType, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1190,7 +1191,7 @@ FCIMPLEND
// Returns the address of the EnC instance field in the object (This is an interior
// pointer and the caller has to use it appropriately) or an EnC static field.
-extern "C" void* QCALLTYPE RuntimeFieldHandle_GetEnCFieldAddr(QCall::ObjectHandleOnStack target, FieldDesc* pFD)
+extern "C" void* QCALLTYPE RuntimeFieldHandle_GetEnCFieldAddr(QCall::ObjectHandleOnStack target, FieldDesc* pFD, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -1217,7 +1218,7 @@ extern "C" void* QCALLTYPE RuntimeFieldHandle_GetEnCFieldAddr(QCall::ObjectHandl
return ret;
}
-extern "C" BOOL QCALLTYPE RuntimeFieldHandle_GetRVAFieldInfo(FieldDesc* pField, void** address, UINT* size)
+extern "C" BOOL QCALLTYPE RuntimeFieldHandle_GetRVAFieldInfo(FieldDesc* pField, void** address, UINT* size, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1237,7 +1238,7 @@ extern "C" BOOL QCALLTYPE RuntimeFieldHandle_GetRVAFieldInfo(FieldDesc* pField,
return ret;
}
-extern "C" void QCALLTYPE RuntimeFieldHandle_GetFieldDataReference(FieldDesc* pField, QCall::ObjectHandleOnStack instance, QCall::ByteRefOnStack fieldDataRef)
+extern "C" void QCALLTYPE RuntimeFieldHandle_GetFieldDataReference(FieldDesc* pField, QCall::ObjectHandleOnStack instance, QCall::ByteRefOnStack fieldDataRef, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -1256,7 +1257,7 @@ extern "C" void QCALLTYPE RuntimeFieldHandle_GetFieldDataReference(FieldDesc* pF
END_QCALL;
}
-extern "C" void QCALLTYPE ReflectionInvocation_CompileMethod(MethodDesc * pMD)
+extern "C" void QCALLTYPE ReflectionInvocation_CompileMethod(MethodDesc * pMD, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1264,7 +1265,10 @@ extern "C" void QCALLTYPE ReflectionInvocation_CompileMethod(MethodDesc * pMD)
PRECONDITION(pMD != NULL);
if (!pMD->ShouldCallPrestub())
+ {
+ *qcallError = 0;
return;
+ }
BEGIN_QCALL;
pMD->DoPrestub(NULL);
@@ -1272,18 +1276,24 @@ extern "C" void QCALLTYPE ReflectionInvocation_CompileMethod(MethodDesc * pMD)
}
// This method triggers the class constructor for a give type
-extern "C" void QCALLTYPE ReflectionInvocation_RunClassConstructor(QCall::TypeHandle pType)
+extern "C" void QCALLTYPE ReflectionInvocation_RunClassConstructor(QCall::TypeHandle pType, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
TypeHandle typeHnd = pType.AsTypeHandle();
if (typeHnd.IsTypeDesc())
+ {
+ *qcallError = 0;
return;
+ }
MethodTable *pMT = typeHnd.AsMethodTable();
// The ContainsGenericVariables check is to preserve back-compat where we assume the generic type is already initialized
if (pMT->IsClassInited() || pMT->ContainsGenericVariables())
+ {
+ *qcallError = 0;
return;
+ }
BEGIN_QCALL;
pMT->CheckRestore();
@@ -1293,13 +1303,16 @@ extern "C" void QCALLTYPE ReflectionInvocation_RunClassConstructor(QCall::TypeHa
}
// This method triggers the module constructor for a given module
-extern "C" void QCALLTYPE ReflectionInvocation_RunModuleConstructor(QCall::ModuleHandle pModule)
+extern "C" void QCALLTYPE ReflectionInvocation_RunModuleConstructor(QCall::ModuleHandle pModule, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
Assembly *pAssembly = pModule->GetAssembly();
if (pAssembly != NULL && pAssembly->IsActive())
+ {
+ *qcallError = 0;
return;
+ }
BEGIN_QCALL;
pAssembly->EnsureActive();
@@ -1339,7 +1352,7 @@ static void PrepareMethodHelper(MethodDesc * pMD)
// This method triggers a given method to be jitted. CoreCLR implementation of this method triggers jiting of the given method only.
// It does not walk a subset of callgraph to provide CER guarantees.
-extern "C" void QCALLTYPE ReflectionInvocation_PrepareMethod(MethodDesc *pMD, TypeHandle *pInstantiation, UINT32 cInstantiation)
+extern "C" void QCALLTYPE ReflectionInvocation_PrepareMethod(MethodDesc *pMD, TypeHandle *pInstantiation, UINT32 cInstantiation, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -1392,7 +1405,7 @@ extern "C" void QCALLTYPE ReflectionInvocation_PrepareMethod(MethodDesc *pMD, Ty
// This method triggers target of a given method to be jitted.
// In the case of a multi-cast delegate, we rely on the fact that each individual component
// was prepared prior to the Combine.
-extern "C" void QCALLTYPE ReflectionInvocation_PrepareDelegate(QCall::ObjectHandleOnStack delegate)
+extern "C" void QCALLTYPE ReflectionInvocation_PrepareDelegate(QCall::ObjectHandleOnStack delegate, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1454,7 +1467,8 @@ extern "C" void QCALLTYPE ReflectionInvocation_InvokeDispMethod(
QCall::ObjectHandleOnStack byrefModifiers,
LCID lcid,
QCall::ObjectHandleOnStack namedParameters,
- QCall::ObjectHandleOnStack result)
+ QCall::ObjectHandleOnStack result,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1515,7 +1529,7 @@ extern "C" void QCALLTYPE ReflectionInvocation_InvokeDispMethod(
END_QCALL;
}
-extern "C" void QCALLTYPE ReflectionInvocation_GetComObjectGuid(QCall::ObjectHandleOnStack type, GUID* result)
+extern "C" void QCALLTYPE ReflectionInvocation_GetComObjectGuid(QCall::ObjectHandleOnStack type, GUID* result, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -1548,7 +1562,7 @@ extern "C" void QCALLTYPE ReflectionInvocation_GetComObjectGuid(QCall::ObjectHan
}
#endif // FEATURE_COMINTEROP
-extern "C" void QCALLTYPE ReflectionInvocation_GetGuid(MethodTable* pMT, GUID* result)
+extern "C" void QCALLTYPE ReflectionInvocation_GetGuid(MethodTable* pMT, GUID* result, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -1660,7 +1674,8 @@ extern "C" void QCALLTYPE RuntimeTypeHandle_GetActivationInfo(
void** pvAllocatorFirstArg,
PCODE* ppfnRefCtor,
PCODE* ppfnValueCtor,
- BOOL* pfCtorIsPublic
+ BOOL* pfCtorIsPublic,
+ QCallExceptionStatus* qcallError
)
{
CONTRACTL
@@ -1797,7 +1812,7 @@ extern "C" void QCALLTYPE RuntimeTypeHandle_GetActivationInfo(
* Given a ComClassFactory*, calls the COM allocator
* and returns a RCW.
*/
-extern "C" void QCALLTYPE RuntimeTypeHandle_AllocateComObject(void* pClassFactory, QCall::ObjectHandleOnStack result)
+extern "C" void QCALLTYPE RuntimeTypeHandle_AllocateComObject(void* pClassFactory, QCall::ObjectHandleOnStack result, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1829,7 +1844,8 @@ extern "C" void QCALLTYPE RuntimeTypeHandle_AllocateComObject(void* pClassFactor
extern "C" void QCALLTYPE ReflectionSerialization_GetCreateUninitializedObjectInfo(
QCall::TypeHandle pType,
PCODE* ppfnAllocator,
- void** pvAllocatorFirstArg)
+ void** pvAllocatorFirstArg,
+ QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -1881,7 +1897,7 @@ struct TempEnumValue
UINT64 value;
};
-extern "C" void QCALLTYPE Enum_GetValuesAndNames(QCall::TypeHandle pEnumType, QCall::ObjectHandleOnStack pReturnValues, QCall::ObjectHandleOnStack pReturnNames, BOOL fGetNames)
+extern "C" void QCALLTYPE Enum_GetValuesAndNames(QCall::TypeHandle pEnumType, QCall::ObjectHandleOnStack pReturnValues, QCall::ObjectHandleOnStack pReturnNames, BOOL fGetNames, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -2003,7 +2019,8 @@ extern "C" void QCALLTYPE ReflectionInvocation_GetBoxInfo(
PCODE* ppfnAllocator,
void** pvAllocatorFirstArg,
int32_t* pValueOffset,
- uint32_t* pValueSize)
+ uint32_t* pValueSize,
+ QCallExceptionStatus* qcallError)
{
CONTRACTL
{
diff --git a/src/coreclr/vm/reflectioninvocation.h b/src/coreclr/vm/reflectioninvocation.h
index cf75f5391f6d57..3d553fab1d1f80 100644
--- a/src/coreclr/vm/reflectioninvocation.h
+++ b/src/coreclr/vm/reflectioninvocation.h
@@ -48,15 +48,15 @@ class ReflectionInvocation
FCDECL0(static FC_BOOL_RET, TryEnsureSufficientExecutionStack);
};
-extern "C" void QCALLTYPE ReflectionInvocation_CompileMethod(MethodDesc * pMD);
+extern "C" void QCALLTYPE ReflectionInvocation_CompileMethod(MethodDesc * pMD, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE ReflectionInvocation_RunClassConstructor(QCall::TypeHandle pType);
+extern "C" void QCALLTYPE ReflectionInvocation_RunClassConstructor(QCall::TypeHandle pType, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE ReflectionInvocation_RunModuleConstructor(QCall::ModuleHandle pModule);
+extern "C" void QCALLTYPE ReflectionInvocation_RunModuleConstructor(QCall::ModuleHandle pModule, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE ReflectionInvocation_PrepareMethod(MethodDesc* pMD, TypeHandle *pInstantiation, UINT32 cInstantiation);
+extern "C" void QCALLTYPE ReflectionInvocation_PrepareMethod(MethodDesc* pMD, TypeHandle *pInstantiation, UINT32 cInstantiation, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE ReflectionInvocation_PrepareDelegate(QCall::ObjectHandleOnStack delegate);
+extern "C" void QCALLTYPE ReflectionInvocation_PrepareDelegate(QCall::ObjectHandleOnStack delegate, QCallExceptionStatus* qcallError);
#ifdef FEATURE_COMINTEROP
extern "C" void QCALLTYPE ReflectionInvocation_InvokeDispMethod(
@@ -68,23 +68,25 @@ extern "C" void QCALLTYPE ReflectionInvocation_InvokeDispMethod(
QCall::ObjectHandleOnStack byrefModifiers,
LCID lcid,
QCall::ObjectHandleOnStack namedParameters,
- QCall::ObjectHandleOnStack result);
+ QCall::ObjectHandleOnStack result,
+ QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE ReflectionInvocation_GetComObjectGuid(QCall::ObjectHandleOnStack type, GUID* result);
+extern "C" void QCALLTYPE ReflectionInvocation_GetComObjectGuid(QCall::ObjectHandleOnStack type, GUID* result, QCallExceptionStatus* qcallError);
#endif // FEATURE_COMINTEROP
-extern "C" void QCALLTYPE ReflectionInvocation_GetGuid(MethodTable* pMT, GUID* result);
+extern "C" void QCALLTYPE ReflectionInvocation_GetGuid(MethodTable* pMT, GUID* result, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE ReflectionSerialization_GetCreateUninitializedObjectInfo(QCall::TypeHandle pType, PCODE* ppfnAllocator, void** pvAllocatorFirstArg);
+extern "C" void QCALLTYPE ReflectionSerialization_GetCreateUninitializedObjectInfo(QCall::TypeHandle pType, PCODE* ppfnAllocator, void** pvAllocatorFirstArg, QCallExceptionStatus* qcallError);
extern "C" void QCALLTYPE ReflectionInvocation_GetBoxInfo(
QCall::TypeHandle pType,
PCODE* ppfnAllocator,
void** pvAllocatorFirstArg,
int32_t* pValueOffset,
- uint32_t* pValueSize);
+ uint32_t* pValueSize,
+ QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE Enum_GetValuesAndNames(QCall::TypeHandle pEnumType, QCall::ObjectHandleOnStack pReturnValues, QCall::ObjectHandleOnStack pReturnNames, BOOL fGetNames);
+extern "C" void QCALLTYPE Enum_GetValuesAndNames(QCall::TypeHandle pEnumType, QCall::ObjectHandleOnStack pReturnValues, QCall::ObjectHandleOnStack pReturnNames, BOOL fGetNames, QCallExceptionStatus* qcallError);
extern "C" int32_t QCALLTYPE ReflectionInvocation_SizeOf(QCall::TypeHandle pType);
diff --git a/src/coreclr/vm/runtimehandles.cpp b/src/coreclr/vm/runtimehandles.cpp
index 8a8e7f73a9b828..5dc686e5a71795 100644
--- a/src/coreclr/vm/runtimehandles.cpp
+++ b/src/coreclr/vm/runtimehandles.cpp
@@ -33,17 +33,17 @@
#include "finalizerthread.h"
#include "pregeneratedstringthunks.h"
-extern "C" BOOL QCALLTYPE MdUtf8String_EqualsCaseInsensitive(LPCUTF8 szLhs, LPCUTF8 szRhs, INT32 stringNumBytes)
+extern "C" BOOL QCALLTYPE MdUtf8String_EqualsCaseInsensitive(LPCUTF8 szLhs, LPCUTF8 szRhs, INT32 stringNumBytes, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
- // Important: the string in pSsz isn't null terminated so the length must be used
- // when performing operations on the string.
-
BOOL fStringsEqual = FALSE;
BEGIN_QCALL;
+ // Important: the string in pSsz isn't null terminated so the length must be used
+ // when performing operations on the string.
+
_ASSERTE(CheckPointer(szLhs));
_ASSERTE(CheckPointer(szRhs));
@@ -98,7 +98,8 @@ extern "C" BOOL QCALLTYPE RuntimeMethodHandle_IsCAVisibleFromDecoratedType(
QCall::TypeHandle targetTypeHandle,
MethodDesc * pTargetCtor,
QCall::TypeHandle sourceTypeHandle,
- QCall::ModuleHandle sourceModuleHandle)
+ QCall::ModuleHandle sourceModuleHandle,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -140,7 +141,8 @@ extern "C" BOOL QCALLTYPE RuntimeMethodHandle_IsCAVisibleFromDecoratedType(
extern "C" void QCALLTYPE RuntimeTypeHandle_GetRuntimeTypeFromHandleSlow(
EnregisteredTypeHandle typeHandleRaw,
- QCall::ObjectHandleOnStack result)
+ QCall::ObjectHandleOnStack result,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -158,7 +160,7 @@ extern "C" void QCALLTYPE RuntimeTypeHandle_GetRuntimeTypeFromHandleSlow(
}
#ifdef FEATURE_TYPEEQUIVALENCE
-extern "C" BOOL QCALLTYPE RuntimeTypeHandle_IsEquivalentTo(QCall::TypeHandle rtType1, QCall::TypeHandle rtType2)
+extern "C" BOOL QCALLTYPE RuntimeTypeHandle_IsEquivalentTo(QCall::TypeHandle rtType1, QCall::TypeHandle rtType2, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -232,7 +234,7 @@ FCIMPL1(AssemblyBaseObject*, RuntimeTypeHandle::GetAssemblyIfExists, ReflectClas
}
FCIMPLEND
-extern "C" void QCALLTYPE RuntimeTypeHandle_GetAssemblySlow(QCall::ObjectHandleOnStack type, QCall::ObjectHandleOnStack assembly)
+extern "C" void QCALLTYPE RuntimeTypeHandle_GetAssemblySlow(QCall::ObjectHandleOnStack type, QCall::ObjectHandleOnStack assembly, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -289,7 +291,7 @@ FCIMPL1(ReflectModuleBaseObject*, RuntimeTypeHandle::GetModuleIfExists, ReflectC
}
FCIMPLEND
-extern "C" void QCALLTYPE RuntimeTypeHandle_GetModuleSlow(QCall::ObjectHandleOnStack type, QCall::ObjectHandleOnStack module)
+extern "C" void QCALLTYPE RuntimeTypeHandle_GetModuleSlow(QCall::ObjectHandleOnStack type, QCall::ObjectHandleOnStack module, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -362,7 +364,7 @@ FCIMPL1(INT32, RuntimeTypeHandle::GetNumVirtuals, ReflectClassBaseObject* pTypeU
}
FCIMPLEND
-extern "C" INT32 QCALLTYPE RuntimeTypeHandle_GetNumVirtualsAndStaticVirtuals(QCall::TypeHandle pTypeHandle)
+extern "C" INT32 QCALLTYPE RuntimeTypeHandle_GetNumVirtualsAndStaticVirtuals(QCall::TypeHandle pTypeHandle, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -396,7 +398,7 @@ extern "C" INT32 QCALLTYPE RuntimeTypeHandle_GetNumVirtualsAndStaticVirtuals(QCa
return numVirtuals;
}
-extern "C" MethodDesc* QCALLTYPE RuntimeTypeHandle_GetMethodAt(MethodTable* pMT, INT32 slot)
+extern "C" MethodDesc* QCALLTYPE RuntimeTypeHandle_GetMethodAt(MethodTable* pMT, INT32 slot, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -455,7 +457,7 @@ extern "C" MethodDesc* QCALLTYPE RuntimeTypeHandle_GetMethodAt(MethodTable* pMT,
return pRetMethod;
}
-extern "C" BOOL QCALLTYPE RuntimeTypeHandle_GetFields(MethodTable* pMT, intptr_t* result, INT32* pCount)
+extern "C" BOOL QCALLTYPE RuntimeTypeHandle_GetFields(MethodTable* pMT, intptr_t* result, INT32* pCount, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -489,7 +491,7 @@ extern "C" BOOL QCALLTYPE RuntimeTypeHandle_GetFields(MethodTable* pMT, intptr_t
return retVal;
}
-extern "C" void QCALLTYPE RuntimeMethodHandle_ConstructInstantiation(MethodDesc * pMethod, DWORD format, QCall::StringHandleOnStack retString)
+extern "C" void QCALLTYPE RuntimeMethodHandle_ConstructInstantiation(MethodDesc * pMethod, DWORD format, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -502,7 +504,7 @@ extern "C" void QCALLTYPE RuntimeMethodHandle_ConstructInstantiation(MethodDesc
END_QCALL;
}
-extern "C" void QCALLTYPE RuntimeTypeHandle_ConstructName(QCall::TypeHandle pTypeHandle, DWORD format, QCall::StringHandleOnStack retString)
+extern "C" void QCALLTYPE RuntimeTypeHandle_ConstructName(QCall::TypeHandle pTypeHandle, DWORD format, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -515,7 +517,7 @@ extern "C" void QCALLTYPE RuntimeTypeHandle_ConstructName(QCall::TypeHandle pTyp
END_QCALL;
}
-extern "C" void QCALLTYPE RuntimeTypeHandle_GetInterfaces(MethodTable* pMT, QCall::ObjectHandleOnStack result)
+extern "C" void QCALLTYPE RuntimeTypeHandle_GetInterfaces(MethodTable* pMT, QCall::ObjectHandleOnStack result, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -596,7 +598,7 @@ static PTRARRAYREF CopyRuntimeTypeHandles(TypeHandle * prgTH, INT32 numTypeHandl
return refReturn;
}
-extern "C" void QCALLTYPE RuntimeTypeHandle_GetConstraints(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retTypeArray)
+extern "C" void QCALLTYPE RuntimeTypeHandle_GetConstraints(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retTypeArray, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -644,7 +646,7 @@ FCIMPL1(INT32, RuntimeTypeHandle::GetAttributes, ReflectClassBaseObject *pTypeUN
}
FCIMPLEND
-extern "C" void QCALLTYPE RuntimeTypeHandle_GetArgumentTypesFromFunctionPointer(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack argTypes)
+extern "C" void QCALLTYPE RuntimeTypeHandle_GetArgumentTypesFromFunctionPointer(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack argTypes, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -706,7 +708,7 @@ FCIMPL1(FC_BOOL_RET, RuntimeTypeHandle::IsUnmanagedFunctionPointer, ReflectClass
}
FCIMPLEND
-extern "C" BOOL QCALLTYPE RuntimeTypeHandle_IsVisible(QCall::TypeHandle pTypeHandle)
+extern "C" BOOL QCALLTYPE RuntimeTypeHandle_IsVisible(QCall::TypeHandle pTypeHandle, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -775,7 +777,7 @@ FCIMPL1(INT32, RuntimeTypeHandle::GetToken, ReflectClassBaseObject *pTypeUNSAFE)
}
FCIMPLEND
-extern "C" PVOID QCALLTYPE QCall_GetGCHandleForTypeHandle(QCall::TypeHandle pTypeHandle, INT32 handleType)
+extern "C" PVOID QCALLTYPE QCall_GetGCHandleForTypeHandle(QCall::TypeHandle pTypeHandle, INT32 handleType, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -796,7 +798,7 @@ extern "C" PVOID QCALLTYPE QCall_GetGCHandleForTypeHandle(QCall::TypeHandle pTyp
return objHandle;
}
-extern "C" void QCALLTYPE QCall_FreeGCHandleForTypeHandle(QCall::TypeHandle pTypeHandle, OBJECTHANDLE objHandle)
+extern "C" void QCALLTYPE QCall_FreeGCHandleForTypeHandle(QCall::TypeHandle pTypeHandle, OBJECTHANDLE objHandle, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -811,7 +813,7 @@ extern "C" void QCALLTYPE QCall_FreeGCHandleForTypeHandle(QCall::TypeHandle pTyp
END_QCALL;
}
-extern "C" void QCALLTYPE RuntimeTypeHandle_VerifyInterfaceIsImplemented(QCall::TypeHandle pTypeHandle, QCall::TypeHandle pIFaceHandle)
+extern "C" void QCALLTYPE RuntimeTypeHandle_VerifyInterfaceIsImplemented(QCall::TypeHandle pTypeHandle, QCall::TypeHandle pIFaceHandle, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -847,7 +849,7 @@ extern "C" void QCALLTYPE RuntimeTypeHandle_VerifyInterfaceIsImplemented(QCall::
END_QCALL;
}
-extern "C" MethodDesc* QCALLTYPE RuntimeTypeHandle_GetInterfaceMethodImplementation(QCall::TypeHandle pTypeHandle, QCall::TypeHandle pOwner, MethodDesc * pMD)
+extern "C" MethodDesc* QCALLTYPE RuntimeTypeHandle_GetInterfaceMethodImplementation(QCall::TypeHandle pTypeHandle, QCall::TypeHandle pOwner, MethodDesc * pMD, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -883,7 +885,7 @@ extern "C" MethodDesc* QCALLTYPE RuntimeTypeHandle_GetInterfaceMethodImplementat
return pResult;
}
-extern "C" void QCALLTYPE RuntimeTypeHandle_GetDeclaringMethodForGenericParameter(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack result)
+extern "C" void QCALLTYPE RuntimeTypeHandle_GetDeclaringMethodForGenericParameter(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack result, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -905,7 +907,7 @@ extern "C" void QCALLTYPE RuntimeTypeHandle_GetDeclaringMethodForGenericParamete
END_QCALL;
}
-extern "C" EnregisteredTypeHandle QCALLTYPE RuntimeTypeHandle_GetDeclaringTypeHandleForGenericVariable(EnregisteredTypeHandle pTypeHandle)
+extern "C" EnregisteredTypeHandle QCALLTYPE RuntimeTypeHandle_GetDeclaringTypeHandleForGenericVariable(EnregisteredTypeHandle pTypeHandle, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -950,7 +952,7 @@ extern "C" EnregisteredTypeHandle QCALLTYPE RuntimeTypeHandle_GetDeclaringTypeHa
return (EnregisteredTypeHandle)retTypeHandle.AsTAddr();
}
-extern "C" EnregisteredTypeHandle QCALLTYPE RuntimeTypeHandle_GetDeclaringTypeHandle(EnregisteredTypeHandle pTypeHandle)
+extern "C" EnregisteredTypeHandle QCALLTYPE RuntimeTypeHandle_GetDeclaringTypeHandle(EnregisteredTypeHandle pTypeHandle, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -984,7 +986,7 @@ extern "C" EnregisteredTypeHandle QCALLTYPE RuntimeTypeHandle_GetDeclaringTypeHa
return (EnregisteredTypeHandle)retTypeHandle.AsTAddr();
}
-extern "C" BOOL QCALLTYPE RuntimeTypeHandle_SatisfiesConstraints(QCall::TypeHandle paramType, QCall::TypeHandle typeContext, MethodDesc* methodContext, QCall::TypeHandle toType)
+extern "C" BOOL QCALLTYPE RuntimeTypeHandle_SatisfiesConstraints(QCall::TypeHandle paramType, QCall::TypeHandle typeContext, MethodDesc* methodContext, QCall::TypeHandle toType, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
@@ -1017,7 +1019,7 @@ extern "C" BOOL QCALLTYPE RuntimeTypeHandle_SatisfiesConstraints(QCall::TypeHand
return bResult;
}
-extern "C" void QCALLTYPE RuntimeTypeHandle_GetInstantiation(QCall::TypeHandle pType, QCall::ObjectHandleOnStack retTypes, BOOL fAsRuntimeTypeArray)
+extern "C" void QCALLTYPE RuntimeTypeHandle_GetInstantiation(QCall::TypeHandle pType, QCall::ObjectHandleOnStack retTypes, BOOL fAsRuntimeTypeArray, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1032,7 +1034,7 @@ extern "C" void QCALLTYPE RuntimeTypeHandle_GetInstantiation(QCall::TypeHandle p
return;
}
-extern "C" void QCALLTYPE RuntimeTypeHandle_MakeArray(QCall::TypeHandle pTypeHandle, INT32 rank, QCall::ObjectHandleOnStack retType)
+extern "C" void QCALLTYPE RuntimeTypeHandle_MakeArray(QCall::TypeHandle pTypeHandle, INT32 rank, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1047,7 +1049,7 @@ extern "C" void QCALLTYPE RuntimeTypeHandle_MakeArray(QCall::TypeHandle pTypeHan
return;
}
-extern "C" void QCALLTYPE RuntimeTypeHandle_MakeSZArray(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType)
+extern "C" void QCALLTYPE RuntimeTypeHandle_MakeSZArray(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1062,7 +1064,7 @@ extern "C" void QCALLTYPE RuntimeTypeHandle_MakeSZArray(QCall::TypeHandle pTypeH
return;
}
-extern "C" void QCALLTYPE RuntimeTypeHandle_MakePointer(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType)
+extern "C" void QCALLTYPE RuntimeTypeHandle_MakePointer(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1077,7 +1079,7 @@ extern "C" void QCALLTYPE RuntimeTypeHandle_MakePointer(QCall::TypeHandle pTypeH
return;
}
-extern "C" void QCALLTYPE RuntimeTypeHandle_MakeByRef(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType)
+extern "C" void QCALLTYPE RuntimeTypeHandle_MakeByRef(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1092,7 +1094,7 @@ extern "C" void QCALLTYPE RuntimeTypeHandle_MakeByRef(QCall::TypeHandle pTypeHan
return;
}
-extern "C" void QCALLTYPE RuntimeTypeHandle_MakeFunctionPointer(TypeHandle* pRetAndArgTypes, INT32 numArgs, BOOL isUnmanaged, QCall::ObjectHandleOnStack retType)
+extern "C" void QCALLTYPE RuntimeTypeHandle_MakeFunctionPointer(TypeHandle* pRetAndArgTypes, INT32 numArgs, BOOL isUnmanaged, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1108,7 +1110,7 @@ extern "C" void QCALLTYPE RuntimeTypeHandle_MakeFunctionPointer(TypeHandle* pRet
return;
}
-extern "C" void QCALLTYPE RuntimeTypeHandle_Instantiate(QCall::TypeHandle pTypeHandle, TypeHandle * pInstArray, INT32 cInstArray, QCall::ObjectHandleOnStack retType)
+extern "C" void QCALLTYPE RuntimeTypeHandle_Instantiate(QCall::TypeHandle pTypeHandle, TypeHandle * pInstArray, INT32 cInstArray, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1123,7 +1125,7 @@ extern "C" void QCALLTYPE RuntimeTypeHandle_Instantiate(QCall::TypeHandle pTypeH
return;
}
-extern "C" void QCALLTYPE RuntimeTypeHandle_GetGenericTypeDefinition(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType)
+extern "C" void QCALLTYPE RuntimeTypeHandle_GetGenericTypeDefinition(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1222,7 +1224,7 @@ FCIMPL1(FC_BOOL_RET, RuntimeTypeHandle::ContainsGenericVariables, PTR_ReflectCla
}
FCIMPLEND
-extern "C" void* QCALLTYPE RuntimeTypeHandle_AllocateTypeAssociatedMemory(QCall::TypeHandle type, uint32_t size)
+extern "C" void* QCALLTYPE RuntimeTypeHandle_AllocateTypeAssociatedMemory(QCall::TypeHandle type, uint32_t size, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1245,7 +1247,7 @@ extern "C" void* QCALLTYPE RuntimeTypeHandle_AllocateTypeAssociatedMemory(QCall:
return allocatedMemory;
}
-extern "C" void* QCALLTYPE RuntimeTypeHandle_AllocateTypeAssociatedMemoryAligned(QCall::TypeHandle type, uint32_t size, uint32_t alignment)
+extern "C" void* QCALLTYPE RuntimeTypeHandle_AllocateTypeAssociatedMemoryAligned(QCall::TypeHandle type, uint32_t size, uint32_t alignment, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1271,7 +1273,7 @@ extern "C" void* QCALLTYPE RuntimeTypeHandle_AllocateTypeAssociatedMemoryAligned
return allocatedMemory;
}
-extern "C" void QCALLTYPE RuntimeTypeHandle_RegisterCollectibleTypeDependency(QCall::TypeHandle pTypeHandle, QCall::AssemblyHandle pAssembly)
+extern "C" void QCALLTYPE RuntimeTypeHandle_RegisterCollectibleTypeDependency(QCall::TypeHandle pTypeHandle, QCall::AssemblyHandle pAssembly, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1298,7 +1300,7 @@ extern "C" void QCALLTYPE RuntimeTypeHandle_RegisterCollectibleTypeDependency(QC
//***********************************************************************************
//***********************************************************************************
-extern "C" void * QCALLTYPE RuntimeMethodHandle_GetFunctionPointer(MethodDesc * pMethod)
+extern "C" void * QCALLTYPE RuntimeMethodHandle_GetFunctionPointer(MethodDesc * pMethod, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1480,7 +1482,8 @@ extern "C" void QCALLTYPE Signature_GetCustomModifiersAtOffset(
QCall::ObjectHandleOnStack sigObj,
INT32 offset,
BOOL fRequired,
- QCall::ObjectHandleOnStack result)
+ QCall::ObjectHandleOnStack result,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1604,7 +1607,8 @@ extern "C" void QCALLTYPE Signature_Init(
QCall::ObjectHandleOnStack sigObj,
PCCOR_SIGNATURE pCorSig, DWORD cCorSig,
FieldDesc* pFieldDesc,
- MethodDesc* pMethodDesc)
+ MethodDesc* pMethodDesc,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1705,7 +1709,8 @@ extern "C" void QCALLTYPE Signature_Init(
extern "C" BOOL QCALLTYPE Signature_AreEqual(
PCCOR_SIGNATURE sig1, INT32 cSig1, QCall::TypeHandle handle1,
- PCCOR_SIGNATURE sig2, INT32 cSig2, QCall::TypeHandle handle2)
+ PCCOR_SIGNATURE sig2, INT32 cSig2, QCall::TypeHandle handle2,
+ QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1723,7 +1728,7 @@ extern "C" BOOL QCALLTYPE Signature_AreEqual(
return ret;
}
-extern "C" void QCALLTYPE RuntimeMethodHandle_GetMethodInstantiation(MethodDesc * pMethod, QCall::ObjectHandleOnStack retTypes, BOOL fAsRuntimeTypeArray)
+extern "C" void QCALLTYPE RuntimeMethodHandle_GetMethodInstantiation(MethodDesc * pMethod, QCall::ObjectHandleOnStack retTypes, BOOL fAsRuntimeTypeArray, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1783,7 +1788,7 @@ FCIMPL1(Object*, RuntimeMethodHandle::GetResolver, MethodDesc * pMethod)
}
FCIMPLEND
-extern "C" void QCALLTYPE RuntimeMethodHandle_Destroy(MethodDesc * pMethod)
+extern "C" void QCALLTYPE RuntimeMethodHandle_Destroy(MethodDesc * pMethod, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
_ASSERTE(pMethod != NULL);
@@ -1827,7 +1832,7 @@ FCIMPL1(FC_BOOL_RET, RuntimeMethodHandle::IsTypicalMethodDefinition, ReflectMeth
}
FCIMPLEND
-extern "C" void QCALLTYPE RuntimeMethodHandle_GetTypicalMethodDefinition(MethodDesc * pMethod, QCall::ObjectHandleOnStack refMethod)
+extern "C" void QCALLTYPE RuntimeMethodHandle_GetTypicalMethodDefinition(MethodDesc * pMethod, QCall::ObjectHandleOnStack refMethod, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1849,7 +1854,7 @@ extern "C" void QCALLTYPE RuntimeMethodHandle_GetTypicalMethodDefinition(MethodD
return;
}
-extern "C" void QCALLTYPE RuntimeMethodHandle_StripMethodInstantiation(MethodDesc * pMethod, QCall::ObjectHandleOnStack refMethod)
+extern "C" void QCALLTYPE RuntimeMethodHandle_StripMethodInstantiation(MethodDesc * pMethod, QCall::ObjectHandleOnStack refMethod, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -1934,7 +1939,7 @@ FCIMPL2(MethodDesc*, RuntimeMethodHandle::GetStubIfNeededInternal,
FCIMPLEND
// See RuntimeMethodHandle::GetStubIfNeededInternal for more details.
-extern "C" MethodDesc* QCALLTYPE RuntimeMethodHandle_GetStubIfNeededSlow(MethodDesc* pMethod, QCall::TypeHandle declaringTypeHandle, QCall::ObjectHandleOnStack methodInstantiation)
+extern "C" MethodDesc* QCALLTYPE RuntimeMethodHandle_GetStubIfNeededSlow(MethodDesc* pMethod, QCall::TypeHandle declaringTypeHandle, QCall::ObjectHandleOnStack methodInstantiation, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -2001,7 +2006,7 @@ FCIMPL2(MethodDesc*, RuntimeMethodHandle::GetMethodFromCanonical, MethodDesc *pM
}
FCIMPLEND
-extern "C" PCODE QCALLTYPE RuntimeMethodHandle_GetNativeCode(MethodDesc* pMethod)
+extern "C" PCODE QCALLTYPE RuntimeMethodHandle_GetNativeCode(MethodDesc* pMethod, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -2028,7 +2033,7 @@ extern "C" PCODE QCALLTYPE RuntimeMethodHandle_GetNativeCode(MethodDesc* pMethod
return result;
}
-extern "C" void QCALLTYPE RuntimeMethodHandle_GetMethodBody(MethodDesc* pMethod, QCall::TypeHandle pDeclaringType, QCall::ObjectHandleOnStack result)
+extern "C" void QCALLTYPE RuntimeMethodHandle_GetMethodBody(MethodDesc* pMethod, QCall::TypeHandle pDeclaringType, QCall::ObjectHandleOnStack result, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -2327,7 +2332,7 @@ FCIMPL1(INT32, AssemblyHandle::GetTokenInternal, AssemblyBaseObject* pAssemblyUN
}
FCIMPLEND
-extern "C" void QCALLTYPE AssemblyHandle_GetManifestModuleSlow(QCall::ObjectHandleOnStack assembly, QCall::ObjectHandleOnStack module)
+extern "C" void QCALLTYPE AssemblyHandle_GetManifestModuleSlow(QCall::ObjectHandleOnStack assembly, QCall::ObjectHandleOnStack module, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -2342,7 +2347,7 @@ extern "C" void QCALLTYPE AssemblyHandle_GetManifestModuleSlow(QCall::ObjectHand
END_QCALL;
}
-extern "C" void QCALLTYPE ModuleHandle_GetPEKind(QCall::ModuleHandle pModule, DWORD* pdwPEKind, DWORD* pdwMachine)
+extern "C" void QCALLTYPE ModuleHandle_GetPEKind(QCall::ModuleHandle pModule, DWORD* pdwPEKind, DWORD* pdwMachine, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -2358,7 +2363,7 @@ extern "C" INT32 QCALLTYPE ModuleHandle_GetMDStreamVersion(QCall::ModuleHandle p
return pModule->GetMDImport()->GetMetadataStreamVersion();
}
-extern "C" void QCALLTYPE ModuleHandle_GetModuleType(QCall::ModuleHandle pModule, QCall::ObjectHandleOnStack retType)
+extern "C" void QCALLTYPE ModuleHandle_GetModuleType(QCall::ModuleHandle pModule, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -2390,7 +2395,7 @@ extern "C" INT32 QCALLTYPE ModuleHandle_GetToken(QCall::ModuleHandle pModule)
return pModule->GetMDImport()->GetModuleFromScope();
}
-extern "C" void QCALLTYPE ModuleHandle_ResolveType(QCall::ModuleHandle pModule, INT32 tkType, TypeHandle *typeArgs, INT32 typeArgsCount, TypeHandle *methodArgs, INT32 methodArgsCount, QCall::ObjectHandleOnStack retType)
+extern "C" void QCALLTYPE ModuleHandle_ResolveType(QCall::ModuleHandle pModule, INT32 tkType, TypeHandle *typeArgs, INT32 typeArgsCount, TypeHandle *methodArgs, INT32 methodArgsCount, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -2411,7 +2416,7 @@ extern "C" void QCALLTYPE ModuleHandle_ResolveType(QCall::ModuleHandle pModule,
return;
}
-extern "C" MethodDesc *QCALLTYPE ModuleHandle_ResolveMethod(QCall::ModuleHandle pModule, INT32 tkMemberRef, TypeHandle *typeArgs, INT32 typeArgsCount, TypeHandle *methodArgs, INT32 methodArgsCount)
+extern "C" MethodDesc *QCALLTYPE ModuleHandle_ResolveMethod(QCall::ModuleHandle pModule, INT32 tkMemberRef, TypeHandle *typeArgs, INT32 typeArgsCount, TypeHandle *methodArgs, INT32 methodArgsCount, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -2432,7 +2437,7 @@ extern "C" MethodDesc *QCALLTYPE ModuleHandle_ResolveMethod(QCall::ModuleHandle
return pMD;
}
-extern "C" void QCALLTYPE ModuleHandle_ResolveField(QCall::ModuleHandle pModule, INT32 tkMemberRef, TypeHandle *typeArgs, INT32 typeArgsCount, TypeHandle *methodArgs, INT32 methodArgsCount, QCall::ObjectHandleOnStack retField)
+extern "C" void QCALLTYPE ModuleHandle_ResolveField(QCall::ModuleHandle pModule, INT32 tkMemberRef, TypeHandle *typeArgs, INT32 typeArgsCount, TypeHandle *methodArgs, INT32 methodArgsCount, QCall::ObjectHandleOnStack retField, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -2450,7 +2455,7 @@ extern "C" void QCALLTYPE ModuleHandle_ResolveField(QCall::ModuleHandle pModule,
return;
}
-extern "C" void QCALLTYPE ModuleHandle_GetDynamicMethod(QCall::ModuleHandle pModule, const char* name, byte* sig, INT32 sigLen, QCall::ObjectHandleOnStack resolver, QCall::ObjectHandleOnStack result)
+extern "C" void QCALLTYPE ModuleHandle_GetDynamicMethod(QCall::ModuleHandle pModule, const char* name, byte* sig, INT32 sigLen, QCall::ObjectHandleOnStack resolver, QCall::ObjectHandleOnStack result, QCallExceptionStatus* qcallError)
{
CONTRACTL
{
diff --git a/src/coreclr/vm/runtimehandles.h b/src/coreclr/vm/runtimehandles.h
index 1ac8932778ef8a..0d366b257f5ab1 100644
--- a/src/coreclr/vm/runtimehandles.h
+++ b/src/coreclr/vm/runtimehandles.h
@@ -96,7 +96,7 @@ class RuntimeLocalVariableInfo : public Object
CLR_BOOL _isPinned;
};
-extern "C" BOOL QCALLTYPE MdUtf8String_EqualsCaseInsensitive(LPCUTF8 szLhs, LPCUTF8 szRhs, INT32 stringNumBytes);
+extern "C" BOOL QCALLTYPE MdUtf8String_EqualsCaseInsensitive(LPCUTF8 szLhs, LPCUTF8 szRhs, INT32 stringNumBytes, QCallExceptionStatus* qcallError);
class RuntimeTypeHandle
{
@@ -129,19 +129,19 @@ class RuntimeTypeHandle
FCDECL1(static void, GetNextIntroducedMethod, MethodDesc **ppMethod);
};
-extern "C" void QCALLTYPE RuntimeTypeHandle_GetRuntimeTypeFromHandleSlow(void* typeHandleRaw, QCall::ObjectHandleOnStack result);
+extern "C" void QCALLTYPE RuntimeTypeHandle_GetRuntimeTypeFromHandleSlow(void* typeHandleRaw, QCall::ObjectHandleOnStack result, QCallExceptionStatus* qcallError);
#ifdef FEATURE_TYPEEQUIVALENCE
-extern "C" BOOL QCALLTYPE RuntimeTypeHandle_IsEquivalentTo(QCall::TypeHandle rtType1, QCall::TypeHandle rtType2);
+extern "C" BOOL QCALLTYPE RuntimeTypeHandle_IsEquivalentTo(QCall::TypeHandle rtType1, QCall::TypeHandle rtType2, QCallExceptionStatus* qcallError);
#endif // FEATURE_TYPEEQUIVALENCE
-extern "C" void QCALLTYPE RuntimeTypeHandle_CreateInstanceForAnotherGenericParameter(QCall::TypeHandle pTypeHandle, TypeHandle *pInstArray, INT32 cInstArray, QCall::ObjectHandleOnStack pInstantiatedObject);
-extern "C" void QCALLTYPE RuntimeTypeHandle_InternalAlloc(MethodTable* pMT, QCall::ObjectHandleOnStack allocated);
+extern "C" void QCALLTYPE RuntimeTypeHandle_CreateInstanceForAnotherGenericParameter(QCall::TypeHandle pTypeHandle, TypeHandle *pInstArray, INT32 cInstArray, QCall::ObjectHandleOnStack pInstantiatedObject, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeTypeHandle_InternalAlloc(MethodTable* pMT, QCall::ObjectHandleOnStack allocated, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE RuntimeTypeHandle_InternalAllocNoChecks(MethodTable* pMT, QCall::ObjectHandleOnStack allocated);
-extern "C" void* QCALLTYPE RuntimeTypeHandle_AllocateTypeAssociatedMemory(QCall::TypeHandle type, uint32_t size);
-extern "C" void* QCALLTYPE RuntimeTypeHandle_AllocateTypeAssociatedMemoryAligned(QCall::TypeHandle type, uint32_t size, uint32_t alignment);
+extern "C" void QCALLTYPE RuntimeTypeHandle_InternalAllocNoChecks(MethodTable* pMT, QCall::ObjectHandleOnStack allocated, QCallExceptionStatus* qcallError);
+extern "C" void* QCALLTYPE RuntimeTypeHandle_AllocateTypeAssociatedMemory(QCall::TypeHandle type, uint32_t size, QCallExceptionStatus* qcallError);
+extern "C" void* QCALLTYPE RuntimeTypeHandle_AllocateTypeAssociatedMemoryAligned(QCall::TypeHandle type, uint32_t size, uint32_t alignment, QCallExceptionStatus* qcallError);
-extern "C" PVOID QCALLTYPE QCall_GetGCHandleForTypeHandle(QCall::TypeHandle pTypeHandle, INT32 handleType);
-extern "C" void QCALLTYPE QCall_FreeGCHandleForTypeHandle(QCall::TypeHandle pTypeHandle, OBJECTHANDLE objHandle);
+extern "C" PVOID QCALLTYPE QCall_GetGCHandleForTypeHandle(QCall::TypeHandle pTypeHandle, INT32 handleType, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE QCall_FreeGCHandleForTypeHandle(QCall::TypeHandle pTypeHandle, OBJECTHANDLE objHandle, QCallExceptionStatus* qcallError);
extern "C" void QCALLTYPE RuntimeTypeHandle_GetActivationInfo(
QCall::ObjectHandleOnStack pRuntimeType,
@@ -149,36 +149,37 @@ extern "C" void QCALLTYPE RuntimeTypeHandle_GetActivationInfo(
void** pvAllocatorFirstArg,
PCODE* ppfnCtor,
PCODE* ppfnValueCtor,
- BOOL* pfCtorIsPublic);
+ BOOL* pfCtorIsPublic,
+ QCallExceptionStatus* qcallError);
#ifdef FEATURE_COMINTEROP
-extern "C" void QCALLTYPE RuntimeTypeHandle_AllocateComObject(void* pClassFactory, QCall::ObjectHandleOnStack result);
+extern "C" void QCALLTYPE RuntimeTypeHandle_AllocateComObject(void* pClassFactory, QCall::ObjectHandleOnStack result, QCallExceptionStatus* qcallError);
#endif // FEATURE_COMINTEROP
-extern "C" void QCALLTYPE RuntimeTypeHandle_MakeByRef(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType);
-extern "C" void QCALLTYPE RuntimeTypeHandle_MakePointer(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType);
-extern "C" void QCALLTYPE RuntimeTypeHandle_MakeSZArray(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType);
-extern "C" void QCALLTYPE RuntimeTypeHandle_MakeArray(QCall::TypeHandle pTypeHandle, INT32 rank, QCall::ObjectHandleOnStack retType);
-extern "C" void QCALLTYPE RuntimeTypeHandle_MakeFunctionPointer(TypeHandle* pRetAndArgTypes, INT32 numArgs, BOOL isUnmanaged, QCall::ObjectHandleOnStack retType);
+extern "C" void QCALLTYPE RuntimeTypeHandle_MakeByRef(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeTypeHandle_MakePointer(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeTypeHandle_MakeSZArray(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeTypeHandle_MakeArray(QCall::TypeHandle pTypeHandle, INT32 rank, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeTypeHandle_MakeFunctionPointer(TypeHandle* pRetAndArgTypes, INT32 numArgs, BOOL isUnmanaged, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError);
extern "C" void QCALLTYPE RuntimeTypeHandle_PrepareMemberInfoCache(QCall::TypeHandle pMemberInfoCache);
-extern "C" void QCALLTYPE RuntimeTypeHandle_ConstructName(QCall::TypeHandle pTypeHandle, DWORD format, QCall::StringHandleOnStack retString);
-extern "C" void QCALLTYPE RuntimeTypeHandle_GetInterfaces(MethodTable* pMT, QCall::ObjectHandleOnStack result);
-extern "C" BOOL QCALLTYPE RuntimeTypeHandle_IsVisible(QCall::TypeHandle pTypeHandle);
-extern "C" BOOL QCALLTYPE RuntimeTypeHandle_SatisfiesConstraints(QCall::TypeHandle paramType, QCall::TypeHandle typeContext, MethodDesc* methodContext, QCall::TypeHandle toType);
-extern "C" void QCALLTYPE RuntimeTypeHandle_GetInstantiation(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType, BOOL fAsRuntimeTypeArray);
-extern "C" void QCALLTYPE RuntimeTypeHandle_Instantiate(QCall::TypeHandle pTypeHandle, TypeHandle * pInstArray, INT32 cInstArray, QCall::ObjectHandleOnStack retType);
-extern "C" void QCALLTYPE RuntimeTypeHandle_GetGenericTypeDefinition(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType);
-extern "C" void QCALLTYPE RuntimeTypeHandle_GetConstraints(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retTypes);
-extern "C" void QCALLTYPE RuntimeTypeHandle_GetArgumentTypesFromFunctionPointer(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack argTypes);
-extern "C" void QCALLTYPE RuntimeTypeHandle_GetAssemblySlow(QCall::ObjectHandleOnStack type, QCall::ObjectHandleOnStack assembly);
-extern "C" void QCALLTYPE RuntimeTypeHandle_GetModuleSlow(QCall::ObjectHandleOnStack type, QCall::ObjectHandleOnStack module);
-extern "C" INT32 QCALLTYPE RuntimeTypeHandle_GetNumVirtualsAndStaticVirtuals(QCall::TypeHandle pTypeHandle);
-extern "C" MethodDesc* QCALLTYPE RuntimeTypeHandle_GetMethodAt(MethodTable* pMT, INT32 slot);
-extern "C" BOOL QCALLTYPE RuntimeTypeHandle_GetFields(MethodTable* pMT, intptr_t* result, INT32* pCount);
-extern "C" void QCALLTYPE RuntimeTypeHandle_VerifyInterfaceIsImplemented(QCall::TypeHandle pTypeHandle, QCall::TypeHandle pIFaceHandle);
-extern "C" MethodDesc* QCALLTYPE RuntimeTypeHandle_GetInterfaceMethodImplementation(QCall::TypeHandle pTypeHandle, QCall::TypeHandle pOwner, MethodDesc * pMD);
-extern "C" void QCALLTYPE RuntimeTypeHandle_GetDeclaringMethodForGenericParameter(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack result);
-extern "C" EnregisteredTypeHandle QCALLTYPE RuntimeTypeHandle_GetDeclaringTypeHandleForGenericVariable(EnregisteredTypeHandle pTypeHandle);
-extern "C" EnregisteredTypeHandle QCALLTYPE RuntimeTypeHandle_GetDeclaringTypeHandle(EnregisteredTypeHandle pTypeHandle);
-extern "C" void QCALLTYPE RuntimeTypeHandle_RegisterCollectibleTypeDependency(QCall::TypeHandle pTypeHandle, QCall::AssemblyHandle pAssembly);
+extern "C" void QCALLTYPE RuntimeTypeHandle_ConstructName(QCall::TypeHandle pTypeHandle, DWORD format, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeTypeHandle_GetInterfaces(MethodTable* pMT, QCall::ObjectHandleOnStack result, QCallExceptionStatus* qcallError);
+extern "C" BOOL QCALLTYPE RuntimeTypeHandle_IsVisible(QCall::TypeHandle pTypeHandle, QCallExceptionStatus* qcallError);
+extern "C" BOOL QCALLTYPE RuntimeTypeHandle_SatisfiesConstraints(QCall::TypeHandle paramType, QCall::TypeHandle typeContext, MethodDesc* methodContext, QCall::TypeHandle toType, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeTypeHandle_GetInstantiation(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType, BOOL fAsRuntimeTypeArray, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeTypeHandle_Instantiate(QCall::TypeHandle pTypeHandle, TypeHandle * pInstArray, INT32 cInstArray, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeTypeHandle_GetGenericTypeDefinition(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeTypeHandle_GetConstraints(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack retTypes, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeTypeHandle_GetArgumentTypesFromFunctionPointer(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack argTypes, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeTypeHandle_GetAssemblySlow(QCall::ObjectHandleOnStack type, QCall::ObjectHandleOnStack assembly, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeTypeHandle_GetModuleSlow(QCall::ObjectHandleOnStack type, QCall::ObjectHandleOnStack module, QCallExceptionStatus* qcallError);
+extern "C" INT32 QCALLTYPE RuntimeTypeHandle_GetNumVirtualsAndStaticVirtuals(QCall::TypeHandle pTypeHandle, QCallExceptionStatus* qcallError);
+extern "C" MethodDesc* QCALLTYPE RuntimeTypeHandle_GetMethodAt(MethodTable* pMT, INT32 slot, QCallExceptionStatus* qcallError);
+extern "C" BOOL QCALLTYPE RuntimeTypeHandle_GetFields(MethodTable* pMT, intptr_t* result, INT32* pCount, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeTypeHandle_VerifyInterfaceIsImplemented(QCall::TypeHandle pTypeHandle, QCall::TypeHandle pIFaceHandle, QCallExceptionStatus* qcallError);
+extern "C" MethodDesc* QCALLTYPE RuntimeTypeHandle_GetInterfaceMethodImplementation(QCall::TypeHandle pTypeHandle, QCall::TypeHandle pOwner, MethodDesc * pMD, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeTypeHandle_GetDeclaringMethodForGenericParameter(QCall::TypeHandle pTypeHandle, QCall::ObjectHandleOnStack result, QCallExceptionStatus* qcallError);
+extern "C" EnregisteredTypeHandle QCALLTYPE RuntimeTypeHandle_GetDeclaringTypeHandleForGenericVariable(EnregisteredTypeHandle pTypeHandle, QCallExceptionStatus* qcallError);
+extern "C" EnregisteredTypeHandle QCALLTYPE RuntimeTypeHandle_GetDeclaringTypeHandle(EnregisteredTypeHandle pTypeHandle, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeTypeHandle_RegisterCollectibleTypeDependency(QCall::TypeHandle pTypeHandle, QCall::AssemblyHandle pAssembly, QCallExceptionStatus* qcallError);
class RuntimeMethodHandle
{
@@ -213,32 +214,34 @@ class RuntimeMethodHandle
FCDECL1(static Object*, GetLoaderAllocatorInternal, MethodDesc *pMethod);
};
-extern "C" MethodDesc* QCALLTYPE MethodBase_GetCurrentMethod(QCall::StackCrawlMarkHandle stackMark);
+extern "C" MethodDesc* QCALLTYPE MethodBase_GetCurrentMethod(QCall::StackCrawlMarkHandle stackMark, QCallExceptionStatus* qcallError);
extern "C" BOOL QCALLTYPE RuntimeMethodHandle_IsCAVisibleFromDecoratedType(
QCall::TypeHandle targetTypeHandle,
MethodDesc * pTargetCtor,
QCall::TypeHandle sourceTypeHandle,
- QCall::ModuleHandle sourceModuleHandle);
+ QCall::ModuleHandle sourceModuleHandle,
+ QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE RuntimeMethodHandle_GetMethodInstantiation(MethodDesc * pMethod, QCall::ObjectHandleOnStack retTypes, BOOL fAsRuntimeTypeArray);
+extern "C" void QCALLTYPE RuntimeMethodHandle_GetMethodInstantiation(MethodDesc * pMethod, QCall::ObjectHandleOnStack retTypes, BOOL fAsRuntimeTypeArray, QCallExceptionStatus* qcallError);
extern "C" void QCALLTYPE RuntimeMethodHandle_InvokeMethod(
QCall::ObjectHandleOnStack target,
PVOID* args,
QCall::ObjectHandleOnStack pSigUNSAFE,
BOOL fConstructor,
- QCall::ObjectHandleOnStack result);
+ QCall::ObjectHandleOnStack result,
+ QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE RuntimeMethodHandle_ConstructInstantiation(MethodDesc * pMethod, DWORD format, QCall::StringHandleOnStack retString);
-extern "C" void* QCALLTYPE RuntimeMethodHandle_GetFunctionPointer(MethodDesc * pMethod);
+extern "C" void QCALLTYPE RuntimeMethodHandle_ConstructInstantiation(MethodDesc * pMethod, DWORD format, QCall::StringHandleOnStack retString, QCallExceptionStatus* qcallError);
+extern "C" void* QCALLTYPE RuntimeMethodHandle_GetFunctionPointer(MethodDesc * pMethod, QCallExceptionStatus* qcallError);
extern "C" BOOL QCALLTYPE RuntimeMethodHandle_GetIsCollectible(MethodDesc * pMethod);
-extern "C" void QCALLTYPE RuntimeMethodHandle_GetTypicalMethodDefinition(MethodDesc * pMethod, QCall::ObjectHandleOnStack refMethod);
-extern "C" void QCALLTYPE RuntimeMethodHandle_StripMethodInstantiation(MethodDesc * pMethod, QCall::ObjectHandleOnStack refMethod);
-extern "C" void QCALLTYPE RuntimeMethodHandle_Destroy(MethodDesc * pMethod);
-extern "C" MethodDesc* QCALLTYPE RuntimeMethodHandle_GetStubIfNeededSlow(MethodDesc* pMethod, QCall::TypeHandle declaringTypeHandle, QCall::ObjectHandleOnStack methodInstantiation);
-extern "C" PCODE QCALLTYPE RuntimeMethodHandle_GetNativeCode(MethodDesc* pMethod);
-extern "C" void QCALLTYPE RuntimeMethodHandle_GetMethodBody(MethodDesc* pMethod, QCall::TypeHandle pDeclaringType, QCall::ObjectHandleOnStack result);
+extern "C" void QCALLTYPE RuntimeMethodHandle_GetTypicalMethodDefinition(MethodDesc * pMethod, QCall::ObjectHandleOnStack refMethod, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeMethodHandle_StripMethodInstantiation(MethodDesc * pMethod, QCall::ObjectHandleOnStack refMethod, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeMethodHandle_Destroy(MethodDesc * pMethod, QCallExceptionStatus* qcallError);
+extern "C" MethodDesc* QCALLTYPE RuntimeMethodHandle_GetStubIfNeededSlow(MethodDesc* pMethod, QCall::TypeHandle declaringTypeHandle, QCall::ObjectHandleOnStack methodInstantiation, QCallExceptionStatus* qcallError);
+extern "C" PCODE QCALLTYPE RuntimeMethodHandle_GetNativeCode(MethodDesc* pMethod, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeMethodHandle_GetMethodBody(MethodDesc* pMethod, QCall::TypeHandle pDeclaringType, QCall::ObjectHandleOnStack result, QCallExceptionStatus* qcallError);
class RuntimeFieldHandle
{
@@ -256,28 +259,28 @@ class RuntimeFieldHandle
FCDECL1(static Object*, GetLoaderAllocatorInternal, FieldDesc *pField);
};
-extern "C" void QCALLTYPE RuntimeFieldHandle_GetValue(FieldDesc* fieldDesc, QCall::ObjectHandleOnStack instance, QCall::TypeHandle fieldType, QCall::TypeHandle declaringType, BOOL *pIsClassInitialized, QCall::ObjectHandleOnStack result);
-extern "C" void QCALLTYPE RuntimeFieldHandle_SetValue(FieldDesc* fieldDesc, QCall::ObjectHandleOnStack instance, QCall::ObjectHandleOnStack value, QCall::TypeHandle fieldType, QCall::TypeHandle declaringType, BOOL* pIsClassInitialized);
-extern "C" void QCALLTYPE RuntimeFieldHandle_GetValueDirect(FieldDesc* fieldDesc, TypedByRef *pTarget, QCall::TypeHandle fieldTypeHandle, QCall::TypeHandle declaringTypeHandle, QCall::ObjectHandleOnStack result);
-extern "C" void QCALLTYPE RuntimeFieldHandle_SetValueDirect(FieldDesc* fieldDesc, TypedByRef *pTarget, QCall::ObjectHandleOnStack newValue, QCall::TypeHandle fieldType, QCall::TypeHandle declaringType);
-extern "C" void* QCALLTYPE RuntimeFieldHandle_GetEnCFieldAddr(QCall::ObjectHandleOnStack target, FieldDesc* pFD);
-extern "C" BOOL QCALLTYPE RuntimeFieldHandle_GetRVAFieldInfo(FieldDesc* pField, void** address, UINT* size);
-extern "C" void QCALLTYPE RuntimeFieldHandle_GetFieldDataReference(FieldDesc* pField, QCall::ObjectHandleOnStack instance, QCall::ByteRefOnStack offset);
+extern "C" void QCALLTYPE RuntimeFieldHandle_GetValue(FieldDesc* fieldDesc, QCall::ObjectHandleOnStack instance, QCall::TypeHandle fieldType, QCall::TypeHandle declaringType, BOOL *pIsClassInitialized, QCall::ObjectHandleOnStack result, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeFieldHandle_SetValue(FieldDesc* fieldDesc, QCall::ObjectHandleOnStack instance, QCall::ObjectHandleOnStack value, QCall::TypeHandle fieldType, QCall::TypeHandle declaringType, BOOL* pIsClassInitialized, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeFieldHandle_GetValueDirect(FieldDesc* fieldDesc, TypedByRef *pTarget, QCall::TypeHandle fieldTypeHandle, QCall::TypeHandle declaringTypeHandle, QCall::ObjectHandleOnStack result, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeFieldHandle_SetValueDirect(FieldDesc* fieldDesc, TypedByRef *pTarget, QCall::ObjectHandleOnStack newValue, QCall::TypeHandle fieldType, QCall::TypeHandle declaringType, QCallExceptionStatus* qcallError);
+extern "C" void* QCALLTYPE RuntimeFieldHandle_GetEnCFieldAddr(QCall::ObjectHandleOnStack target, FieldDesc* pFD, QCallExceptionStatus* qcallError);
+extern "C" BOOL QCALLTYPE RuntimeFieldHandle_GetRVAFieldInfo(FieldDesc* pField, void** address, UINT* size, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE RuntimeFieldHandle_GetFieldDataReference(FieldDesc* pField, QCall::ObjectHandleOnStack instance, QCall::ByteRefOnStack offset, QCallExceptionStatus* qcallError);
extern "C" INT32 QCALLTYPE ModuleHandle_GetMDStreamVersion(QCall::ModuleHandle pModule);
-extern "C" void QCALLTYPE ModuleHandle_GetModuleType(QCall::ModuleHandle pModule, QCall::ObjectHandleOnStack retType);
+extern "C" void QCALLTYPE ModuleHandle_GetModuleType(QCall::ModuleHandle pModule, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError);
extern "C" INT32 QCALLTYPE ModuleHandle_GetToken(QCall::ModuleHandle pModule);
-extern "C" void QCALLTYPE ModuleHandle_ResolveType(QCall::ModuleHandle pModule, INT32 tkType, TypeHandle *typeArgs, INT32 typeArgsCount, TypeHandle *methodArgs, INT32 methodArgsCount, QCall::ObjectHandleOnStack retType);
+extern "C" void QCALLTYPE ModuleHandle_ResolveType(QCall::ModuleHandle pModule, INT32 tkType, TypeHandle *typeArgs, INT32 typeArgsCount, TypeHandle *methodArgs, INT32 methodArgsCount, QCall::ObjectHandleOnStack retType, QCallExceptionStatus* qcallError);
-extern "C" MethodDesc * QCALLTYPE ModuleHandle_ResolveMethod(QCall::ModuleHandle pModule, INT32 tkMemberRef, TypeHandle *typeArgs, INT32 typeArgsCount, TypeHandle *methodArgs, INT32 methodArgsCount);
+extern "C" MethodDesc * QCALLTYPE ModuleHandle_ResolveMethod(QCall::ModuleHandle pModule, INT32 tkMemberRef, TypeHandle *typeArgs, INT32 typeArgsCount, TypeHandle *methodArgs, INT32 methodArgsCount, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE ModuleHandle_ResolveField(QCall::ModuleHandle pModule, INT32 tkMemberRef, TypeHandle *typeArgs, INT32 typeArgsCount, TypeHandle *methodArgs, INT32 methodArgsCount, QCall::ObjectHandleOnStack retField);
+extern "C" void QCALLTYPE ModuleHandle_ResolveField(QCall::ModuleHandle pModule, INT32 tkMemberRef, TypeHandle *typeArgs, INT32 typeArgsCount, TypeHandle *methodArgs, INT32 methodArgsCount, QCall::ObjectHandleOnStack retField, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE ModuleHandle_GetPEKind(QCall::ModuleHandle pModule, DWORD* pdwPEKind, DWORD* pdwMachine);
+extern "C" void QCALLTYPE ModuleHandle_GetPEKind(QCall::ModuleHandle pModule, DWORD* pdwPEKind, DWORD* pdwMachine, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE ModuleHandle_GetDynamicMethod(QCall::ModuleHandle pModule, const char* name, byte* sig, INT32 sigLen, QCall::ObjectHandleOnStack resolver, QCall::ObjectHandleOnStack result);
+extern "C" void QCALLTYPE ModuleHandle_GetDynamicMethod(QCall::ModuleHandle pModule, const char* name, byte* sig, INT32 sigLen, QCall::ObjectHandleOnStack resolver, QCall::ObjectHandleOnStack result, QCallExceptionStatus* qcallError);
class AssemblyHandle
{
@@ -286,23 +289,26 @@ class AssemblyHandle
FCDECL1(static INT32, GetTokenInternal, AssemblyBaseObject *pAssemblyUNSAFE);
};
-extern "C" void QCALLTYPE AssemblyHandle_GetManifestModuleSlow(QCall::ObjectHandleOnStack assembly, QCall::ObjectHandleOnStack module);
+extern "C" void QCALLTYPE AssemblyHandle_GetManifestModuleSlow(QCall::ObjectHandleOnStack assembly, QCall::ObjectHandleOnStack module, QCallExceptionStatus* qcallError);
extern "C" void QCALLTYPE Signature_Init(
QCall::ObjectHandleOnStack sigObj,
PCCOR_SIGNATURE pCorSig, DWORD cCorSig,
FieldDesc* pFieldDesc,
- MethodDesc* pMethodDesc);
+ MethodDesc* pMethodDesc,
+ QCallExceptionStatus* qcallError);
extern "C" BOOL QCALLTYPE Signature_AreEqual(
PCCOR_SIGNATURE sig1, INT32 cSig1, QCall::TypeHandle handle1,
- PCCOR_SIGNATURE sig2, INT32 cSig2, QCall::TypeHandle handle2);
+ PCCOR_SIGNATURE sig2, INT32 cSig2, QCall::TypeHandle handle2,
+ QCallExceptionStatus* qcallError);
extern "C" void QCALLTYPE Signature_GetCustomModifiersAtOffset(
QCall::ObjectHandleOnStack sigObj,
INT32 offset,
BOOL fRequired,
- QCall::ObjectHandleOnStack result);
+ QCall::ObjectHandleOnStack result,
+ QCallExceptionStatus* qcallError);
class SignatureNative : public Object
{
@@ -310,7 +316,8 @@ class SignatureNative : public Object
QCall::ObjectHandleOnStack sigObj,
PCCOR_SIGNATURE pCorSig, DWORD cCorSig,
FieldDesc* pFieldDesc,
- MethodDesc* pMethodDesc);
+ MethodDesc* pMethodDesc,
+ QCallExceptionStatus* qcallError);
friend class ArgIteratorForMethodInvoke;
public:
diff --git a/src/coreclr/vm/stackwalk.h b/src/coreclr/vm/stackwalk.h
index 4b2c70823a418a..dc6ae465668ea8 100644
--- a/src/coreclr/vm/stackwalk.h
+++ b/src/coreclr/vm/stackwalk.h
@@ -40,7 +40,7 @@ namespace AsmOffsetsAsserts
class AsmOffsets;
};
-extern "C" void QCALLTYPE AppendExceptionStackFrame(QCall::ObjectHandleOnStack exceptionObj, SIZE_T ip, SIZE_T sp, int flags, ExInfo *pExInfo);
+extern "C" void QCALLTYPE AppendExceptionStackFrame(QCall::ObjectHandleOnStack exceptionObj, SIZE_T ip, SIZE_T sp, int flags, ExInfo *pExInfo, QCallExceptionStatus* qcallError);
class CrawlFrame
{
@@ -403,7 +403,7 @@ class CrawlFrame
friend class EECodeManager;
friend class StackFrameIterator;
friend struct ExInfo;
- friend void QCALLTYPE AppendExceptionStackFrame(QCall::ObjectHandleOnStack exceptionObj, SIZE_T ip, SIZE_T sp, int flags, ExInfo *pExInfo);
+ friend void QCALLTYPE AppendExceptionStackFrame(QCall::ObjectHandleOnStack exceptionObj, SIZE_T ip, SIZE_T sp, int flags, ExInfo *pExInfo, QCallExceptionStatus* qcallError);
bool isFrameless;
bool isFirst;
diff --git a/src/coreclr/vm/stubhelpers.cpp b/src/coreclr/vm/stubhelpers.cpp
index 135506b9225a9e..3377c840b8a868 100644
--- a/src/coreclr/vm/stubhelpers.cpp
+++ b/src/coreclr/vm/stubhelpers.cpp
@@ -304,7 +304,7 @@ FCIMPLEND
#include
-extern "C" IUnknown* QCALLTYPE StubHelpers_GetCOMIPFromRCWSlow(QCall::ObjectHandleOnStack pSrc, MethodTable* pInterfaceMT, INT32 comSlot, void** ppTarget, BOOL* pfNeedsRelease)
+extern "C" IUnknown* QCALLTYPE StubHelpers_GetCOMIPFromRCWSlow(QCall::ObjectHandleOnStack pSrc, MethodTable* pInterfaceMT, INT32 comSlot, void** ppTarget, BOOL* pfNeedsRelease, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
_ASSERTE(pInterfaceMT != NULL);
@@ -350,7 +350,7 @@ extern "C" IUnknown* QCALLTYPE StubHelpers_GetCOMIPFromRCWSlow(QCall::ObjectHand
return pIntf;
}
-extern "C" void QCALLTYPE ObjectMarshaler_ConvertToNative(QCall::ObjectHandleOnStack pSrcUNSAFE, VARIANT* pDest)
+extern "C" void QCALLTYPE ObjectMarshaler_ConvertToNative(QCall::ObjectHandleOnStack pSrcUNSAFE, VARIANT* pDest, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -375,7 +375,7 @@ extern "C" void QCALLTYPE ObjectMarshaler_ConvertToNative(QCall::ObjectHandleOnS
END_QCALL;
}
-extern "C" void QCALLTYPE ObjectMarshaler_ConvertToManaged(VARIANT* pSrc, QCall::ObjectHandleOnStack retObject)
+extern "C" void QCALLTYPE ObjectMarshaler_ConvertToManaged(VARIANT* pSrc, QCall::ObjectHandleOnStack retObject, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -397,7 +397,7 @@ extern "C" void QCALLTYPE ObjectMarshaler_ConvertToManaged(VARIANT* pSrc, QCall:
}
#include
-extern "C" IUnknown* QCALLTYPE InterfaceMarshaler_ConvertToNative(QCall::ObjectHandleOnStack pObjUNSAFE, MethodTable* pItfMT, MethodTable* pClsMT, DWORD dwFlags)
+extern "C" IUnknown* QCALLTYPE InterfaceMarshaler_ConvertToNative(QCall::ObjectHandleOnStack pObjUNSAFE, MethodTable* pItfMT, MethodTable* pClsMT, DWORD dwFlags, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -421,7 +421,7 @@ extern "C" IUnknown* QCALLTYPE InterfaceMarshaler_ConvertToNative(QCall::ObjectH
return pIntf;
}
-extern "C" void QCALLTYPE InterfaceMarshaler_ConvertToManaged(IUnknown** ppUnk, MethodTable* pItfMT, MethodTable* pClsMT, DWORD dwFlags, QCall::ObjectHandleOnStack retObject)
+extern "C" void QCALLTYPE InterfaceMarshaler_ConvertToManaged(IUnknown** ppUnk, MethodTable* pItfMT, MethodTable* pClsMT, DWORD dwFlags, QCall::ObjectHandleOnStack retObject, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -444,7 +444,7 @@ extern "C" void QCALLTYPE InterfaceMarshaler_ConvertToManaged(IUnknown** ppUnk,
}
#include
-extern "C" void QCALLTYPE InterfaceMarshaler_GetObjectForComCallableWrapperIUnknown(IUnknown* unk, QCall::ObjectHandleOnStack retObject)
+extern "C" void QCALLTYPE InterfaceMarshaler_GetObjectForComCallableWrapperIUnknown(IUnknown* unk, QCall::ObjectHandleOnStack retObject, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -457,7 +457,7 @@ extern "C" void QCALLTYPE InterfaceMarshaler_GetObjectForComCallableWrapperIUnkn
END_QCALL;
}
-extern "C" void QCALLTYPE InterfaceMarshaler_ValidateComVisibilityForIUnknown(IUnknown* unk)
+extern "C" void QCALLTYPE InterfaceMarshaler_ValidateComVisibilityForIUnknown(IUnknown* unk, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -483,7 +483,7 @@ FCIMPL0(void, StubHelpers::ClearLastError)
}
FCIMPLEND
-extern "C" void QCALLTYPE StubHelpers_ThrowInteropParamException(INT resID, INT paramIdx)
+extern "C" void QCALLTYPE StubHelpers_ThrowInteropParamException(INT resID, INT paramIdx, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -495,7 +495,7 @@ extern "C" void QCALLTYPE StubHelpers_ThrowInteropParamException(INT resID, INT
// Throws an interop failure that was detected while the stub was being generated. Stubs that are
// created while their caller is being jitted report their failures this way so that a call site
// that is never executed does not fail the compilation of the method containing it.
-extern "C" void QCALLTYPE StubHelpers_ThrowInteropException(INT exceptionKind, INT resID)
+extern "C" void QCALLTYPE StubHelpers_ThrowInteropException(INT exceptionKind, INT resID, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -505,7 +505,7 @@ extern "C" void QCALLTYPE StubHelpers_ThrowInteropException(INT exceptionKind, I
}
#ifdef PROFILING_SUPPORTED
-extern "C" void* QCALLTYPE StubHelpers_ProfilerBeginTransitionCallback(MethodDesc* pTargetMD)
+extern "C" void* QCALLTYPE StubHelpers_ProfilerBeginTransitionCallback(MethodDesc* pTargetMD, QCallExceptionStatus* qcallError)
{
PreserveLastErrorHolder preserveLastError;
@@ -520,7 +520,7 @@ extern "C" void* QCALLTYPE StubHelpers_ProfilerBeginTransitionCallback(MethodDes
return pTargetMD;
}
-extern "C" void QCALLTYPE StubHelpers_ProfilerEndTransitionCallback(MethodDesc* pTargetMD)
+extern "C" void QCALLTYPE StubHelpers_ProfilerEndTransitionCallback(MethodDesc* pTargetMD, QCallExceptionStatus* qcallError)
{
PreserveLastErrorHolder preserveLastError;
@@ -535,7 +535,7 @@ extern "C" void QCALLTYPE StubHelpers_ProfilerEndTransitionCallback(MethodDesc*
#endif // PROFILING_SUPPORTED
#ifdef FEATURE_VARARGS
-extern "C" void QCALLTYPE StubHelpers_MarshalToManagedVaList(va_list va, VARARGS* pArgIterator)
+extern "C" void QCALLTYPE StubHelpers_MarshalToManagedVaList(va_list va, VARARGS* pArgIterator, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -544,7 +544,7 @@ extern "C" void QCALLTYPE StubHelpers_MarshalToManagedVaList(va_list va, VARARGS
END_QCALL;
}
-extern "C" void QCALLTYPE StubHelpers_MarshalToUnmanagedVaList(va_list va, DWORD cbVaListSize, const VARARGS* pArgIterator)
+extern "C" void QCALLTYPE StubHelpers_MarshalToUnmanagedVaList(va_list va, DWORD cbVaListSize, const VARARGS* pArgIterator, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -554,7 +554,7 @@ extern "C" void QCALLTYPE StubHelpers_MarshalToUnmanagedVaList(va_list va, DWORD
}
#endif // FEATURE_VARARGS
-extern "C" void QCALLTYPE StubHelpers_ValidateObject(QCall::ObjectHandleOnStack pObj, MethodDesc *pMD)
+extern "C" void QCALLTYPE StubHelpers_ValidateObject(QCall::ObjectHandleOnStack pObj, MethodDesc *pMD, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -585,13 +585,14 @@ extern "C" void QCALLTYPE StubHelpers_ValidateObject(QCall::ObjectHandleOnStack
END_QCALL;
}
-extern "C" void QCALLTYPE StubHelpers_ValidateByref(void *pByref, MethodDesc *pMD)
+extern "C" void QCALLTYPE StubHelpers_ValidateByref(void *pByref, MethodDesc *pMD, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
// Skip byref if is not pointing inside managed heap
if (!GCHeapUtilities::GetGCHeap()->IsHeapPointer(pByref))
{
+ *qcallError = 0;
return;
}
@@ -675,7 +676,7 @@ FCIMPL1(DWORD, StubHelpers::CalcVaListSize, VARARGS *varargs)
FCIMPLEND
#endif // FEATURE_VARARGS
-extern "C" void QCALLTYPE StubHelpers_MulticastDebuggerTraceHelper(QCall::ObjectHandleOnStack element, INT32 count)
+extern "C" void QCALLTYPE StubHelpers_MulticastDebuggerTraceHelper(QCall::ObjectHandleOnStack element, INT32 count, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -688,7 +689,7 @@ extern "C" void QCALLTYPE StubHelpers_MulticastDebuggerTraceHelper(QCall::Object
END_QCALL;
}
-extern "C" void QCALLTYPE StubHelpers_CreateLayoutClassMarshalStubs(QCall::TypeHandle th, PCODE* pConvertToUnmanaged, PCODE* pConvertToManaged, PCODE* pFree)
+extern "C" void QCALLTYPE StubHelpers_CreateLayoutClassMarshalStubs(QCall::TypeHandle th, PCODE* pConvertToUnmanaged, PCODE* pConvertToManaged, PCODE* pFree, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
diff --git a/src/coreclr/vm/stubhelpers.h b/src/coreclr/vm/stubhelpers.h
index 4680526e8aa2e5..c18915952f3a53 100644
--- a/src/coreclr/vm/stubhelpers.h
+++ b/src/coreclr/vm/stubhelpers.h
@@ -38,37 +38,37 @@ class StubHelpers
#endif // FEATURE_VARARGS
};
-extern "C" void QCALLTYPE StubHelpers_CreateCustomMarshaler(MethodDesc* pMD, mdToken paramToken, TypeHandle hndManagedType, QCall::ObjectHandleOnStack retObject);
+extern "C" void QCALLTYPE StubHelpers_CreateCustomMarshaler(MethodDesc* pMD, mdToken paramToken, TypeHandle hndManagedType, QCall::ObjectHandleOnStack retObject, QCallExceptionStatus* qcallError);
#ifdef PROFILING_SUPPORTED
-extern "C" void* QCALLTYPE StubHelpers_ProfilerBeginTransitionCallback(MethodDesc* pTargetMD);
-extern "C" void QCALLTYPE StubHelpers_ProfilerEndTransitionCallback(MethodDesc* pTargetMD);
+extern "C" void* QCALLTYPE StubHelpers_ProfilerBeginTransitionCallback(MethodDesc* pTargetMD, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE StubHelpers_ProfilerEndTransitionCallback(MethodDesc* pTargetMD, QCallExceptionStatus* qcallError);
#endif
#ifdef FEATURE_COMINTEROP
-extern "C" IUnknown* QCALLTYPE StubHelpers_GetCOMIPFromRCWSlow(QCall::ObjectHandleOnStack pSrc, MethodTable* pInterfaceMT, INT32 comSlot, void** ppTarget, BOOL* pfNeedsRelease);
+extern "C" IUnknown* QCALLTYPE StubHelpers_GetCOMIPFromRCWSlow(QCall::ObjectHandleOnStack pSrc, MethodTable* pInterfaceMT, INT32 comSlot, void** ppTarget, BOOL* pfNeedsRelease, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE ObjectMarshaler_ConvertToNative(QCall::ObjectHandleOnStack pSrcUNSAFE, VARIANT* pDest);
-extern "C" void QCALLTYPE ObjectMarshaler_ConvertToManaged(VARIANT* pSrc, QCall::ObjectHandleOnStack retObject);
+extern "C" void QCALLTYPE ObjectMarshaler_ConvertToNative(QCall::ObjectHandleOnStack pSrcUNSAFE, VARIANT* pDest, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE ObjectMarshaler_ConvertToManaged(VARIANT* pSrc, QCall::ObjectHandleOnStack retObject, QCallExceptionStatus* qcallError);
-extern "C" IUnknown* QCALLTYPE InterfaceMarshaler_ConvertToNative(QCall::ObjectHandleOnStack pObjUNSAFE, MethodTable* pItfMT, MethodTable* pClsMT, DWORD dwFlags);
-extern "C" void QCALLTYPE InterfaceMarshaler_ConvertToManaged(IUnknown** ppUnk, MethodTable* pItfMT, MethodTable* pClsMT, DWORD dwFlags, QCall::ObjectHandleOnStack retObject);
-extern "C" void QCALLTYPE InterfaceMarshaler_GetObjectForComCallableWrapperIUnknown(IUnknown* unk, QCall::ObjectHandleOnStack retObject);
-extern "C" void QCALLTYPE InterfaceMarshaler_ValidateComVisibilityForIUnknown(IUnknown* unk);
+extern "C" IUnknown* QCALLTYPE InterfaceMarshaler_ConvertToNative(QCall::ObjectHandleOnStack pObjUNSAFE, MethodTable* pItfMT, MethodTable* pClsMT, DWORD dwFlags, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE InterfaceMarshaler_ConvertToManaged(IUnknown** ppUnk, MethodTable* pItfMT, MethodTable* pClsMT, DWORD dwFlags, QCall::ObjectHandleOnStack retObject, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE InterfaceMarshaler_GetObjectForComCallableWrapperIUnknown(IUnknown* unk, QCall::ObjectHandleOnStack retObject, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE InterfaceMarshaler_ValidateComVisibilityForIUnknown(IUnknown* unk, QCallExceptionStatus* qcallError);
#endif
-extern "C" void QCALLTYPE StubHelpers_ThrowInteropParamException(INT resID, INT paramIdx);
-extern "C" void QCALLTYPE StubHelpers_ThrowInteropException(INT exceptionKind, INT resID);
+extern "C" void QCALLTYPE StubHelpers_ThrowInteropParamException(INT resID, INT paramIdx, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE StubHelpers_ThrowInteropException(INT exceptionKind, INT resID, QCallExceptionStatus* qcallError);
#ifdef FEATURE_VARARGS
-extern "C" void QCALLTYPE StubHelpers_MarshalToManagedVaList(va_list va, VARARGS* pArgIterator);
-extern "C" void QCALLTYPE StubHelpers_MarshalToUnmanagedVaList(va_list va, DWORD cbVaListSize, const VARARGS* pArgIterator);
+extern "C" void QCALLTYPE StubHelpers_MarshalToManagedVaList(va_list va, VARARGS* pArgIterator, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE StubHelpers_MarshalToUnmanagedVaList(va_list va, DWORD cbVaListSize, const VARARGS* pArgIterator, QCallExceptionStatus* qcallError);
#endif // FEATURE_VARARGS
-extern "C" void QCALLTYPE StubHelpers_ValidateObject(QCall::ObjectHandleOnStack pObj, MethodDesc *pMD);
-extern "C" void QCALLTYPE StubHelpers_ValidateByref(void *pByref, MethodDesc *pMD);
+extern "C" void QCALLTYPE StubHelpers_ValidateObject(QCall::ObjectHandleOnStack pObj, MethodDesc *pMD, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE StubHelpers_ValidateByref(void *pByref, MethodDesc *pMD, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE StubHelpers_MulticastDebuggerTraceHelper(QCall::ObjectHandleOnStack element, INT32 count);
+extern "C" void QCALLTYPE StubHelpers_MulticastDebuggerTraceHelper(QCall::ObjectHandleOnStack element, INT32 count, QCallExceptionStatus* qcallError);
-extern "C" void QCALLTYPE StubHelpers_CreateLayoutClassMarshalStubs(QCall::TypeHandle th, PCODE* pConvertToUnmanaged, PCODE* pConvertToManaged, PCODE* pFree);
+extern "C" void QCALLTYPE StubHelpers_CreateLayoutClassMarshalStubs(QCall::TypeHandle th, PCODE* pConvertToUnmanaged, PCODE* pConvertToManaged, PCODE* pFree, QCallExceptionStatus* qcallError);
#endif // __STUBHELPERS_h__
diff --git a/src/coreclr/vm/tailcallhelp.cpp b/src/coreclr/vm/tailcallhelp.cpp
index 3ad4f365c20546..0f6beee9c1a902 100644
--- a/src/coreclr/vm/tailcallhelp.cpp
+++ b/src/coreclr/vm/tailcallhelp.cpp
@@ -21,7 +21,7 @@ FCIMPL0(void*, TailCallHelp::GetTailCallArgBuffer)
}
FCIMPLEND
-extern "C" void* QCALLTYPE TailCallHelp_AllocTailCallArgBufferInternal(int size)
+extern "C" void* QCALLTYPE TailCallHelp_AllocTailCallArgBufferInternal(int size, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
diff --git a/src/coreclr/vm/tailcallhelp.h b/src/coreclr/vm/tailcallhelp.h
index adc626b2fdf15f..a5bc1c76a89af4 100644
--- a/src/coreclr/vm/tailcallhelp.h
+++ b/src/coreclr/vm/tailcallhelp.h
@@ -47,6 +47,6 @@ class TailCallHelp
static void* AllocateBlob(LoaderAllocator* alloc, const void* blob, size_t blobLen);
};
-extern "C" void* QCALLTYPE TailCallHelp_AllocTailCallArgBufferInternal(int size);
+extern "C" void* QCALLTYPE TailCallHelp_AllocTailCallArgBufferInternal(int size, QCallExceptionStatus* qcallError);
#endif
diff --git a/src/coreclr/vm/threadstatics.cpp b/src/coreclr/vm/threadstatics.cpp
index 18788eee2559e6..7c37a2d4ca4e79 100644
--- a/src/coreclr/vm/threadstatics.cpp
+++ b/src/coreclr/vm/threadstatics.cpp
@@ -202,6 +202,7 @@ void ScanThreadStaticRoots(Thread* pThread, promote_func* fn, ScanContext* sc)
// Report non-collectible object array
fn(&pThreadLocalData->pNonCollectibleTlsArrayData, sc, 0);
+
}
#endif // DACCESS_COMPILE
diff --git a/src/coreclr/vm/unsafeaccessors.cpp b/src/coreclr/vm/unsafeaccessors.cpp
index 042fa4ebc1f853..d0e89005dfb1b6 100644
--- a/src/coreclr/vm/unsafeaccessors.cpp
+++ b/src/coreclr/vm/unsafeaccessors.cpp
@@ -1172,7 +1172,7 @@ bool MethodDesc::TryGenerateUnsafeAccessor(DynamicResolver** resolver, COR_ILMET
return true;
}
-extern "C" void* QCALLTYPE UnsafeAccessors_ResolveGenericParamToTypeHandle(MethodDesc* unsafeAccessorMethod, BOOL isMethodParam, DWORD paramIndex)
+extern "C" void* QCALLTYPE UnsafeAccessors_ResolveGenericParamToTypeHandle(MethodDesc* unsafeAccessorMethod, BOOL isMethodParam, DWORD paramIndex, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
_ASSERTE(unsafeAccessorMethod != NULL);
diff --git a/src/coreclr/vm/varargsnative.cpp b/src/coreclr/vm/varargsnative.cpp
index 55e4ff978de6d5..0dbc1c4c7c99d3 100644
--- a/src/coreclr/vm/varargsnative.cpp
+++ b/src/coreclr/vm/varargsnative.cpp
@@ -167,7 +167,7 @@ static void AdvanceArgPtr(VARARGS *data)
// ArgIterator constructor that initializes the state to support iteration
// of the args starting at the first optional argument.
////////////////////////////////////////////////////////////////////////////////
-extern "C" void QCALLTYPE ArgIterator_Init(VARARGS* data, PVOID cookie)
+extern "C" void QCALLTYPE ArgIterator_Init(VARARGS* data, PVOID cookie, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -189,7 +189,7 @@ extern "C" void QCALLTYPE ArgIterator_Init(VARARGS* data, PVOID cookie)
// Specifying NULL as the firstArg parameter causes it to start at the first
// argument to the call.
////////////////////////////////////////////////////////////////////////////////
-extern "C" void QCALLTYPE ArgIterator_Init2(VARARGS* data, PVOID cookie, PVOID firstArg)
+extern "C" void QCALLTYPE ArgIterator_Init2(VARARGS* data, PVOID cookie, PVOID firstArg, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -461,7 +461,7 @@ static void GetNextArgHelper(VARARGS* data, TypedByRef* value, BOOL fData)
////////////////////////////////////////////////////////////////////////////////
// Retrieve the type of the next argument without consuming it.
////////////////////////////////////////////////////////////////////////////////
-extern "C" void* QCALLTYPE ArgIterator_GetNextArgType(VARARGS* data)
+extern "C" void* QCALLTYPE ArgIterator_GetNextArgType(VARARGS* data, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -490,7 +490,7 @@ extern "C" void* QCALLTYPE ArgIterator_GetNextArgType(VARARGS* data)
// Retrieve the next argument and return it in a TypedByRef and advance the
// next argument pointer.
////////////////////////////////////////////////////////////////////////////////
-extern "C" void QCALLTYPE ArgIterator_GetNextArg(VARARGS* data, TypedByRef* pResult)
+extern "C" void QCALLTYPE ArgIterator_GetNextArg(VARARGS* data, TypedByRef* pResult, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
@@ -506,7 +506,7 @@ extern "C" void QCALLTYPE ArgIterator_GetNextArg(VARARGS* data, TypedByRef* pRes
// Retrieve the next argument and return it in a TypedByRef and advance the
// next argument pointer.
////////////////////////////////////////////////////////////////////////////////
-extern "C" void QCALLTYPE ArgIterator_GetNextArg2(VARARGS* data, QCall::TypeHandle pType, TypedByRef* pResult)
+extern "C" void QCALLTYPE ArgIterator_GetNextArg2(VARARGS* data, QCall::TypeHandle pType, TypedByRef* pResult, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
diff --git a/src/coreclr/vm/varargsnative.h b/src/coreclr/vm/varargsnative.h
index 7ee42e02affaf9..0c80adb1f2ad46 100644
--- a/src/coreclr/vm/varargsnative.h
+++ b/src/coreclr/vm/varargsnative.h
@@ -14,10 +14,10 @@
#include "clrvarargs.h"
-extern "C" void QCALLTYPE ArgIterator_Init(VARARGS* thisPtr, PVOID cookie);
-extern "C" void QCALLTYPE ArgIterator_Init2(VARARGS* thisPtr, PVOID cookie, PVOID firstArg);
-extern "C" void* QCALLTYPE ArgIterator_GetNextArgType(VARARGS* thisPtr);
-extern "C" void QCALLTYPE ArgIterator_GetNextArg(VARARGS* thisPtr, TypedByRef* pResult);
-extern "C" void QCALLTYPE ArgIterator_GetNextArg2(VARARGS* thisPtr, QCall::TypeHandle pType, TypedByRef* pResult);
+extern "C" void QCALLTYPE ArgIterator_Init(VARARGS* thisPtr, PVOID cookie, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE ArgIterator_Init2(VARARGS* thisPtr, PVOID cookie, PVOID firstArg, QCallExceptionStatus* qcallError);
+extern "C" void* QCALLTYPE ArgIterator_GetNextArgType(VARARGS* thisPtr, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE ArgIterator_GetNextArg(VARARGS* thisPtr, TypedByRef* pResult, QCallExceptionStatus* qcallError);
+extern "C" void QCALLTYPE ArgIterator_GetNextArg2(VARARGS* thisPtr, QCall::TypeHandle pType, TypedByRef* pResult, QCallExceptionStatus* qcallError);
#endif // _VARARGSNATIVE_H_
diff --git a/src/coreclr/vm/versionresilienthashcode.cpp b/src/coreclr/vm/versionresilienthashcode.cpp
index deccbde1aca8ca..442c691f706616 100644
--- a/src/coreclr/vm/versionresilienthashcode.cpp
+++ b/src/coreclr/vm/versionresilienthashcode.cpp
@@ -450,7 +450,7 @@ bool GetVersionResilientILCodeHashCode(MethodDesc *pMD, const COR_ILMETHOD_DECOD
return true;
}
-extern "C" INT32 VersionResilientHashCode_TypeHashCode(QCall::TypeHandle pTypeHandle)
+extern "C" INT32 QCALLTYPE VersionResilientHashCode_TypeHashCode(QCall::TypeHandle pTypeHandle, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
diff --git a/src/coreclr/vm/versionresilienthashcode.h b/src/coreclr/vm/versionresilienthashcode.h
index 16898ff41027a3..da36794166ec14 100644
--- a/src/coreclr/vm/versionresilienthashcode.h
+++ b/src/coreclr/vm/versionresilienthashcode.h
@@ -14,4 +14,4 @@ int GetVersionResilientModuleHashCode(Module* pModule);
bool GetVersionResilientILCodeHashCode(MethodDesc *pMD, const COR_ILMETHOD_DECODER* header, int* hashCode, unsigned* ilSize);
-extern "C" INT32 VersionResilientHashCode_TypeHashCode(QCall::TypeHandle pTypeHandle);
+extern "C" INT32 QCALLTYPE VersionResilientHashCode_TypeHashCode(QCall::TypeHandle pTypeHandle, QCallExceptionStatus* qcallError);
diff --git a/src/coreclr/vm/wasm/browser/callhelpers-interp-to-managed.cpp b/src/coreclr/vm/wasm/browser/callhelpers-interp-to-managed.cpp
index dc7af3ffa4ea3a..d6570db6f62385 100644
--- a/src/coreclr/vm/wasm/browser/callhelpers-interp-to-managed.cpp
+++ b/src/coreclr/vm/wasm/browser/callhelpers-interp-to-managed.cpp
@@ -88,10 +88,10 @@ namespace
*((int32_t*)pRet) = (*fptr)();
}
- static void CallFunc_S64_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_S64_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t) = (int32_t (*)(int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_IND(0));
+ int32_t (*fptr)(int32_t, int32_t) = (int32_t (*)(int32_t, int32_t))pcode;
+ *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_I32(8));
}
static void CallFunc_S8_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
@@ -100,28 +100,28 @@ namespace
*((int32_t*)pRet) = (*fptr)(ARG_IND(0));
}
- static void CallFunc_S8_S8_S8_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_S8_S8_S8_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_IND(1), ARG_IND(2));
+ int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t))pcode;
+ *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_IND(1), ARG_IND(2), ARG_I32(3));
}
- static void CallFunc_S8_S8_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_S8_S8_I32_S8_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_IND(1), ARG_I32(2));
+ int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
+ *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_IND(1), ARG_I32(2), ARG_IND(3), ARG_I32(4));
}
- static void CallFunc_S8_S8_I32_S8_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_S8_S8_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_IND(1), ARG_I32(2), ARG_IND(3));
+ *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_IND(1), ARG_I32(2), ARG_I32(3));
}
- static void CallFunc_S8_S8_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_S8_S8_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_IND(1), ARG_I32(2), ARG_I32(3));
+ int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
+ *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_IND(1), ARG_I32(2), ARG_I32(3), ARG_I32(4));
}
static void CallFunc_S8_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
@@ -130,16 +130,16 @@ namespace
*((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_I32(1));
}
- static void CallFunc_S8_I32_S8_S8_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_S8_I32_S8_S8_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_I32(1), ARG_IND(2), ARG_IND(3));
+ int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
+ *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_I32(1), ARG_IND(2), ARG_IND(3), ARG_I32(4));
}
- static void CallFunc_S8_I32_S8_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_S8_I32_S8_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_I32(1), ARG_IND(2), ARG_I32(3));
+ int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
+ *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_I32(1), ARG_IND(2), ARG_I32(3), ARG_I32(4));
}
static void CallFunc_S8_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
@@ -166,6 +166,12 @@ namespace
*((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5));
}
+ static void CallFunc_S8_I32_I32_I32_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ {
+ int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
+ *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6));
+ }
+
NOINLINE static void CallFunc_This_I32_RetI32_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
@@ -186,16 +192,16 @@ namespace
*((int32_t*)pRet) = (*fptr)(ARG_I32(0));
}
- static void CallFunc_I32_S8_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_I32_S8_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_IND(1), ARG_I32(2));
+ int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t))pcode;
+ *((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_IND(1), ARG_I32(2), ARG_I32(3));
}
- static void CallFunc_I32_S8_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_I32_S8_I32_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_IND(1), ARG_I32(2), ARG_I32(3), ARG_I32(4));
+ int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
+ *((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_IND(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5));
}
static void CallFunc_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
@@ -204,16 +210,16 @@ namespace
*((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1));
}
- static void CallFunc_I32_I32_S8_I32_I32_S8_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_I32_I32_S8_I32_I32_S8_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1), ARG_IND(2), ARG_I32(3), ARG_I32(4), ARG_IND(5));
+ int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
+ *((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1), ARG_IND(2), ARG_I32(3), ARG_I32(4), ARG_IND(5), ARG_I32(6));
}
- static void CallFunc_I32_I32_S8_I32_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_I32_I32_S8_I32_I32_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1), ARG_IND(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6));
+ int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
+ *((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1), ARG_IND(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6), ARG_I32(7));
}
static void CallFunc_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
@@ -222,10 +228,10 @@ namespace
*((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2));
}
- static void CallFunc_I32_I32_I32_S8_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_I32_I32_I32_S8_I32_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_IND(3), ARG_I32(4), ARG_I32(5), ARG_I32(6));
+ int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
+ *((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_IND(3), ARG_I32(4), ARG_I32(5), ARG_I32(6), ARG_I32(7));
}
static void CallFunc_I32_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
@@ -298,10 +304,10 @@ namespace
*((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I64(2));
}
- static void CallFunc_I32_I32_I64_I32_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_I32_I32_I64_I32_I32_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t, int32_t, int64_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int64_t, int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I64(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6));
+ int32_t (*fptr)(int32_t, int32_t, int64_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int64_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
+ *((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I64(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6), ARG_I32(7));
}
NOINLINE static void CallFunc_I32_I32_RetI32_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
@@ -348,22 +354,22 @@ namespace
*((int32_t*)pRet) = (*fptr)(&framePointer, ARG_I32(0), pPortableEntryPoint);
}
- static void CallFunc_I64_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
- {
- int32_t (*fptr)(int64_t) = (int32_t (*)(int64_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_I64(0));
- }
-
static void CallFunc_I64_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
int32_t (*fptr)(int64_t, int32_t) = (int32_t (*)(int64_t, int32_t))pcode;
*((int32_t*)pRet) = (*fptr)(ARG_I64(0), ARG_I32(1));
}
- static void CallFunc_I64_I32_I64_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_I64_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int64_t, int32_t, int64_t, int32_t) = (int32_t (*)(int64_t, int32_t, int64_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_I64(0), ARG_I32(1), ARG_I64(2), ARG_I32(3));
+ int32_t (*fptr)(int64_t, int32_t, int32_t) = (int32_t (*)(int64_t, int32_t, int32_t))pcode;
+ *((int32_t*)pRet) = (*fptr)(ARG_I64(0), ARG_I32(1), ARG_I32(2));
+ }
+
+ static void CallFunc_I64_I32_I64_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ {
+ int32_t (*fptr)(int64_t, int32_t, int64_t, int32_t, int32_t) = (int32_t (*)(int64_t, int32_t, int64_t, int32_t, int32_t))pcode;
+ *((int32_t*)pRet) = (*fptr)(ARG_I64(0), ARG_I32(1), ARG_I64(2), ARG_I32(3), ARG_I32(4));
}
NOINLINE static void CallFunc_Void_RetI32_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
@@ -391,10 +397,10 @@ namespace
*((int64_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2));
}
- static void CallFunc_I32_I32_I32_I32_I32_RetI64(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_I32_I32_I32_I32_I32_I32_RetI64(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- int64_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t) = (int64_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- *((int64_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4));
+ int64_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (int64_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
+ *((int64_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5));
}
static void CallFunc_I32_I32_I32_I64_RetI64(PCODE pcode, int8_t* pArgs, int8_t* pRet)
@@ -450,22 +456,16 @@ namespace
(*fptr)();
}
- static void CallFunc_S8_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
- {
- void (*fptr)(int32_t) = (void (*)(int32_t))pcode;
- (*fptr)(ARG_IND(0));
- }
-
- static void CallFunc_S8_S8_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_S8_S8_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t) = (void (*)(int32_t, int32_t))pcode;
- (*fptr)(ARG_IND(0), ARG_IND(1));
+ void (*fptr)(int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t))pcode;
+ (*fptr)(ARG_IND(0), ARG_IND(1), ARG_I32(2));
}
- static void CallFunc_S8_S8_I32_I32_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_S8_S8_I32_I32_I32_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_IND(0), ARG_IND(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6));
+ void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
+ (*fptr)(ARG_IND(0), ARG_IND(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6), ARG_I32(7));
}
static void CallFunc_S8_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
@@ -504,10 +504,16 @@ namespace
(*fptr)(ARG_IND(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6));
}
- static void CallFunc_S8_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_S8_I32_I32_I32_I32_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_IND(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6), ARG_I32(7), ARG_I32(8), ARG_I32(9), ARG_I32(10), ARG_I32(11));
+ void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
+ (*fptr)(ARG_IND(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6), ARG_I32(7));
+ }
+
+ static void CallFunc_S8_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ {
+ void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
+ (*fptr)(ARG_IND(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6), ARG_I32(7), ARG_I32(8), ARG_I32(9), ARG_I32(10), ARG_I32(11), ARG_I32(12));
}
NOINLINE static void CallFunc_This_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
@@ -517,22 +523,22 @@ namespace
(*fptr)(&framePointer, ARG_I32(0), pPortableEntryPoint);
}
- static void CallFunc_F64_F64_F64_F64_F64_F64_F64_F64_F64_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_F64_F64_F64_F64_F64_F64_F64_F64_F64_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(double, double, double, double, double, double, double, double, double, int32_t, int32_t) = (void (*)(double, double, double, double, double, double, double, double, double, int32_t, int32_t))pcode;
- (*fptr)(ARG_F64(0), ARG_F64(1), ARG_F64(2), ARG_F64(3), ARG_F64(4), ARG_F64(5), ARG_F64(6), ARG_F64(7), ARG_F64(8), ARG_I32(9), ARG_I32(10));
+ void (*fptr)(double, double, double, double, double, double, double, double, double, int32_t, int32_t, int32_t) = (void (*)(double, double, double, double, double, double, double, double, double, int32_t, int32_t, int32_t))pcode;
+ (*fptr)(ARG_F64(0), ARG_F64(1), ARG_F64(2), ARG_F64(3), ARG_F64(4), ARG_F64(5), ARG_F64(6), ARG_F64(7), ARG_F64(8), ARG_I32(9), ARG_I32(10), ARG_I32(11));
}
- static void CallFunc_F64_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_F64_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(double, int32_t) = (void (*)(double, int32_t))pcode;
- (*fptr)(ARG_F64(0), ARG_I32(1));
+ void (*fptr)(double, int32_t, int32_t) = (void (*)(double, int32_t, int32_t))pcode;
+ (*fptr)(ARG_F64(0), ARG_I32(1), ARG_I32(2));
}
- static void CallFunc_F64_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_F64_I32_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(double, int32_t, int32_t, int32_t) = (void (*)(double, int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_F64(0), ARG_I32(1), ARG_I32(2), ARG_I32(3));
+ void (*fptr)(double, int32_t, int32_t, int32_t, int32_t) = (void (*)(double, int32_t, int32_t, int32_t, int32_t))pcode;
+ (*fptr)(ARG_F64(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4));
}
NOINLINE static void CallFunc_F64_I32_I32_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
@@ -555,10 +561,10 @@ namespace
(*fptr)(ARG_I32(0));
}
- static void CallFunc_I32_S8_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_I32_S8_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_I32(0), ARG_IND(1), ARG_I32(2));
+ void (*fptr)(int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t))pcode;
+ (*fptr)(ARG_I32(0), ARG_IND(1), ARG_I32(2), ARG_I32(3));
}
static void CallFunc_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
@@ -567,34 +573,28 @@ namespace
(*fptr)(ARG_I32(0), ARG_I32(1));
}
- static void CallFunc_I32_I32_S8_S8_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
- {
- void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_I32(0), ARG_I32(1), ARG_IND(2), ARG_IND(3), ARG_I32(4));
- }
-
static void CallFunc_I32_I32_S8_S8_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
(*fptr)(ARG_I32(0), ARG_I32(1), ARG_IND(2), ARG_IND(3), ARG_I32(4), ARG_I32(5));
}
- static void CallFunc_I32_I32_F64_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_I32_I32_S8_S8_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t, double) = (void (*)(int32_t, int32_t, double))pcode;
- (*fptr)(ARG_I32(0), ARG_I32(1), ARG_F64(2));
+ void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
+ (*fptr)(ARG_I32(0), ARG_I32(1), ARG_IND(2), ARG_IND(3), ARG_I32(4), ARG_I32(5), ARG_I32(6));
}
- static void CallFunc_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_I32_I32_F64_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2));
+ void (*fptr)(int32_t, int32_t, double, int32_t) = (void (*)(int32_t, int32_t, double, int32_t))pcode;
+ (*fptr)(ARG_I32(0), ARG_I32(1), ARG_F64(2), ARG_I32(3));
}
- static void CallFunc_I32_I32_I32_S8_S8_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_IND(3), ARG_IND(4));
+ void (*fptr)(int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t))pcode;
+ (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2));
}
static void CallFunc_I32_I32_I32_S8_S8_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
@@ -603,6 +603,12 @@ namespace
(*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_IND(3), ARG_IND(4), ARG_I32(5));
}
+ static void CallFunc_I32_I32_I32_S8_S8_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ {
+ void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
+ (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_IND(3), ARG_IND(4), ARG_I32(5), ARG_I32(6));
+ }
+
static void CallFunc_I32_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
void (*fptr)(int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t))pcode;
@@ -621,10 +627,16 @@ namespace
(*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5));
}
- static void CallFunc_I32_I32_I32_I32_I64_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_I32_I32_I32_I32_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ {
+ void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
+ (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6));
+ }
+
+ static void CallFunc_I32_I32_I32_I32_I64_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t, int32_t, int32_t, int64_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int64_t))pcode;
- (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I64(4));
+ void (*fptr)(int32_t, int32_t, int32_t, int32_t, int64_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int64_t, int32_t))pcode;
+ (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I64(4), ARG_I32(5));
}
NOINLINE static void CallFunc_I32_I32_I32_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
@@ -648,10 +660,10 @@ namespace
(*fptr)(&framePointer, ARG_I32(0), pPortableEntryPoint);
}
- static void CallFunc_I64_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_I64_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int64_t) = (void (*)(int64_t))pcode;
- (*fptr)(ARG_I64(0));
+ void (*fptr)(int64_t, int32_t) = (void (*)(int64_t, int32_t))pcode;
+ (*fptr)(ARG_I64(0), ARG_I32(1));
}
NOINLINE static void CallFunc_Void_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
@@ -673,29 +685,30 @@ const StringToWasmSigThunk g_wasmThunks[] = {
{ "Mffip", (void*)&CallFunc_F32_I32_RetF32_PE },
{ "Mffp", (void*)&CallFunc_F32_RetF32_PE },
{ "Mi", (void*)&CallFunc_Void_RetI32 },
- { "MiS64", (void*)&CallFunc_S64_RetI32 },
+ { "MiS64i", (void*)&CallFunc_S64_I32_RetI32 },
{ "MiS8", (void*)&CallFunc_S8_RetI32 },
- { "MiS8S8S8", (void*)&CallFunc_S8_S8_S8_RetI32 },
- { "MiS8S8i", (void*)&CallFunc_S8_S8_I32_RetI32 },
- { "MiS8S8iS8", (void*)&CallFunc_S8_S8_I32_S8_RetI32 },
+ { "MiS8S8S8i", (void*)&CallFunc_S8_S8_S8_I32_RetI32 },
+ { "MiS8S8iS8i", (void*)&CallFunc_S8_S8_I32_S8_I32_RetI32 },
{ "MiS8S8ii", (void*)&CallFunc_S8_S8_I32_I32_RetI32 },
+ { "MiS8S8iii", (void*)&CallFunc_S8_S8_I32_I32_I32_RetI32 },
{ "MiS8i", (void*)&CallFunc_S8_I32_RetI32 },
- { "MiS8iS8S8", (void*)&CallFunc_S8_I32_S8_S8_RetI32 },
- { "MiS8iS8i", (void*)&CallFunc_S8_I32_S8_I32_RetI32 },
+ { "MiS8iS8S8i", (void*)&CallFunc_S8_I32_S8_S8_I32_RetI32 },
+ { "MiS8iS8ii", (void*)&CallFunc_S8_I32_S8_I32_I32_RetI32 },
{ "MiS8ii", (void*)&CallFunc_S8_I32_I32_RetI32 },
{ "MiS8iii", (void*)&CallFunc_S8_I32_I32_I32_RetI32 },
{ "MiS8iiii", (void*)&CallFunc_S8_I32_I32_I32_I32_RetI32 },
{ "MiS8iiiii", (void*)&CallFunc_S8_I32_I32_I32_I32_I32_RetI32 },
+ { "MiS8iiiiii", (void*)&CallFunc_S8_I32_I32_I32_I32_I32_I32_RetI32 },
{ "MiTip", (void*)&CallFunc_This_I32_RetI32_PE },
{ "MiTp", (void*)&CallFunc_This_RetI32_PE },
{ "Mii", (void*)&CallFunc_I32_RetI32 },
- { "MiiS8i", (void*)&CallFunc_I32_S8_I32_RetI32 },
- { "MiiS8iii", (void*)&CallFunc_I32_S8_I32_I32_I32_RetI32 },
+ { "MiiS8ii", (void*)&CallFunc_I32_S8_I32_I32_RetI32 },
+ { "MiiS8iiii", (void*)&CallFunc_I32_S8_I32_I32_I32_I32_RetI32 },
{ "Miii", (void*)&CallFunc_I32_I32_RetI32 },
- { "MiiiS8iiS8", (void*)&CallFunc_I32_I32_S8_I32_I32_S8_RetI32 },
- { "MiiiS8iiii", (void*)&CallFunc_I32_I32_S8_I32_I32_I32_I32_RetI32 },
+ { "MiiiS8iiS8i", (void*)&CallFunc_I32_I32_S8_I32_I32_S8_I32_RetI32 },
+ { "MiiiS8iiiii", (void*)&CallFunc_I32_I32_S8_I32_I32_I32_I32_I32_RetI32 },
{ "Miiii", (void*)&CallFunc_I32_I32_I32_RetI32 },
- { "MiiiiS8iii", (void*)&CallFunc_I32_I32_I32_S8_I32_I32_I32_RetI32 },
+ { "MiiiiS8iiii", (void*)&CallFunc_I32_I32_I32_S8_I32_I32_I32_I32_RetI32 },
{ "Miiiii", (void*)&CallFunc_I32_I32_I32_I32_RetI32 },
{ "Miiiiii", (void*)&CallFunc_I32_I32_I32_I32_I32_RetI32 },
{ "Miiiiiii", (void*)&CallFunc_I32_I32_I32_I32_I32_I32_RetI32 },
@@ -707,7 +720,7 @@ const StringToWasmSigThunk g_wasmThunks[] = {
{ "Miiiil", (void*)&CallFunc_I32_I32_I32_I64_RetI32 },
{ "Miiiip", (void*)&CallFunc_I32_I32_I32_RetI32_PE },
{ "Miiil", (void*)&CallFunc_I32_I32_I64_RetI32 },
- { "Miiiliiii", (void*)&CallFunc_I32_I32_I64_I32_I32_I32_I32_RetI32 },
+ { "Miiiliiiii", (void*)&CallFunc_I32_I32_I64_I32_I32_I32_I32_I32_RetI32 },
{ "Miiip", (void*)&CallFunc_I32_I32_RetI32_PE },
{ "Miil", (void*)&CallFunc_I32_I64_RetI32 },
{ "Miili", (void*)&CallFunc_I32_I64_I32_RetI32 },
@@ -715,14 +728,14 @@ const StringToWasmSigThunk g_wasmThunks[] = {
{ "Miill", (void*)&CallFunc_I32_I64_I64_RetI32 },
{ "Miilli", (void*)&CallFunc_I32_I64_I64_I32_RetI32 },
{ "Miip", (void*)&CallFunc_I32_RetI32_PE },
- { "Mil", (void*)&CallFunc_I64_RetI32 },
{ "Mili", (void*)&CallFunc_I64_I32_RetI32 },
- { "Milili", (void*)&CallFunc_I64_I32_I64_I32_RetI32 },
+ { "Milii", (void*)&CallFunc_I64_I32_I32_RetI32 },
+ { "Mililii", (void*)&CallFunc_I64_I32_I64_I32_I32_RetI32 },
{ "Mip", (void*)&CallFunc_Void_RetI32_PE },
{ "Ml", (void*)&CallFunc_Void_RetI64 },
{ "Mli", (void*)&CallFunc_I32_RetI64 },
{ "Mliii", (void*)&CallFunc_I32_I32_I32_RetI64 },
- { "Mliiiii", (void*)&CallFunc_I32_I32_I32_I32_I32_RetI64 },
+ { "Mliiiiii", (void*)&CallFunc_I32_I32_I32_I32_I32_I32_RetI64 },
{ "Mliiil", (void*)&CallFunc_I32_I32_I32_I64_RetI64 },
{ "Mlili", (void*)&CallFunc_I32_I64_I32_RetI64 },
{ "Mlillp", (void*)&CallFunc_I32_I64_I64_RetI64_PE },
@@ -731,39 +744,40 @@ const StringToWasmSigThunk g_wasmThunks[] = {
{ "Mlllp", (void*)&CallFunc_I64_I64_RetI64_PE },
{ "Mlp", (void*)&CallFunc_Void_RetI64_PE },
{ "Mv", (void*)&CallFunc_Void_RetVoid },
- { "MvS8", (void*)&CallFunc_S8_RetVoid },
- { "MvS8S8", (void*)&CallFunc_S8_S8_RetVoid },
- { "MvS8S8iiiii", (void*)&CallFunc_S8_S8_I32_I32_I32_I32_I32_RetVoid },
+ { "MvS8S8i", (void*)&CallFunc_S8_S8_I32_RetVoid },
+ { "MvS8S8iiiiii", (void*)&CallFunc_S8_S8_I32_I32_I32_I32_I32_I32_RetVoid },
{ "MvS8i", (void*)&CallFunc_S8_I32_RetVoid },
{ "MvS8ii", (void*)&CallFunc_S8_I32_I32_RetVoid },
{ "MvS8iii", (void*)&CallFunc_S8_I32_I32_I32_RetVoid },
{ "MvS8iiii", (void*)&CallFunc_S8_I32_I32_I32_I32_RetVoid },
{ "MvS8iiiii", (void*)&CallFunc_S8_I32_I32_I32_I32_I32_RetVoid },
{ "MvS8iiiiii", (void*)&CallFunc_S8_I32_I32_I32_I32_I32_I32_RetVoid },
- { "MvS8iiiiiiiiiii", (void*)&CallFunc_S8_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_RetVoid },
+ { "MvS8iiiiiii", (void*)&CallFunc_S8_I32_I32_I32_I32_I32_I32_I32_RetVoid },
+ { "MvS8iiiiiiiiiiii", (void*)&CallFunc_S8_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_RetVoid },
{ "MvTp", (void*)&CallFunc_This_RetVoid_PE },
- { "Mvdddddddddii", (void*)&CallFunc_F64_F64_F64_F64_F64_F64_F64_F64_F64_I32_I32_RetVoid },
- { "Mvdi", (void*)&CallFunc_F64_I32_RetVoid },
- { "Mvdiii", (void*)&CallFunc_F64_I32_I32_I32_RetVoid },
+ { "Mvdddddddddiii", (void*)&CallFunc_F64_F64_F64_F64_F64_F64_F64_F64_F64_I32_I32_I32_RetVoid },
+ { "Mvdii", (void*)&CallFunc_F64_I32_I32_RetVoid },
+ { "Mvdiiii", (void*)&CallFunc_F64_I32_I32_I32_I32_RetVoid },
{ "Mvdiip", (void*)&CallFunc_F64_I32_I32_RetVoid_PE },
{ "Mvfiip", (void*)&CallFunc_F32_I32_I32_RetVoid_PE },
{ "Mvi", (void*)&CallFunc_I32_RetVoid },
- { "MviS8i", (void*)&CallFunc_I32_S8_I32_RetVoid },
+ { "MviS8ii", (void*)&CallFunc_I32_S8_I32_I32_RetVoid },
{ "Mvii", (void*)&CallFunc_I32_I32_RetVoid },
- { "MviiS8S8i", (void*)&CallFunc_I32_I32_S8_S8_I32_RetVoid },
{ "MviiS8S8ii", (void*)&CallFunc_I32_I32_S8_S8_I32_I32_RetVoid },
- { "Mviid", (void*)&CallFunc_I32_I32_F64_RetVoid },
+ { "MviiS8S8iii", (void*)&CallFunc_I32_I32_S8_S8_I32_I32_I32_RetVoid },
+ { "Mviidi", (void*)&CallFunc_I32_I32_F64_I32_RetVoid },
{ "Mviii", (void*)&CallFunc_I32_I32_I32_RetVoid },
- { "MviiiS8S8", (void*)&CallFunc_I32_I32_I32_S8_S8_RetVoid },
{ "MviiiS8S8i", (void*)&CallFunc_I32_I32_I32_S8_S8_I32_RetVoid },
+ { "MviiiS8S8ii", (void*)&CallFunc_I32_I32_I32_S8_S8_I32_I32_RetVoid },
{ "Mviiii", (void*)&CallFunc_I32_I32_I32_I32_RetVoid },
{ "Mviiiii", (void*)&CallFunc_I32_I32_I32_I32_I32_RetVoid },
{ "Mviiiiii", (void*)&CallFunc_I32_I32_I32_I32_I32_I32_RetVoid },
- { "Mviiiil", (void*)&CallFunc_I32_I32_I32_I32_I64_RetVoid },
+ { "Mviiiiiii", (void*)&CallFunc_I32_I32_I32_I32_I32_I32_I32_RetVoid },
+ { "Mviiiili", (void*)&CallFunc_I32_I32_I32_I32_I64_I32_RetVoid },
{ "Mviiip", (void*)&CallFunc_I32_I32_I32_RetVoid_PE },
{ "Mviip", (void*)&CallFunc_I32_I32_RetVoid_PE },
{ "Mvip", (void*)&CallFunc_I32_RetVoid_PE },
- { "Mvl", (void*)&CallFunc_I64_RetVoid },
+ { "Mvli", (void*)&CallFunc_I64_I32_RetVoid },
{ "Mvp", (void*)&CallFunc_Void_RetVoid_PE }
};
diff --git a/src/coreclr/vm/wasm/browser/callhelpers-pinvoke.cpp b/src/coreclr/vm/wasm/browser/callhelpers-pinvoke.cpp
index 9dbd7f579c68e6..e2744321b81d8d 100644
--- a/src/coreclr/vm/wasm/browser/callhelpers-pinvoke.cpp
+++ b/src/coreclr/vm/wasm/browser/callhelpers-pinvoke.cpp
@@ -236,7 +236,7 @@ static const Entry s_libSystem_Native [] = {
DllImportEntry(SystemNative_Free) // System.Private.CoreLib
DllImportEntry(SystemNative_FreeLibrary) // System.Private.CoreLib
DllImportEntry(SystemNative_GetCpuUtilization) // System.Private.CoreLib
- DllImportEntry(SystemNative_GetCryptographicallySecureRandomBytes) // System.Private.CoreLib, System.Security.Cryptography
+ DllImportEntry(SystemNative_GetCryptographicallySecureRandomBytes) // System.IO.Compression, System.Private.CoreLib, System.Security.Cryptography
DllImportEntry(SystemNative_GetCwd) // System.Private.CoreLib
DllImportEntry(SystemNative_GetDefaultSearchOrderPseudoHandle) // System.Private.CoreLib
DllImportEntry(SystemNative_GetErrNo) // System.Private.CoreLib
diff --git a/src/coreclr/vm/wasm/entrypoints.h b/src/coreclr/vm/wasm/entrypoints.h
index 637476db1fe6ef..b7a92b9cc60af1 100644
--- a/src/coreclr/vm/wasm/entrypoints.h
+++ b/src/coreclr/vm/wasm/entrypoints.h
@@ -22,11 +22,11 @@ extern "C" void SystemJS_DiagnosticServerQueueJob(size_t (*cb)(void *data), void
// the WasiEventLoop pump when WasiFinalizer_TryClearPending returns true.
// Same implementation as browser's SystemJS_ExecuteFinalizationCallback, just
// exported under a WASI-specific symbol; see src/coreclr/vm/finalizerthread.cpp.
-extern "C" void QCALLTYPE WasiFinalizer_RunWorker();
+extern "C" void QCALLTYPE WasiFinalizer_RunWorker(QCallExceptionStatus* qcallError);
// Atomic-flag drain used by managed WasiEventLoop to learn whether a GC has
// requested finalization since the last poll. Returns TRUE once per scheduled
// finalization, FALSE otherwise.
-extern "C" CLR_BOOL QCALLTYPE WasiFinalizer_TryClearPending();
+extern "C" CLR_BOOL QCALLTYPE WasiFinalizer_TryClearPending(QCallExceptionStatus* qcallError);
#endif // TARGET_WASI
#endif // HAVE_WASM_ENTRYPOINTS_H
\ No newline at end of file
diff --git a/src/coreclr/vm/wasm/wasi/callhelpers-interp-to-managed.cpp b/src/coreclr/vm/wasm/wasi/callhelpers-interp-to-managed.cpp
index 0033e59ea2469e..56f77515c21288 100644
--- a/src/coreclr/vm/wasm/wasi/callhelpers-interp-to-managed.cpp
+++ b/src/coreclr/vm/wasm/wasi/callhelpers-interp-to-managed.cpp
@@ -88,82 +88,60 @@ namespace
*((int32_t*)pRet) = (*fptr)();
}
- static void CallFunc_S64_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_S8_S8_RetI32_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t) = (int32_t (*)(int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_IND(0));
- }
-
- static void CallFunc_S8_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
- {
- int32_t (*fptr)(int32_t) = (int32_t (*)(int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_IND(0));
- }
-
- static void CallFunc_S8_S8_S8_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
- {
- int32_t (*fptr)(int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_IND(1), ARG_IND(2));
- }
-
- static void CallFunc_S8_S8_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
- {
- int32_t (*fptr)(int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_IND(1), ARG_I32(2));
- }
-
- static void CallFunc_S8_S8_I32_S8_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
- {
- int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_IND(1), ARG_I32(2), ARG_IND(3));
- }
-
- static void CallFunc_S8_S8_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
- {
- int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_IND(1), ARG_I32(2), ARG_I32(3));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ int32_t (*fptr)(int*, int32_t, int32_t, PCODE) = *(int32_t (**)(int*, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ *((int32_t*)pRet) = (*fptr)(&framePointer, ARG_IND(0), ARG_IND(1), pPortableEntryPoint);
}
- static void CallFunc_S8_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_S8_I32_I32_I32_RetI32_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t, int32_t) = (int32_t (*)(int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_I32(1));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ int32_t (*fptr)(int*, int32_t, int32_t, int32_t, int32_t, PCODE) = *(int32_t (**)(int*, int32_t, int32_t, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ *((int32_t*)pRet) = (*fptr)(&framePointer, ARG_IND(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), pPortableEntryPoint);
}
- static void CallFunc_S8_I32_S8_S8_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_S8_I32_I32_RetI32_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_I32(1), ARG_IND(2), ARG_IND(3));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ int32_t (*fptr)(int*, int32_t, int32_t, int32_t, PCODE) = *(int32_t (**)(int*, int32_t, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ *((int32_t*)pRet) = (*fptr)(&framePointer, ARG_IND(0), ARG_I32(1), ARG_I32(2), pPortableEntryPoint);
}
- static void CallFunc_S8_I32_S8_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_S8_I32_RetI32_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_I32(1), ARG_IND(2), ARG_I32(3));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ int32_t (*fptr)(int*, int32_t, int32_t, PCODE) = *(int32_t (**)(int*, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ *((int32_t*)pRet) = (*fptr)(&framePointer, ARG_IND(0), ARG_I32(1), pPortableEntryPoint);
}
- static void CallFunc_S8_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_S8_RetI32_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_I32(1), ARG_I32(2));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ int32_t (*fptr)(int*, int32_t, PCODE) = *(int32_t (**)(int*, int32_t, PCODE))(pPortableEntryPoint);
+ *((int32_t*)pRet) = (*fptr)(&framePointer, ARG_IND(0), pPortableEntryPoint);
}
- static void CallFunc_S8_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_This_I32_I32_I32_I32_RetI32_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_I32(1), ARG_I32(2), ARG_I32(3));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ int32_t (*fptr)(int*, int32_t, int32_t, int32_t, int32_t, int32_t, PCODE) = *(int32_t (**)(int*, int32_t, int32_t, int32_t, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ *((int32_t*)pRet) = (*fptr)(&framePointer, ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), pPortableEntryPoint);
}
- static void CallFunc_S8_I32_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_This_I32_I32_I32_RetI32_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ int32_t (*fptr)(int*, int32_t, int32_t, int32_t, int32_t, PCODE) = *(int32_t (**)(int*, int32_t, int32_t, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ *((int32_t*)pRet) = (*fptr)(&framePointer, ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), pPortableEntryPoint);
}
- static void CallFunc_S8_I32_I32_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_This_I32_I32_RetI32_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_IND(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ int32_t (*fptr)(int*, int32_t, int32_t, int32_t, PCODE) = *(int32_t (**)(int*, int32_t, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ *((int32_t*)pRet) = (*fptr)(&framePointer, ARG_I32(0), ARG_I32(1), ARG_I32(2), pPortableEntryPoint);
}
NOINLINE static void CallFunc_This_I32_RetI32_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
@@ -186,48 +164,18 @@ namespace
*((int32_t*)pRet) = (*fptr)(ARG_I32(0));
}
- static void CallFunc_I32_S8_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
- {
- int32_t (*fptr)(int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_IND(1), ARG_I32(2));
- }
-
- static void CallFunc_I32_S8_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
- {
- int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_IND(1), ARG_I32(2), ARG_I32(3), ARG_I32(4));
- }
-
static void CallFunc_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
int32_t (*fptr)(int32_t, int32_t) = (int32_t (*)(int32_t, int32_t))pcode;
*((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1));
}
- static void CallFunc_I32_I32_S8_I32_I32_S8_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
- {
- int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1), ARG_IND(2), ARG_I32(3), ARG_I32(4), ARG_IND(5));
- }
-
- static void CallFunc_I32_I32_S8_I32_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
- {
- int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1), ARG_IND(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6));
- }
-
static void CallFunc_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
int32_t (*fptr)(int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t))pcode;
*((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2));
}
- static void CallFunc_I32_I32_I32_S8_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
- {
- int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_IND(3), ARG_I32(4), ARG_I32(5), ARG_I32(6));
- }
-
static void CallFunc_I32_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t))pcode;
@@ -264,17 +212,18 @@ namespace
*((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6), ARG_I32(7), ARG_I32(8));
}
- static void CallFunc_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_I32_I32_I32_I32_I32_I32_I32_I32_RetI32_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- int32_t (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (int32_t (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6), ARG_I32(7), ARG_I32(8), ARG_I32(9), ARG_I32(10), ARG_I32(11), ARG_I32(12), ARG_I32(13));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ int32_t (*fptr)(int*, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, PCODE) = *(int32_t (**)(int*, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ *((int32_t*)pRet) = (*fptr)(&framePointer, ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6), ARG_I32(7), pPortableEntryPoint);
}
- NOINLINE static void CallFunc_I32_I32_I32_I32_I32_I32_RetI32_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_I32_I32_I32_I32_I32_I32_I32_RetI32_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
- int32_t (*fptr)(int*, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, PCODE) = *(int32_t (**)(int*, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, PCODE))(pPortableEntryPoint);
- *((int32_t*)pRet) = (*fptr)(&framePointer, ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), pPortableEntryPoint);
+ int32_t (*fptr)(int*, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, PCODE) = *(int32_t (**)(int*, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ *((int32_t*)pRet) = (*fptr)(&framePointer, ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6), pPortableEntryPoint);
}
NOINLINE static void CallFunc_I32_I32_I32_I32_I32_RetI32_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
@@ -366,12 +315,6 @@ namespace
*((int32_t*)pRet) = (*fptr)(ARG_I64(0));
}
- static void CallFunc_I64_I32_I64_I32_RetI32(PCODE pcode, int8_t* pArgs, int8_t* pRet)
- {
- int32_t (*fptr)(int64_t, int32_t, int64_t, int32_t) = (int32_t (*)(int64_t, int32_t, int64_t, int32_t))pcode;
- *((int32_t*)pRet) = (*fptr)(ARG_I64(0), ARG_I32(1), ARG_I64(2), ARG_I32(3));
- }
-
NOINLINE static void CallFunc_Void_RetI32_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
@@ -430,13 +373,6 @@ namespace
*((int64_t*)pRet) = (*fptr)(&framePointer, ARG_I32(0), pPortableEntryPoint);
}
- NOINLINE static void CallFunc_I64_I64_RetI64_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
- {
- alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
- int64_t (*fptr)(int*, int64_t, int64_t, PCODE) = *(int64_t (**)(int*, int64_t, int64_t, PCODE))(pPortableEntryPoint);
- *((int64_t*)pRet) = (*fptr)(&framePointer, ARG_I64(0), ARG_I64(1), pPortableEntryPoint);
- }
-
NOINLINE static void CallFunc_Void_RetI64_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
@@ -444,70 +380,60 @@ namespace
*((int64_t*)pRet) = (*fptr)(&framePointer, pPortableEntryPoint);
}
- static void CallFunc_Void_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
- {
- void (*fptr)() = (void (*)())pcode;
- (*fptr)();
- }
-
- static void CallFunc_S8_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
- {
- void (*fptr)(int32_t) = (void (*)(int32_t))pcode;
- (*fptr)(ARG_IND(0));
- }
-
- static void CallFunc_S8_S8_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_S8_S8_I32_I32_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t) = (void (*)(int32_t, int32_t))pcode;
- (*fptr)(ARG_IND(0), ARG_IND(1));
- }
-
- static void CallFunc_S8_S8_I32_I32_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
- {
- void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_IND(0), ARG_IND(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ void (*fptr)(int*, int32_t, int32_t, int32_t, int32_t, PCODE) = *(void (**)(int*, int32_t, int32_t, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ (*fptr)(&framePointer, ARG_IND(0), ARG_IND(1), ARG_I32(2), ARG_I32(3), pPortableEntryPoint);
}
- static void CallFunc_S8_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_S8_I32_I32_I32_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t) = (void (*)(int32_t, int32_t))pcode;
- (*fptr)(ARG_IND(0), ARG_I32(1));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ void (*fptr)(int*, int32_t, int32_t, int32_t, int32_t, PCODE) = *(void (**)(int*, int32_t, int32_t, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ (*fptr)(&framePointer, ARG_IND(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), pPortableEntryPoint);
}
- static void CallFunc_S8_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_S8_I32_I32_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_IND(0), ARG_I32(1), ARG_I32(2));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ void (*fptr)(int*, int32_t, int32_t, int32_t, PCODE) = *(void (**)(int*, int32_t, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ (*fptr)(&framePointer, ARG_IND(0), ARG_I32(1), ARG_I32(2), pPortableEntryPoint);
}
- static void CallFunc_S8_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_S8_I32_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_IND(0), ARG_I32(1), ARG_I32(2), ARG_I32(3));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ void (*fptr)(int*, int32_t, int32_t, PCODE) = *(void (**)(int*, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ (*fptr)(&framePointer, ARG_IND(0), ARG_I32(1), pPortableEntryPoint);
}
- static void CallFunc_S8_I32_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_S8_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_IND(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ void (*fptr)(int*, int32_t, PCODE) = *(void (**)(int*, int32_t, PCODE))(pPortableEntryPoint);
+ (*fptr)(&framePointer, ARG_IND(0), pPortableEntryPoint);
}
- static void CallFunc_S8_I32_I32_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_This_I32_I32_I32_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_IND(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ void (*fptr)(int*, int32_t, int32_t, int32_t, int32_t, PCODE) = *(void (**)(int*, int32_t, int32_t, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ (*fptr)(&framePointer, ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), pPortableEntryPoint);
}
- static void CallFunc_S8_I32_I32_I32_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_This_I32_I32_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_IND(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ void (*fptr)(int*, int32_t, int32_t, int32_t, PCODE) = *(void (**)(int*, int32_t, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ (*fptr)(&framePointer, ARG_I32(0), ARG_I32(1), ARG_I32(2), pPortableEntryPoint);
}
- static void CallFunc_S8_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_This_I32_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_IND(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6), ARG_I32(7), ARG_I32(8), ARG_I32(9), ARG_I32(10), ARG_I32(11));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ void (*fptr)(int*, int32_t, int32_t, PCODE) = *(void (**)(int*, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ (*fptr)(&framePointer, ARG_I32(0), ARG_I32(1), pPortableEntryPoint);
}
NOINLINE static void CallFunc_This_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
@@ -517,30 +443,17 @@ namespace
(*fptr)(&framePointer, ARG_I32(0), pPortableEntryPoint);
}
- NOINLINE static void CallFunc_F64_I32_I32_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
- {
- alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
- void (*fptr)(int*, double, int32_t, int32_t, PCODE) = *(void (**)(int*, double, int32_t, int32_t, PCODE))(pPortableEntryPoint);
- (*fptr)(&framePointer, ARG_F64(0), ARG_I32(1), ARG_I32(2), pPortableEntryPoint);
- }
-
- NOINLINE static void CallFunc_F32_I32_I32_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
- {
- alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
- void (*fptr)(int*, float, int32_t, int32_t, PCODE) = *(void (**)(int*, float, int32_t, int32_t, PCODE))(pPortableEntryPoint);
- (*fptr)(&framePointer, ARG_F32(0), ARG_I32(1), ARG_I32(2), pPortableEntryPoint);
- }
-
static void CallFunc_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
void (*fptr)(int32_t) = (void (*)(int32_t))pcode;
(*fptr)(ARG_I32(0));
}
- static void CallFunc_I32_S8_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_I32_S8_I32_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_I32(0), ARG_IND(1), ARG_I32(2));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ void (*fptr)(int*, int32_t, int32_t, int32_t, PCODE) = *(void (**)(int*, int32_t, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ (*fptr)(&framePointer, ARG_I32(0), ARG_IND(1), ARG_I32(2), pPortableEntryPoint);
}
static void CallFunc_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
@@ -549,52 +462,50 @@ namespace
(*fptr)(ARG_I32(0), ARG_I32(1));
}
- static void CallFunc_I32_I32_S8_S8_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
- {
- void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_I32(0), ARG_I32(1), ARG_IND(2), ARG_IND(3), ARG_I32(4));
- }
-
- static void CallFunc_I32_I32_S8_S8_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
- {
- void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_I32(0), ARG_I32(1), ARG_IND(2), ARG_IND(3), ARG_I32(4), ARG_I32(5));
- }
-
static void CallFunc_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
void (*fptr)(int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t))pcode;
(*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2));
}
- static void CallFunc_I32_I32_I32_S8_S8_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ static void CallFunc_I32_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ {
+ void (*fptr)(int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t))pcode;
+ (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3));
+ }
+
+ static void CallFunc_I32_I32_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
{
void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_IND(3), ARG_IND(4));
+ (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4));
}
- static void CallFunc_I32_I32_I32_S8_S8_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_I32_I32_I32_I32_I32_I32_I32_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_IND(3), ARG_IND(4), ARG_I32(5));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ void (*fptr)(int*, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, PCODE) = *(void (**)(int*, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ (*fptr)(&framePointer, ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), ARG_I32(6), pPortableEntryPoint);
}
- static void CallFunc_I32_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_I32_I32_I32_I32_I32_I32_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ void (*fptr)(int*, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, PCODE) = *(void (**)(int*, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ (*fptr)(&framePointer, ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5), pPortableEntryPoint);
}
- static void CallFunc_I32_I32_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_I32_I32_I32_I32_I32_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ void (*fptr)(int*, int32_t, int32_t, int32_t, int32_t, int32_t, PCODE) = *(void (**)(int*, int32_t, int32_t, int32_t, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ (*fptr)(&framePointer, ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), pPortableEntryPoint);
}
- static void CallFunc_I32_I32_I32_I32_I32_I32_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_I32_I32_I32_I32_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t) = (void (*)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t))pcode;
- (*fptr)(ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), ARG_I32(4), ARG_I32(5));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ void (*fptr)(int*, int32_t, int32_t, int32_t, int32_t, PCODE) = *(void (**)(int*, int32_t, int32_t, int32_t, int32_t, PCODE))(pPortableEntryPoint);
+ (*fptr)(&framePointer, ARG_I32(0), ARG_I32(1), ARG_I32(2), ARG_I32(3), pPortableEntryPoint);
}
NOINLINE static void CallFunc_I32_I32_I32_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
@@ -624,10 +535,11 @@ namespace
(*fptr)(&framePointer, ARG_I32(0), pPortableEntryPoint);
}
- static void CallFunc_I64_RetVoid(PCODE pcode, int8_t* pArgs, int8_t* pRet)
+ NOINLINE static void CallFunc_I64_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
{
- void (*fptr)(int64_t) = (void (*)(int64_t))pcode;
- (*fptr)(ARG_I64(0));
+ alignas(16) int framePointer = TERMINATE_R2R_STACK_WALK;
+ void (*fptr)(int*, int64_t, PCODE) = *(void (**)(int*, int64_t, PCODE))(pPortableEntryPoint);
+ (*fptr)(&framePointer, ARG_I64(0), pPortableEntryPoint);
}
NOINLINE static void CallFunc_Void_RetVoid_PE(PCODE pPortableEntryPoint, int8_t* pArgs, int8_t* pRet)
@@ -649,37 +561,27 @@ const StringToWasmSigThunk g_wasmThunks[] = {
{ "Mffip", (void*)&CallFunc_F32_I32_RetF32_PE },
{ "Mffp", (void*)&CallFunc_F32_RetF32_PE },
{ "Mi", (void*)&CallFunc_Void_RetI32 },
- { "MiS64", (void*)&CallFunc_S64_RetI32 },
- { "MiS8", (void*)&CallFunc_S8_RetI32 },
- { "MiS8S8S8", (void*)&CallFunc_S8_S8_S8_RetI32 },
- { "MiS8S8i", (void*)&CallFunc_S8_S8_I32_RetI32 },
- { "MiS8S8iS8", (void*)&CallFunc_S8_S8_I32_S8_RetI32 },
- { "MiS8S8ii", (void*)&CallFunc_S8_S8_I32_I32_RetI32 },
- { "MiS8i", (void*)&CallFunc_S8_I32_RetI32 },
- { "MiS8iS8S8", (void*)&CallFunc_S8_I32_S8_S8_RetI32 },
- { "MiS8iS8i", (void*)&CallFunc_S8_I32_S8_I32_RetI32 },
- { "MiS8ii", (void*)&CallFunc_S8_I32_I32_RetI32 },
- { "MiS8iii", (void*)&CallFunc_S8_I32_I32_I32_RetI32 },
- { "MiS8iiii", (void*)&CallFunc_S8_I32_I32_I32_I32_RetI32 },
- { "MiS8iiiii", (void*)&CallFunc_S8_I32_I32_I32_I32_I32_RetI32 },
+ { "MiS8S8p", (void*)&CallFunc_S8_S8_RetI32_PE },
+ { "MiS8iiip", (void*)&CallFunc_S8_I32_I32_I32_RetI32_PE },
+ { "MiS8iip", (void*)&CallFunc_S8_I32_I32_RetI32_PE },
+ { "MiS8ip", (void*)&CallFunc_S8_I32_RetI32_PE },
+ { "MiS8p", (void*)&CallFunc_S8_RetI32_PE },
+ { "MiTiiiip", (void*)&CallFunc_This_I32_I32_I32_I32_RetI32_PE },
+ { "MiTiiip", (void*)&CallFunc_This_I32_I32_I32_RetI32_PE },
+ { "MiTiip", (void*)&CallFunc_This_I32_I32_RetI32_PE },
{ "MiTip", (void*)&CallFunc_This_I32_RetI32_PE },
{ "MiTp", (void*)&CallFunc_This_RetI32_PE },
{ "Mii", (void*)&CallFunc_I32_RetI32 },
- { "MiiS8i", (void*)&CallFunc_I32_S8_I32_RetI32 },
- { "MiiS8iii", (void*)&CallFunc_I32_S8_I32_I32_I32_RetI32 },
{ "Miii", (void*)&CallFunc_I32_I32_RetI32 },
- { "MiiiS8iiS8", (void*)&CallFunc_I32_I32_S8_I32_I32_S8_RetI32 },
- { "MiiiS8iiii", (void*)&CallFunc_I32_I32_S8_I32_I32_I32_I32_RetI32 },
{ "Miiii", (void*)&CallFunc_I32_I32_I32_RetI32 },
- { "MiiiiS8iii", (void*)&CallFunc_I32_I32_I32_S8_I32_I32_I32_RetI32 },
{ "Miiiii", (void*)&CallFunc_I32_I32_I32_I32_RetI32 },
{ "Miiiiii", (void*)&CallFunc_I32_I32_I32_I32_I32_RetI32 },
{ "Miiiiiii", (void*)&CallFunc_I32_I32_I32_I32_I32_I32_RetI32 },
{ "Miiiiiiii", (void*)&CallFunc_I32_I32_I32_I32_I32_I32_I32_RetI32 },
{ "Miiiiiiiii", (void*)&CallFunc_I32_I32_I32_I32_I32_I32_I32_I32_RetI32 },
{ "Miiiiiiiiii", (void*)&CallFunc_I32_I32_I32_I32_I32_I32_I32_I32_I32_RetI32 },
- { "Miiiiiiiiiiiiiii", (void*)&CallFunc_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_RetI32 },
- { "Miiiiiiip", (void*)&CallFunc_I32_I32_I32_I32_I32_I32_RetI32_PE },
+ { "Miiiiiiiiip", (void*)&CallFunc_I32_I32_I32_I32_I32_I32_I32_I32_RetI32_PE },
+ { "Miiiiiiiip", (void*)&CallFunc_I32_I32_I32_I32_I32_I32_I32_RetI32_PE },
{ "Miiiiiip", (void*)&CallFunc_I32_I32_I32_I32_I32_RetI32_PE },
{ "Miiiiip", (void*)&CallFunc_I32_I32_I32_I32_RetI32_PE },
{ "Miiiil", (void*)&CallFunc_I32_I32_I32_I64_RetI32 },
@@ -694,7 +596,6 @@ const StringToWasmSigThunk g_wasmThunks[] = {
{ "Miilli", (void*)&CallFunc_I32_I64_I64_I32_RetI32 },
{ "Miip", (void*)&CallFunc_I32_RetI32_PE },
{ "Mil", (void*)&CallFunc_I64_RetI32 },
- { "Milili", (void*)&CallFunc_I64_I32_I64_I32_RetI32 },
{ "Mip", (void*)&CallFunc_Void_RetI32_PE },
{ "Ml", (void*)&CallFunc_Void_RetI64 },
{ "Mli", (void*)&CallFunc_I32_RetI64 },
@@ -704,38 +605,31 @@ const StringToWasmSigThunk g_wasmThunks[] = {
{ "Mlillp", (void*)&CallFunc_I32_I64_I64_RetI64_PE },
{ "Mlilp", (void*)&CallFunc_I32_I64_RetI64_PE },
{ "Mlip", (void*)&CallFunc_I32_RetI64_PE },
- { "Mlllp", (void*)&CallFunc_I64_I64_RetI64_PE },
{ "Mlp", (void*)&CallFunc_Void_RetI64_PE },
- { "Mv", (void*)&CallFunc_Void_RetVoid },
- { "MvS8", (void*)&CallFunc_S8_RetVoid },
- { "MvS8S8", (void*)&CallFunc_S8_S8_RetVoid },
- { "MvS8S8iiiii", (void*)&CallFunc_S8_S8_I32_I32_I32_I32_I32_RetVoid },
- { "MvS8i", (void*)&CallFunc_S8_I32_RetVoid },
- { "MvS8ii", (void*)&CallFunc_S8_I32_I32_RetVoid },
- { "MvS8iii", (void*)&CallFunc_S8_I32_I32_I32_RetVoid },
- { "MvS8iiii", (void*)&CallFunc_S8_I32_I32_I32_I32_RetVoid },
- { "MvS8iiiii", (void*)&CallFunc_S8_I32_I32_I32_I32_I32_RetVoid },
- { "MvS8iiiiii", (void*)&CallFunc_S8_I32_I32_I32_I32_I32_I32_RetVoid },
- { "MvS8iiiiiiiiiii", (void*)&CallFunc_S8_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_I32_RetVoid },
+ { "MvS8S8iip", (void*)&CallFunc_S8_S8_I32_I32_RetVoid_PE },
+ { "MvS8iiip", (void*)&CallFunc_S8_I32_I32_I32_RetVoid_PE },
+ { "MvS8iip", (void*)&CallFunc_S8_I32_I32_RetVoid_PE },
+ { "MvS8ip", (void*)&CallFunc_S8_I32_RetVoid_PE },
+ { "MvS8p", (void*)&CallFunc_S8_RetVoid_PE },
+ { "MvTiiip", (void*)&CallFunc_This_I32_I32_I32_RetVoid_PE },
+ { "MvTiip", (void*)&CallFunc_This_I32_I32_RetVoid_PE },
+ { "MvTip", (void*)&CallFunc_This_I32_RetVoid_PE },
{ "MvTp", (void*)&CallFunc_This_RetVoid_PE },
- { "Mvdiip", (void*)&CallFunc_F64_I32_I32_RetVoid_PE },
- { "Mvfiip", (void*)&CallFunc_F32_I32_I32_RetVoid_PE },
{ "Mvi", (void*)&CallFunc_I32_RetVoid },
- { "MviS8i", (void*)&CallFunc_I32_S8_I32_RetVoid },
+ { "MviS8ip", (void*)&CallFunc_I32_S8_I32_RetVoid_PE },
{ "Mvii", (void*)&CallFunc_I32_I32_RetVoid },
- { "MviiS8S8i", (void*)&CallFunc_I32_I32_S8_S8_I32_RetVoid },
- { "MviiS8S8ii", (void*)&CallFunc_I32_I32_S8_S8_I32_I32_RetVoid },
{ "Mviii", (void*)&CallFunc_I32_I32_I32_RetVoid },
- { "MviiiS8S8", (void*)&CallFunc_I32_I32_I32_S8_S8_RetVoid },
- { "MviiiS8S8i", (void*)&CallFunc_I32_I32_I32_S8_S8_I32_RetVoid },
{ "Mviiii", (void*)&CallFunc_I32_I32_I32_I32_RetVoid },
{ "Mviiiii", (void*)&CallFunc_I32_I32_I32_I32_I32_RetVoid },
- { "Mviiiiii", (void*)&CallFunc_I32_I32_I32_I32_I32_I32_RetVoid },
+ { "Mviiiiiiip", (void*)&CallFunc_I32_I32_I32_I32_I32_I32_I32_RetVoid_PE },
+ { "Mviiiiiip", (void*)&CallFunc_I32_I32_I32_I32_I32_I32_RetVoid_PE },
+ { "Mviiiiip", (void*)&CallFunc_I32_I32_I32_I32_I32_RetVoid_PE },
+ { "Mviiiip", (void*)&CallFunc_I32_I32_I32_I32_RetVoid_PE },
{ "Mviiip", (void*)&CallFunc_I32_I32_I32_RetVoid_PE },
{ "Mviip", (void*)&CallFunc_I32_I32_RetVoid_PE },
{ "Mvili", (void*)&CallFunc_I32_I64_I32_RetVoid },
{ "Mvip", (void*)&CallFunc_I32_RetVoid_PE },
- { "Mvl", (void*)&CallFunc_I64_RetVoid },
+ { "Mvlp", (void*)&CallFunc_I64_RetVoid_PE },
{ "Mvp", (void*)&CallFunc_Void_RetVoid_PE }
};
diff --git a/src/coreclr/vm/wasm/wasi/callhelpers-pinvoke.cpp b/src/coreclr/vm/wasm/wasi/callhelpers-pinvoke.cpp
index e128a77b7bd640..89b992b77aae8f 100644
--- a/src/coreclr/vm/wasm/wasi/callhelpers-pinvoke.cpp
+++ b/src/coreclr/vm/wasm/wasi/callhelpers-pinvoke.cpp
@@ -94,6 +94,7 @@ extern "C" {
int32_t SystemNative_GetBytesAvailable (void *, void *);
int32_t SystemNative_GetControlMessageBufferSize (int32_t, int32_t);
double SystemNative_GetCpuUtilization (void *);
+ int32_t SystemNative_GetCryptographicallySecureRandomBytes (void *, int32_t);
void * SystemNative_GetCwd (void *, int32_t);
void * SystemNative_GetDefaultSearchOrderPseudoHandle ();
int32_t SystemNative_GetErrNo ();
@@ -342,6 +343,7 @@ static const Entry s_libSystem_Native [] = {
DllImportEntry(SystemNative_GetBytesAvailable) // System.Net.Sockets
DllImportEntry(SystemNative_GetControlMessageBufferSize) // System.Net.Sockets
DllImportEntry(SystemNative_GetCpuUtilization) // System.Private.CoreLib
+ DllImportEntry(SystemNative_GetCryptographicallySecureRandomBytes) // System.IO.Compression
DllImportEntry(SystemNative_GetCwd) // System.Private.CoreLib
DllImportEntry(SystemNative_GetDefaultSearchOrderPseudoHandle) // System.Private.CoreLib
DllImportEntry(SystemNative_GetErrNo) // System.Net.NameResolution, System.Private.CoreLib
@@ -527,7 +529,7 @@ typedef struct PInvokeTable {
static PInvokeTable s_PInvokeTables[] = {
{"libSystem.Globalization.Native", s_libSystem_Globalization_Native, 34},
{"libSystem.IO.Compression.Native", s_libSystem_IO_Compression_Native, 10},
- {"libSystem.Native", s_libSystem_Native, 147},
+ {"libSystem.Native", s_libSystem_Native, 148},
{"libSystem.Native.Browser", s_libSystem_Native_Browser, 0},
{"libSystem.Runtime.InteropServices.JavaScript.Native", s_libSystem_Runtime_InteropServices_JavaScript_Native, 0},
{"wasi:clocks/monotonic-clock@0.2.8", s_wasi_3A_clocks_2F_monotonic_clock_40_0_2_8, 4},
diff --git a/src/coreclr/vm/weakreferencenative.cpp b/src/coreclr/vm/weakreferencenative.cpp
index 74dcf7c1ea71d5..78e641b4ffcb27 100644
--- a/src/coreclr/vm/weakreferencenative.cpp
+++ b/src/coreclr/vm/weakreferencenative.cpp
@@ -47,7 +47,7 @@ void FinalizeWeakReference(Object* obj)
#if defined(FEATURE_COMINTEROP)
-extern "C" void QCALLTYPE ComWeakRefToObject(IWeakReference* pComWeakReference, QCall::ObjectHandleOnStack retRcw)
+extern "C" void QCALLTYPE ComWeakRefToObject(IWeakReference* pComWeakReference, QCall::ObjectHandleOnStack retRcw, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
BEGIN_QCALL;
@@ -88,11 +88,12 @@ extern "C" void QCALLTYPE ComWeakRefToObject(IWeakReference* pComWeakReference,
return;
}
-extern "C" IWeakReference * QCALLTYPE ObjectToComWeakRef(QCall::ObjectHandleOnStack obj)
+extern "C" IWeakReference * QCALLTYPE ObjectToComWeakRef(QCall::ObjectHandleOnStack obj, QCallExceptionStatus* qcallError)
{
QCALL_CONTRACT;
IWeakReference* pWeakReference = nullptr;
+
BEGIN_QCALL;
IWeakReferenceSource* pWeakReferenceSourceRaw = nullptr;
diff --git a/src/coreclr/vm/weakreferencenative.h b/src/coreclr/vm/weakreferencenative.h
index df2ba1dc23e4dd..d871a7c6780896 100644
--- a/src/coreclr/vm/weakreferencenative.h
+++ b/src/coreclr/vm/weakreferencenative.h
@@ -15,8 +15,8 @@
#ifdef FEATURE_COMINTEROP
-extern "C" void QCALLTYPE ComWeakRefToObject(IWeakReference * pComWeakReference, QCall::ObjectHandleOnStack retRcw);
-extern "C" IWeakReference * QCALLTYPE ObjectToComWeakRef(QCall::ObjectHandleOnStack obj);
+extern "C" void QCALLTYPE ComWeakRefToObject(IWeakReference * pComWeakReference, QCall::ObjectHandleOnStack retRcw, QCallExceptionStatus* qcallError);
+extern "C" IWeakReference * QCALLTYPE ObjectToComWeakRef(QCall::ObjectHandleOnStack obj, QCallExceptionStatus* qcallError);
#endif // FEATURE_COMINTEROP
diff --git a/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems b/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems
index c8bc44f367c539..0fe40b3703b216 100644
--- a/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems
+++ b/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems
@@ -1034,6 +1034,7 @@
+
diff --git a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipe.Internal.cs b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipe.Internal.cs
index dfa67fe2c2c392..a37e144506ba09 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipe.Internal.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipe.Internal.cs
@@ -1,5 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
@@ -14,6 +15,9 @@ internal static partial class EventPipeInternal
//
// These PInvokes are used by the configuration APIs to interact with EventPipe.
//
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "EventPipeInternal_Enable")]
private static unsafe partial ulong Enable(
char* outputFile,
@@ -22,47 +26,80 @@ private static unsafe partial ulong Enable(
EventPipeProviderConfigurationNative* providers,
uint numProviders);
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "EventPipeInternal_Disable")]
internal static partial void Disable(ulong sessionID);
//
// These PInvokes are used by EventSource to interact with the EventPipe.
//
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "EventPipeInternal_CreateProvider", StringMarshalling = StringMarshalling.Utf16)]
internal static unsafe partial IntPtr CreateProvider(string providerName,
delegate* unmanaged callbackFunc,
void* callbackContext);
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "EventPipeInternal_DefineEvent")]
internal static unsafe partial IntPtr DefineEvent(IntPtr provHandle, uint eventID, long keywords, uint eventVersion, uint level, void *pMetadata, uint metadataLength);
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "EventPipeInternal_GetProvider", StringMarshalling = StringMarshalling.Utf16)]
internal static partial IntPtr GetProvider(string providerName);
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "EventPipeInternal_DeleteProvider")]
internal static partial void DeleteProvider(IntPtr provHandle);
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "EventPipeInternal_EventActivityIdControl")]
internal static partial int EventActivityIdControl(uint controlCode, ref Guid activityId);
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "EventPipeInternal_WriteEventData")]
internal static unsafe partial void WriteEventData(IntPtr eventHandle, EventProvider.EventData* pEventData, uint dataCount, Guid* activityId, Guid* relatedActivityId);
//
// These PInvokes are used as part of the EventPipeEventDispatcher.
//
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "EventPipeInternal_GetSessionInfo")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static unsafe partial bool GetSessionInfo(ulong sessionID, EventPipeSessionInfo* pSessionInfo);
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "EventPipeInternal_GetNextEvent")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static unsafe partial bool GetNextEvent(ulong sessionID, EventPipeEventInstanceData* pInstance);
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "EventPipeInternal_SignalSession")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static unsafe partial bool SignalSession(ulong sessionID);
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "EventPipeInternal_WaitForSessionSignal")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static unsafe partial bool WaitForSessionSignal(ulong sessionID, int timeoutMs);
diff --git a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipeEventDispatcher.Threads.cs b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipeEventDispatcher.Threads.cs
index 93c7f3473c8f5f..adf851c68f911c 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipeEventDispatcher.Threads.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipeEventDispatcher.Threads.cs
@@ -1,5 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
diff --git a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipeEventDispatcher.cs b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipeEventDispatcher.cs
index 83911a0a13a492..ec8091cfc34453 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipeEventDispatcher.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipeEventDispatcher.cs
@@ -1,5 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
diff --git a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/NativeRuntimeEventSource.Threading.NativeSinks.Internal.cs b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/NativeRuntimeEventSource.Threading.NativeSinks.Internal.cs
index 870a12080ab499..3ca9d1688fbca4 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/NativeRuntimeEventSource.Threading.NativeSinks.Internal.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/NativeRuntimeEventSource.Threading.NativeSinks.Internal.cs
@@ -9,10 +9,16 @@ namespace System.Diagnostics.Tracing
internal sealed partial class NativeRuntimeEventSource : EventSource
{
[NonEvent]
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "NativeRuntimeEventSource_LogContentionLockCreated")]
private static partial void LogContentionLockCreated(nint LockID, nint AssociatedObjectID, ushort ClrInstanceID);
[NonEvent]
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "NativeRuntimeEventSource_LogContentionStart")]
private static partial void LogContentionStart(
ContentionFlagsMap ContentionFlags,
@@ -22,6 +28,9 @@ private static partial void LogContentionStart(
ulong LockOwnerThreadID);
[NonEvent]
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "NativeRuntimeEventSource_LogContentionStop")]
private static partial void LogContentionStop(
ContentionFlagsMap ContentionFlags,
@@ -29,30 +38,51 @@ private static partial void LogContentionStop(
double DurationNs);
[NonEvent]
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "NativeRuntimeEventSource_LogThreadPoolWorkerThreadStart")]
private static partial void LogThreadPoolWorkerThreadStart(uint ActiveWorkerThreadCount, uint RetiredWorkerThreadCount, ushort ClrInstanceID);
[NonEvent]
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "NativeRuntimeEventSource_LogThreadPoolWorkerThreadStop")]
private static partial void LogThreadPoolWorkerThreadStop(uint ActiveWorkerThreadCount, uint RetiredWorkerThreadCount, ushort ClrInstanceID);
[NonEvent]
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "NativeRuntimeEventSource_LogThreadPoolWorkerThreadWait")]
private static partial void LogThreadPoolWorkerThreadWait(uint ActiveWorkerThreadCount, uint RetiredWorkerThreadCount, ushort ClrInstanceID);
[NonEvent]
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "NativeRuntimeEventSource_LogThreadPoolMinMaxThreads")]
private static partial void LogThreadPoolMinMaxThreads(ushort MinWorkerThreads, ushort MaxWorkerThreads, ushort MinIOCompletionThreads, ushort MaxIOCompletionThreads, ushort ClrInstanceID);
[NonEvent]
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "NativeRuntimeEventSource_LogThreadPoolWorkerThreadAdjustmentSample")]
private static partial void LogThreadPoolWorkerThreadAdjustmentSample(double Throughput, ushort ClrInstanceID);
[NonEvent]
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "NativeRuntimeEventSource_LogThreadPoolWorkerThreadAdjustmentAdjustment")]
private static partial void LogThreadPoolWorkerThreadAdjustmentAdjustment(double AverageThroughput, uint NewWorkerThreadCount, ThreadAdjustmentReasonMap Reason, ushort ClrInstanceID);
[NonEvent]
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "NativeRuntimeEventSource_LogThreadPoolWorkerThreadAdjustmentStats")]
private static partial void LogThreadPoolWorkerThreadAdjustmentStats(
double Duration,
@@ -68,6 +98,9 @@ private static partial void LogThreadPoolWorkerThreadAdjustmentStats(
ushort ClrInstanceID);
[NonEvent]
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "NativeRuntimeEventSource_LogThreadPoolIOEnqueue")]
private static partial void LogThreadPoolIOEnqueue(
IntPtr NativeOverlapped,
@@ -76,6 +109,9 @@ private static partial void LogThreadPoolIOEnqueue(
ushort ClrInstanceID);
[NonEvent]
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "NativeRuntimeEventSource_LogThreadPoolIODequeue")]
private static partial void LogThreadPoolIODequeue(
IntPtr NativeOverlapped,
@@ -83,12 +119,18 @@ private static partial void LogThreadPoolIODequeue(
ushort ClrInstanceID);
[NonEvent]
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "NativeRuntimeEventSource_LogThreadPoolWorkingThreadCount")]
private static partial void LogThreadPoolWorkingThreadCount(
uint Count,
ushort ClrInstanceID);
[NonEvent]
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "NativeRuntimeEventSource_LogThreadPoolIOPack")]
private static partial void LogThreadPoolIOPack(
IntPtr NativeOverlapped,
@@ -96,6 +138,9 @@ private static partial void LogThreadPoolIOPack(
ushort ClrInstanceID);
[NonEvent]
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "NativeRuntimeEventSource_LogWaitHandleWaitStart")]
private static partial void LogWaitHandleWaitStart(
WaitHandleWaitSourceMap WaitSource,
@@ -103,6 +148,9 @@ private static partial void LogWaitHandleWaitStart(
ushort ClrInstanceID);
[NonEvent]
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "NativeRuntimeEventSource_LogWaitHandleWaitStop")]
private static partial void LogWaitHandleWaitStop(ushort ClrInstanceID);
}
diff --git a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/TraceLogging/XplatEventLogger.cs b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/TraceLogging/XplatEventLogger.cs
index fdc303ec2db743..7806bc66058370 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/TraceLogging/XplatEventLogger.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/TraceLogging/XplatEventLogger.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections.Generic;
@@ -21,6 +21,9 @@ public XplatEventLogger() { }
private static unsafe string GetClrConfig(string configName) => new string(EventSource_GetClrConfig(configName));
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, StringMarshalling = StringMarshalling.Utf16)]
private static unsafe partial char* EventSource_GetClrConfig(string configName);
@@ -41,10 +44,16 @@ public XplatEventLogger() { }
return null;
}
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall)]
[return: MarshalAs(UnmanagedType.Bool)]
private static partial bool IsEventSourceLoggingEnabled();
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, StringMarshalling = StringMarshalling.Utf16)]
private static partial void LogEventSource(int eventID, string? eventName, string eventSourceName, string payload);
diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/InteropServices/ErrorHandlerAttribute.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/InteropServices/ErrorHandlerAttribute.cs
new file mode 100644
index 00000000000000..2be59f2a71b501
--- /dev/null
+++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/InteropServices/ErrorHandlerAttribute.cs
@@ -0,0 +1,27 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+#if CORECLR
+
+namespace System.Runtime.InteropServices
+{
+ internal enum ErrorLocation
+ {
+ ReturnValue = 0,
+ LastParameter = 1,
+ HiddenReturnValue = 2,
+ HiddenLastParameter = 3,
+ }
+
+ [AttributeUsage(AttributeTargets.Method)]
+ internal sealed class ErrorHandlerAttribute : Attribute
+ {
+ public ErrorHandlerAttribute(Type marshallerType, ErrorLocation errorLocation)
+ {
+ _ = marshallerType;
+ _ = errorLocation;
+ }
+ }
+}
+
+#endif
diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/InteropServices/TypeMapLazyDictionary.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/InteropServices/TypeMapLazyDictionary.cs
index 46f2e40cabf68c..17f3d3f2089985 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Runtime/InteropServices/TypeMapLazyDictionary.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/InteropServices/TypeMapLazyDictionary.cs
@@ -80,6 +80,9 @@ public unsafe struct ProcessAttributesCallbackArg
public int StringLen2;
}
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeMapLazyDictionary_ProcessAttributes")]
private static unsafe partial void ProcessAttributes(
QCallAssembly assembly,
@@ -90,9 +93,15 @@ private static unsafe partial void ProcessAttributes(
delegate* unmanaged newPrecachedProxyTypeMap,
CallbackContext* context);
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeMapLazyDictionary_FindPrecachedExternalTypeMapEntry", StringMarshalling = StringMarshalling.Utf8)]
private static unsafe partial IntPtr FindPrecachedExternalTypeMapEntry(QCallModule module, QCallTypeHandle groupType, string key);
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "TypeMapLazyDictionary_FindPrecachedProxyTypeMapEntry")]
private static unsafe partial IntPtr FindPrecachedProxyTypeMapEntry(QCallModule module, QCallTypeHandle groupType, QCallTypeHandle type);
diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/Wasi/WasiFinalizerScheduler.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/Wasi/WasiFinalizerScheduler.cs
index a1bcc6631e3988..bc9b9943a0181a 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Threading/Wasi/WasiFinalizerScheduler.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Threading/Wasi/WasiFinalizerScheduler.cs
@@ -21,10 +21,16 @@ internal static partial class WasiFinalizerScheduler
// event-loop drain is a no-op here.
internal static void DrainIfPending() { }
#else
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "WasiFinalizer_TryClearPending")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static partial bool TryClearPendingFinalization();
+#if CORECLR
+ [ErrorHandler(typeof(QCallExceptionStatusMarshaller), ErrorLocation.HiddenLastParameter)]
+#endif
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "WasiFinalizer_RunWorker")]
internal static partial void ExecuteFinalizationCallback();
diff --git a/src/libraries/System.Runtime/tests/System.Runtime.Tests/System/Runtime/CompilerServices/RuntimeHelpersTests.cs b/src/libraries/System.Runtime/tests/System.Runtime.Tests/System/Runtime/CompilerServices/RuntimeHelpersTests.cs
index 2076198d225a39..36286da70b6663 100644
--- a/src/libraries/System.Runtime/tests/System.Runtime.Tests/System/Runtime/CompilerServices/RuntimeHelpersTests.cs
+++ b/src/libraries/System.Runtime/tests/System.Runtime.Tests/System/Runtime/CompilerServices/RuntimeHelpersTests.cs
@@ -761,6 +761,37 @@ public static void BoxVoid()
RuntimeHelpers.Box(ref value, typeof(void).TypeHandle);
});
}
+
+ [ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.IsCoreCLR))]
+ [InlineData(1, typeof(OutOfMemoryException))]
+ [InlineData(2, typeof(StackOverflowException))]
+ public static void QCallExceptionStatus_ThrowsSpecialException(int status, Type exceptionType)
+ {
+ TargetInvocationException exception = Assert.Throws(
+ () => GetQCallExceptionStatusMarshaller().Invoke(null, [(nint)status]));
+
+ Assert.IsType(exceptionType, exception.InnerException);
+ }
+
+ [ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsCoreCLR))]
+ public static void QCallExceptionStatus_ThrowsExactExceptionFromHandle()
+ {
+ InvalidOperationException expected = new();
+ GCHandle handle = GCHandle.Alloc(expected);
+
+ TargetInvocationException exception = Assert.Throws(
+ () => GetQCallExceptionStatusMarshaller().Invoke(null, [GCHandle.ToIntPtr(handle)]));
+
+ Assert.Same(expected, exception.InnerException);
+ }
+
+ private static MethodInfo GetQCallExceptionStatusMarshaller()
+ {
+ Type marshallerType = typeof(object).Assembly.GetType(
+ "System.Runtime.CompilerServices.QCallExceptionStatusMarshaller",
+ throwOnError: true);
+ return marshallerType.GetMethod("ConvertToManaged", BindingFlags.Public | BindingFlags.Static);
+ }
}
public struct Age
diff --git a/src/tests/Interop/COM/NETClients/Primitives/Program.cs b/src/tests/Interop/COM/NETClients/Primitives/Program.cs
index e487e15d08de91..c6d12d07fbb7da 100644
--- a/src/tests/Interop/COM/NETClients/Primitives/Program.cs
+++ b/src/tests/Interop/COM/NETClients/Primitives/Program.cs
@@ -12,6 +12,7 @@ namespace NetClient
public class Program
{
[Fact]
+ [SkipOnCoreClr("Stack trace assertions are unreliable under JIT stress due to aggressive inlining", RuntimeTestModes.JitStress)]
public static int TestEntryPoint()
{
// RegFree COM is not supported on Windows Nano
diff --git a/src/tests/Interop/COM/NETClients/Primitives/StringTests.cs b/src/tests/Interop/COM/NETClients/Primitives/StringTests.cs
index 1de229f27cc284..331d3bec9be560 100644
--- a/src/tests/Interop/COM/NETClients/Primitives/StringTests.cs
+++ b/src/tests/Interop/COM/NETClients/Primitives/StringTests.cs
@@ -193,7 +193,27 @@ private void Marshal_LPWString()
Assert.Equal(expected, actual);
actual = local;
- Assert.Throws( () => this.server.Reverse_LPWStr_OutAttr(local, actual));
+ MarshalDirectiveException exception = Assert.Throws(() => this.server.Reverse_LPWStr_OutAttr(local, actual));
+ string[] expectedStackTrace =
+ {
+ "System.StubHelpers.StubHelpers.ThrowInteropParamException",
+ "Server.Contract.IStringTesting.Reverse_LPWStr_OutAttr",
+ "Xunit.Assert.RecordException",
+ };
+ string[] actualStackTrace = exception.StackTrace!
+ .Split(Environment.NewLine)
+ .Select(static frame => frame.TrimStart())
+ .Where(static frame => frame.StartsWith("at ", StringComparison.Ordinal) && frame.Contains('('))
+ .Select(static frame => frame.Substring("at ".Length, frame.IndexOf('(') - "at ".Length))
+ .ToArray();
+
+ int actualFrameIndex = 0;
+ foreach (string expectedFrame in expectedStackTrace)
+ {
+ actualFrameIndex = Array.IndexOf(actualStackTrace, expectedFrame, actualFrameIndex);
+ Assert.True(actualFrameIndex >= 0, $"Expected stack frame '{expectedFrame}' was not found in order.");
+ actualFrameIndex++;
+ }
}
foreach (var s in reversibleStrings)
]