summaryrefslogtreecommitdiff
path: root/src/vm/stubhelpers.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/stubhelpers.h')
-rw-r--r--src/vm/stubhelpers.h167
1 files changed, 167 insertions, 0 deletions
diff --git a/src/vm/stubhelpers.h b/src/vm/stubhelpers.h
new file mode 100644
index 0000000000..b64d2868d8
--- /dev/null
+++ b/src/vm/stubhelpers.h
@@ -0,0 +1,167 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// File: stubhelpers.h
+//
+
+//
+
+
+#ifndef __STUBHELPERS_h__
+#define __STUBHELPERS_h__
+
+#include "fcall.h"
+#include "clrvarargs.h"
+
+// Maximum number of deferred byref validation entries - we will trigger gen0 GC if we reach this number.
+#define BYREF_VALIDATION_LIST_MAX_SIZE (512 * 1024)
+
+class StubHelpers
+{
+#ifdef VERIFY_HEAP
+ struct ByrefValidationEntry
+ {
+ void *pByref; // pointer to GC heap
+ MethodDesc *pMD; // interop MD this byref was passed to
+ };
+
+ static CQuickArray<ByrefValidationEntry> s_ByrefValidationEntries;
+ static SIZE_T s_ByrefValidationIndex;
+ static CrstStatic s_ByrefValidationLock;
+
+ static void ValidateObjectInternal(Object *pObjUNSAFE, BOOL fValidateNextObj);
+ static MethodDesc *ResolveInteropMethod(Object *pThisUNSAFE, MethodDesc *pMD);
+ static void FormatValidationMessage(MethodDesc *pMD, SString &ssErrorString);
+
+public:
+ static void Init();
+ static void ProcessByrefValidationList();
+#else // VERIFY_HEAP
+public:
+ static void Init() { LIMITED_METHOD_CONTRACT; }
+#endif // VERIFY_HEAP
+
+ //-------------------------------------------------------
+ // PInvoke stub helpers
+ //-------------------------------------------------------
+
+ static FCDECL1(double, DateMarshaler__ConvertToNative, INT64 managedDate);
+ static FCDECL1_V(INT64, DateMarshaler__ConvertToManaged, double nativeDate);
+
+ static FCDECL4(void, ValueClassMarshaler__ConvertToNative, LPVOID pDest, LPVOID pSrc, MethodTable* pMT, OBJECTREF *ppCleanupWorkListOnStack);
+ static FCDECL3(void, ValueClassMarshaler__ConvertToManaged, LPVOID pDest, LPVOID pSrc, MethodTable* pMT);
+ static FCDECL2(void, ValueClassMarshaler__ClearNative, LPVOID pDest, MethodTable* pMT);
+
+#ifdef FEATURE_COMINTEROP
+ static FCDECL4(IUnknown*, GetCOMIPFromRCW, Object* pSrcUNSAFE, MethodDesc* pMD, void **ppTarget, CLR_BOOL* pfNeedsRelease);
+ static FCDECL3(IUnknown*, GetCOMIPFromRCW_WinRT, Object* pSrcUNSAFE, MethodDesc* pMD, void **ppTarget);
+ static FCDECL3(IUnknown*, GetCOMIPFromRCW_WinRTSharedGeneric, Object* pSrcUNSAFE, MethodDesc* pMD, void **ppTarget);
+ static FCDECL3(IUnknown*, GetCOMIPFromRCW_WinRTDelegate, Object* pSrcUNSAFE, MethodDesc* pMD, void **ppTarget);
+
+ static FCDECL2(FC_BOOL_RET, ShouldCallWinRTInterface, Object* pSrcUNSAFE, MethodDesc* pMD);
+ static FCDECL3(DelegateObject*, GetTargetForAmbiguousVariantCall, Object* pSrcUNSAFE, MethodTable* pMT, CLR_BOOL *pfUseString);
+
+ static FCDECL2(void, ObjectMarshaler__ConvertToNative, Object* pSrcUNSAFE, VARIANT* pDest);
+ static FCDECL1(Object*, ObjectMarshaler__ConvertToManaged, VARIANT* pSrc);
+ static FCDECL1(void, ObjectMarshaler__ClearNative, VARIANT* pSrc);
+
+ static FCDECL4(IUnknown*, InterfaceMarshaler__ConvertToNative, Object* pObjUNSAFE, MethodTable* pItfMT, MethodTable* pClsMT, DWORD dwFlags);
+ static FCDECL4(Object*, InterfaceMarshaler__ConvertToManaged, IUnknown **ppUnk, MethodTable *pItfMT, MethodTable *pClsMT, DWORD dwFlags);
+ static void QCALLTYPE InterfaceMarshaler__ClearNative(IUnknown * pUnk);
+ static FCDECL1(Object *, InterfaceMarshaler__ConvertToManagedWithoutUnboxing, IUnknown *pNative);
+
+ static FCDECL1(StringObject*, UriMarshaler__GetRawUriFromNative, ABI::Windows::Foundation::IUriRuntimeClass* pIUriRC);
+ static FCDECL2(IUnknown*, UriMarshaler__CreateNativeUriInstance, __in_ecount(strLen) CLR_CHAR* pRawUriObj, UINT strLen);
+
+ static ABI::Windows::UI::Xaml::Interop::INotifyCollectionChangedEventArgs* QCALLTYPE
+ EventArgsMarshaler__CreateNativeNCCEventArgsInstance
+ (int action, ABI::Windows::UI::Xaml::Interop::IBindableVector *newItem, ABI::Windows::UI::Xaml::Interop::IBindableVector *oldItem, int newIndex, int oldIndex);
+
+ static ABI::Windows::UI::Xaml::Data::IPropertyChangedEventArgs* QCALLTYPE EventArgsMarshaler__CreateNativePCEventArgsInstance(HSTRING name);
+
+ static FCDECL1(MethodDesc *, GetDelegateInvokeMethod, DelegateObject *pThisUNSAFE);
+ static FCDECL2(IInspectable *, GetWinRTFactoryReturnValue, Object *pThisUNSAFE, PCODE pCtorEntry);
+ static FCDECL2(IInspectable *, GetOuterInspectable, Object *pThisUNSAFE, MethodDesc *pCtorMD);
+#ifdef MDA_SUPPORTED
+ static FCDECL2(ExceptionObject*,TriggerExceptionSwallowedMDA, ExceptionObject* pExceptionUNSAFE, PCODE pManagedTarget);
+#endif // MDA_SUPPORTED
+#endif // FEATURE_COMINTEROP
+
+ static FCDECL0(void, SetLastError );
+ static FCDECL0(void, ClearLastError );
+ static FCDECL1(FC_BOOL_RET, IsQCall, NDirectMethodDesc* pNMD);
+ static FCDECL1(void, InitDeclaringType, NDirectMethodDesc* pMND);
+ static FCDECL1(void*, GetNDirectTarget, NDirectMethodDesc* pNMD);
+ static FCDECL2(void*, GetDelegateTarget, DelegateObject *pThisUNSAFE, UINT_PTR *ppStubArg);
+
+#ifndef FEATURE_CORECLR
+#ifndef _WIN64
+ static FCDECL3(void*, GetFinalStubTarget, LPVOID pStubArg, LPVOID pUnmngThis, DWORD dwFlags);
+#endif // !_WIN64
+ static FCDECL1(void, DemandPermission, NDirectMethodDesc *pNMD);
+#endif // !FEATURE_CORECLR
+
+ static FCDECL2(void, ThrowInteropParamException, UINT resID, UINT paramIdx);
+ static FCDECL1(Object*, GetHRExceptionObject, HRESULT hr);
+
+#ifdef FEATURE_COMINTEROP
+ static FCDECL4(Object*, GetCOMHRExceptionObject, HRESULT hr, MethodDesc *pMD, Object *unsafe_pThis, CLR_BOOL fForWinRT);
+#endif // FEATURE_COMINTEROP
+
+ static FCDECL3(void*, CreateCustomMarshalerHelper, MethodDesc* pMD, mdToken paramToken, TypeHandle hndManagedType);
+
+ static FCDECL1(void, DecimalCanonicalizeInternal, DECIMAL *pDec);
+ static FCDECL3(void, FmtClassUpdateNativeInternal, Object* pObjUNSAFE, BYTE* pbNative, OBJECTREF *ppCleanupWorkListOnStack);
+ static FCDECL2(void, FmtClassUpdateCLRInternal, Object* pObjUNSAFE, BYTE* pbNative);
+ static FCDECL2(void, LayoutDestroyNativeInternal, BYTE* pbNative, MethodTable* pMT);
+ static FCDECL1(Object*, AllocateInternal, EnregisteredTypeHandle typeHnd);
+ static FCDECL1(int, AnsiStrlen, __in_z char* pszStr);
+ static FCDECL3(void, MarshalToUnmanagedVaListInternal, va_list va, DWORD cbVaListSize, const VARARGS* pArgIterator);
+ static FCDECL2(void, MarshalToManagedVaListInternal, va_list va, VARARGS* pArgIterator);
+ static FCDECL0(void*, GetStubContext);
+ static FCDECL2(void, LogPinnedArgument, MethodDesc *localDesc, Object *nativeArg);
+#ifdef _WIN64
+ static FCDECL0(void*, GetStubContextAddr);
+#endif // _WIN64
+ static FCDECL1(DWORD, CalcVaListSize, VARARGS *varargs);
+ static FCDECL3(void, ValidateObject, Object *pObjUNSAFE, MethodDesc *pMD, Object *pThisUNSAFE);
+ static FCDECL3(void, ValidateByref, void *pByref, MethodDesc *pMD, Object *pThisUNSAFE);
+
+#ifdef FEATURE_COMINTEROP
+ //-------------------------------------------------------
+ // Helper for the MDA RaceOnRCWCleanup
+ //-------------------------------------------------------
+ static FCDECL1(void, StubRegisterRCW, Object *unsafe_pThis);
+ static FCDECL1(void, StubUnregisterRCW, Object *unsafe_pThis);
+ static FCDECL1(Object*, GetWinRTFactoryObject, MethodDesc *pCMD);
+#endif // FEATURE_COMINTEROP
+
+#ifdef MDA_SUPPORTED
+ static FCDECL0(void, TriggerGCForMDA);
+ static FCDECL1(void, CheckCollectedDelegateMDA, LPVOID pEntryThunk);
+#endif // MDA_SUPPORTED
+
+#ifdef PROFILING_SUPPORTED
+ //-------------------------------------------------------
+ // Profiler helper
+ //-------------------------------------------------------
+ static FCDECL3(SIZE_T, ProfilerBeginTransitionCallback, SIZE_T pSecretParam, Thread* pThread, Object* unsafe_pThis);
+ static FCDECL2(void, ProfilerEndTransitionCallback, MethodDesc* pRealMD, Thread* pThread);
+#endif
+
+#ifdef FEATURE_ARRAYSTUB_AS_IL
+ static FCDECL2(void, ArrayTypeCheck, Object*, PtrArray*);
+#endif
+
+#ifdef FEATURE_COMINTEROP
+ static FCDECL2(StringObject *, WinRTTypeNameConverter__ConvertToWinRTTypeName, ReflectClassBaseObject *pTypeUNSAFE, CLR_BOOL *pbIsWinRTPrimitive);
+ static FCDECL2(ReflectClassBaseObject *, WinRTTypeNameConverter__GetTypeFromWinRTTypeName, StringObject *pWinRTTypeNameUNSAFE, CLR_BOOL *pbIsPrimitive);
+#endif // FEATURE_COMINTEROP
+
+#ifdef FEATURE_STUBS_AS_IL
+ static FCDECL2(void, MulticastDebuggerTraceHelper, Object*, INT32);
+#endif
+};
+
+#endif // __STUBHELPERS_h__