| 1 | // Licensed to the .NET Foundation under one or more agreements. |
| 2 | // The .NET Foundation licenses this file to you under the MIT license. |
| 3 | // See the LICENSE file in the project root for more information. |
| 4 | // |
| 5 | // File: stubhelpers.h |
| 6 | // |
| 7 | |
| 8 | // |
| 9 | |
| 10 | |
| 11 | #ifndef __STUBHELPERS_h__ |
| 12 | #define __STUBHELPERS_h__ |
| 13 | |
| 14 | #include "fcall.h" |
| 15 | #include "clrvarargs.h" |
| 16 | |
| 17 | // Maximum number of deferred byref validation entries - we will trigger gen0 GC if we reach this number. |
| 18 | #define BYREF_VALIDATION_LIST_MAX_SIZE (512 * 1024) |
| 19 | |
| 20 | class StubHelpers |
| 21 | { |
| 22 | #ifdef VERIFY_HEAP |
| 23 | struct ByrefValidationEntry |
| 24 | { |
| 25 | void *pByref; // pointer to GC heap |
| 26 | MethodDesc *pMD; // interop MD this byref was passed to |
| 27 | }; |
| 28 | |
| 29 | static CQuickArray<ByrefValidationEntry> s_ByrefValidationEntries; |
| 30 | static SIZE_T s_ByrefValidationIndex; |
| 31 | static CrstStatic s_ByrefValidationLock; |
| 32 | |
| 33 | static void ValidateObjectInternal(Object *pObjUNSAFE, BOOL fValidateNextObj); |
| 34 | static MethodDesc *ResolveInteropMethod(Object *pThisUNSAFE, MethodDesc *pMD); |
| 35 | static void FormatValidationMessage(MethodDesc *pMD, SString &ssErrorString); |
| 36 | |
| 37 | public: |
| 38 | static void Init(); |
| 39 | static void ProcessByrefValidationList(); |
| 40 | #else // VERIFY_HEAP |
| 41 | public: |
| 42 | static void Init() { LIMITED_METHOD_CONTRACT; } |
| 43 | #endif // VERIFY_HEAP |
| 44 | |
| 45 | //------------------------------------------------------- |
| 46 | // PInvoke stub helpers |
| 47 | //------------------------------------------------------- |
| 48 | |
| 49 | static FCDECL1_V(double, DateMarshaler__ConvertToNative, INT64 managedDate); |
| 50 | static FCDECL1_V(INT64, DateMarshaler__ConvertToManaged, double nativeDate); |
| 51 | |
| 52 | static FCDECL4(void, ValueClassMarshaler__ConvertToNative, LPVOID pDest, LPVOID pSrc, MethodTable* pMT, OBJECTREF *ppCleanupWorkListOnStack); |
| 53 | static FCDECL3(void, ValueClassMarshaler__ConvertToManaged, LPVOID pDest, LPVOID pSrc, MethodTable* pMT); |
| 54 | static FCDECL2(void, ValueClassMarshaler__ClearNative, LPVOID pDest, MethodTable* pMT); |
| 55 | |
| 56 | #ifdef FEATURE_COMINTEROP |
| 57 | static FCDECL4(IUnknown*, GetCOMIPFromRCW, Object* pSrcUNSAFE, MethodDesc* pMD, void **ppTarget, CLR_BOOL* pfNeedsRelease); |
| 58 | static FCDECL3(IUnknown*, GetCOMIPFromRCW_WinRT, Object* pSrcUNSAFE, MethodDesc* pMD, void **ppTarget); |
| 59 | static FCDECL3(IUnknown*, GetCOMIPFromRCW_WinRTSharedGeneric, Object* pSrcUNSAFE, MethodDesc* pMD, void **ppTarget); |
| 60 | static FCDECL3(IUnknown*, GetCOMIPFromRCW_WinRTDelegate, Object* pSrcUNSAFE, MethodDesc* pMD, void **ppTarget); |
| 61 | |
| 62 | static FCDECL2(FC_BOOL_RET, ShouldCallWinRTInterface, Object* pSrcUNSAFE, MethodDesc* pMD); |
| 63 | static FCDECL3(DelegateObject*, GetTargetForAmbiguousVariantCall, Object* pSrcUNSAFE, MethodTable* pMT, CLR_BOOL *pfUseString); |
| 64 | |
| 65 | static FCDECL2(void, ObjectMarshaler__ConvertToNative, Object* pSrcUNSAFE, VARIANT* pDest); |
| 66 | static FCDECL1(Object*, ObjectMarshaler__ConvertToManaged, VARIANT* pSrc); |
| 67 | static FCDECL1(void, ObjectMarshaler__ClearNative, VARIANT* pSrc); |
| 68 | |
| 69 | static FCDECL4(IUnknown*, InterfaceMarshaler__ConvertToNative, Object* pObjUNSAFE, MethodTable* pItfMT, MethodTable* pClsMT, DWORD dwFlags); |
| 70 | static FCDECL4(Object*, InterfaceMarshaler__ConvertToManaged, IUnknown **ppUnk, MethodTable *pItfMT, MethodTable *pClsMT, DWORD dwFlags); |
| 71 | static void QCALLTYPE InterfaceMarshaler__ClearNative(IUnknown * pUnk); |
| 72 | static FCDECL1(Object *, InterfaceMarshaler__ConvertToManagedWithoutUnboxing, IUnknown *pNative); |
| 73 | |
| 74 | static FCDECL1(StringObject*, UriMarshaler__GetRawUriFromNative, ABI::Windows::Foundation::IUriRuntimeClass* pIUriRC); |
| 75 | static FCDECL2(IUnknown*, UriMarshaler__CreateNativeUriInstance, __in_ecount(strLen) CLR_CHAR* pRawUriObj, UINT strLen); |
| 76 | |
| 77 | static FCDECL1(MethodDesc *, GetDelegateInvokeMethod, DelegateObject *pThisUNSAFE); |
| 78 | static FCDECL2(IInspectable *, GetWinRTFactoryReturnValue, Object *pThisUNSAFE, PCODE pCtorEntry); |
| 79 | static FCDECL2(IInspectable *, GetOuterInspectable, Object *pThisUNSAFE, MethodDesc *pCtorMD); |
| 80 | #ifdef MDA_SUPPORTED |
| 81 | static FCDECL2(ExceptionObject*,TriggerExceptionSwallowedMDA, ExceptionObject* pExceptionUNSAFE, PCODE pManagedTarget); |
| 82 | #endif // MDA_SUPPORTED |
| 83 | #endif // FEATURE_COMINTEROP |
| 84 | |
| 85 | static FCDECL0(void, SetLastError ); |
| 86 | static FCDECL0(void, ClearLastError ); |
| 87 | static FCDECL1(FC_BOOL_RET, IsQCall, NDirectMethodDesc* pNMD); |
| 88 | static FCDECL1(void, InitDeclaringType, NDirectMethodDesc* pMND); |
| 89 | static FCDECL1(void*, GetNDirectTarget, NDirectMethodDesc* pNMD); |
| 90 | static FCDECL2(void*, GetDelegateTarget, DelegateObject *pThisUNSAFE, UINT_PTR *ppStubArg); |
| 91 | |
| 92 | |
| 93 | static FCDECL2(void, ThrowInteropParamException, UINT resID, UINT paramIdx); |
| 94 | static FCDECL1(Object*, GetHRExceptionObject, HRESULT hr); |
| 95 | |
| 96 | #ifdef FEATURE_COMINTEROP |
| 97 | static FCDECL4(Object*, GetCOMHRExceptionObject, HRESULT hr, MethodDesc *pMD, Object *unsafe_pThis, CLR_BOOL fForWinRT); |
| 98 | #endif // FEATURE_COMINTEROP |
| 99 | |
| 100 | static FCDECL3(void*, CreateCustomMarshalerHelper, MethodDesc* pMD, mdToken paramToken, TypeHandle hndManagedType); |
| 101 | |
| 102 | static FCDECL3(void, FmtClassUpdateNativeInternal, Object* pObjUNSAFE, BYTE* pbNative, OBJECTREF *ppCleanupWorkListOnStack); |
| 103 | static FCDECL2(void, FmtClassUpdateCLRInternal, Object* pObjUNSAFE, BYTE* pbNative); |
| 104 | static FCDECL2(void, LayoutDestroyNativeInternal, BYTE* pbNative, MethodTable* pMT); |
| 105 | static FCDECL1(Object*, AllocateInternal, EnregisteredTypeHandle typeHnd); |
| 106 | static FCDECL3(void, MarshalToUnmanagedVaListInternal, va_list va, DWORD cbVaListSize, const VARARGS* pArgIterator); |
| 107 | static FCDECL2(void, MarshalToManagedVaListInternal, va_list va, VARARGS* pArgIterator); |
| 108 | static FCDECL0(void*, GetStubContext); |
| 109 | static FCDECL2(void, LogPinnedArgument, MethodDesc *localDesc, Object *nativeArg); |
| 110 | #ifdef _TARGET_64BIT_ |
| 111 | static FCDECL0(void*, GetStubContextAddr); |
| 112 | #endif // _TARGET_64BIT_ |
| 113 | static FCDECL1(DWORD, CalcVaListSize, VARARGS *varargs); |
| 114 | static FCDECL3(void, ValidateObject, Object *pObjUNSAFE, MethodDesc *pMD, Object *pThisUNSAFE); |
| 115 | static FCDECL3(void, ValidateByref, void *pByref, MethodDesc *pMD, Object *pThisUNSAFE); |
| 116 | |
| 117 | #ifdef FEATURE_COMINTEROP |
| 118 | //------------------------------------------------------- |
| 119 | // Helper for the MDA RaceOnRCWCleanup |
| 120 | //------------------------------------------------------- |
| 121 | static FCDECL1(void, StubRegisterRCW, Object *unsafe_pThis); |
| 122 | static FCDECL1(void, StubUnregisterRCW, Object *unsafe_pThis); |
| 123 | static FCDECL1(Object*, GetWinRTFactoryObject, MethodDesc *pCMD); |
| 124 | #endif // FEATURE_COMINTEROP |
| 125 | |
| 126 | #ifdef MDA_SUPPORTED |
| 127 | static FCDECL0(void, TriggerGCForMDA); |
| 128 | static FCDECL1(void, CheckCollectedDelegateMDA, LPVOID pEntryThunk); |
| 129 | #endif // MDA_SUPPORTED |
| 130 | |
| 131 | #ifdef PROFILING_SUPPORTED |
| 132 | //------------------------------------------------------- |
| 133 | // Profiler helper |
| 134 | //------------------------------------------------------- |
| 135 | static FCDECL3(SIZE_T, ProfilerBeginTransitionCallback, SIZE_T pSecretParam, Thread* pThread, Object* unsafe_pThis); |
| 136 | static FCDECL2(void, ProfilerEndTransitionCallback, MethodDesc* pRealMD, Thread* pThread); |
| 137 | #endif |
| 138 | |
| 139 | #ifdef FEATURE_ARRAYSTUB_AS_IL |
| 140 | static FCDECL2(void, ArrayTypeCheck, Object*, PtrArray*); |
| 141 | #endif |
| 142 | |
| 143 | #ifdef FEATURE_COMINTEROP |
| 144 | static FCDECL2(StringObject *, WinRTTypeNameConverter__ConvertToWinRTTypeName, ReflectClassBaseObject *pTypeUNSAFE, CLR_BOOL *pbIsWinRTPrimitive); |
| 145 | static FCDECL2(ReflectClassBaseObject *, WinRTTypeNameConverter__GetTypeFromWinRTTypeName, StringObject *pWinRTTypeNameUNSAFE, CLR_BOOL *pbIsPrimitive); |
| 146 | #endif // FEATURE_COMINTEROP |
| 147 | |
| 148 | #ifdef FEATURE_MULTICASTSTUB_AS_IL |
| 149 | static FCDECL2(void, MulticastDebuggerTraceHelper, Object*, INT32); |
| 150 | #endif |
| 151 | }; |
| 152 | |
| 153 | #endif // __STUBHELPERS_h__ |
| 154 | |