diff options
author | Ruben Ayrapetyan <ruben-ayrapetyan@users.noreply.github.com> | 2017-06-28 09:16:01 +0300 |
---|---|---|
committer | Jan Kotas <jkotas@microsoft.com> | 2017-06-27 23:16:01 -0700 |
commit | 44f57065649af5f8bcbb7c71d827221a7bc1bf7a (patch) | |
tree | daa511e0217853b725dec53e3ec676683ecd2224 /src/vm/fieldmarshaler.h | |
parent | 7cc721ec6ec56c998d66f1d57e7341cf7141a8a3 (diff) | |
download | coreclr-44f57065649af5f8bcbb7c71d827221a7bc1bf7a.tar.gz coreclr-44f57065649af5f8bcbb7c71d827221a7bc1bf7a.tar.bz2 coreclr-44f57065649af5f8bcbb7c71d827221a7bc1bf7a.zip |
Partially remove relocations from Class section of NGEN-ed images (#11962)
* Remove relocations for ParamTypeDesc::m_TemplateMT.
* Remove relocations for LayoutEEClass::m_LayoutInfo.m_pFieldMarshalers.
* Prepare RelativeFixupPointer.
* Remove relocations for FieldMarshaler::m_pFD and FieldMarshaler_*::m_*.
Diffstat (limited to 'src/vm/fieldmarshaler.h')
-rw-r--r-- | src/vm/fieldmarshaler.h | 197 |
1 files changed, 171 insertions, 26 deletions
diff --git a/src/vm/fieldmarshaler.h b/src/vm/fieldmarshaler.h index 287da41a5b..f11c81b896 100644 --- a/src/vm/fieldmarshaler.h +++ b/src/vm/fieldmarshaler.h @@ -253,6 +253,28 @@ VOID FmtValueTypeUpdateCLR(LPVOID pProtectedManagedData, MethodTable *pMT, BYTE } \ ELEMENT_SIZE_IMPL(NativeSize, AlignmentReq) +#define COPY_TO_IMPL_BASE_STRUCT_ONLY() \ + VOID CopyToImpl(VOID *pDest, SIZE_T destSize) \ + { \ + static_assert(sizeof(*this) == sizeof(FieldMarshaler), \ + "Please, implement CopyToImpl for correct copy of field values"); \ + \ + FieldMarshaler::CopyToImpl(pDest, destSize); \ + } + +#define START_COPY_TO_IMPL(CLASS_NAME) \ + VOID CopyToImpl(VOID *pDest, SIZE_T destSize) const \ + { \ + FieldMarshaler::CopyToImpl(pDest, destSize); \ + \ + CLASS_NAME *pDestFieldMarshaller = (std::remove_const<std::remove_pointer<decltype(this)>::type>::type *) pDest; \ + _ASSERTE(sizeof(*pDestFieldMarshaller) <= destSize); \ + +#define END_COPY_TO_IMPL(CLASS_NAME) \ + static_assert(std::is_same<CLASS_NAME *, decltype(pDestFieldMarshaller)>::value, \ + "Structure's name is required"); \ + } + //======================================================================= // @@ -278,6 +300,7 @@ public: VOID ScalarUpdateCLR(const VOID *pNative, LPVOID pCLR) const; VOID NestedValueClassUpdateNative(const VOID **ppProtectedCLR, SIZE_T startoffset, LPVOID pNative, OBJECTREF *ppCleanupWorkListOnStack) const; VOID NestedValueClassUpdateCLR(const VOID *pNative, LPVOID *ppProtectedCLR, SIZE_T startoffset) const; + VOID CopyTo(VOID *pDest, SIZE_T destSize) const; #ifdef FEATURE_PREJIT void Save(DataImage *image); void Fixup(DataImage *image); @@ -351,10 +374,21 @@ public: #endif // FEATURE_PREJIT } + void CopyToImpl(VOID *pDest, SIZE_T destSize) const + { + FieldMarshaler *pDestFieldMarshaller = (FieldMarshaler *) pDest; + + _ASSERTE(sizeof(*pDestFieldMarshaller) <= destSize); + + pDestFieldMarshaller->SetFieldDesc(GetFieldDesc()); + pDestFieldMarshaller->SetExternalOffset(GetExternalOffset()); + pDestFieldMarshaller->SetNStructFieldType(GetNStructFieldType()); + } + void SetFieldDesc(FieldDesc* pFD) { LIMITED_METHOD_CONTRACT; - m_pFD.SetValue(pFD); + m_pFD.SetValueMaybeNull(pFD); } FieldDesc* GetFieldDesc() const @@ -369,7 +403,7 @@ public: } CONTRACT_END; - RETURN m_pFD.GetValue(); + RETURN m_pFD.GetValueMaybeNull(); } void SetExternalOffset(UINT32 dwExternalOffset) @@ -394,7 +428,7 @@ protected: #endif } - static inline void RestoreHelper(FixupPointer<PTR_MethodTable> *ppMT) + static inline void RestoreHelper(RelativeFixupPointer<PTR_MethodTable> *ppMT) { CONTRACTL { @@ -414,7 +448,7 @@ protected: } #ifdef _DEBUG - static inline BOOL IsRestoredHelper(FixupPointer<PTR_MethodTable> pMT) + static inline BOOL IsRestoredHelper(const RelativeFixupPointer<PTR_MethodTable> &pMT) { WRAPPER_NO_CONTRACT; @@ -428,7 +462,7 @@ protected: #endif // _DEBUG - FixupPointer<PTR_FieldDesc> m_pFD; // FieldDesc + RelativeFixupPointer<PTR_FieldDesc> m_pFD; // FieldDesc UINT32 m_dwExternalOffset; // offset of field in the fixed portion NStructFieldType m_nft; }; @@ -449,6 +483,7 @@ public: VOID DestroyNativeImpl(LPVOID pNativeValue) const; ELEMENT_SIZE_IMPL(sizeof(BSTR), sizeof(BSTR)) + COPY_TO_IMPL_BASE_STRUCT_ONLY() }; //======================================================================= @@ -462,6 +497,7 @@ public: VOID DestroyNativeImpl(LPVOID pNativeValue) const; ELEMENT_SIZE_IMPL(sizeof(HSTRING), sizeof(HSTRING)) + COPY_TO_IMPL_BASE_STRUCT_ONLY() }; //======================================================================= @@ -473,7 +509,7 @@ public: FieldMarshaler_Nullable(MethodTable* pMT) { - m_pNullableTypeMT.SetValue(pMT); + m_pNullableTypeMT.SetValueMaybeNull(pMT); } BOOL IsNullableMarshalerImpl() const @@ -526,6 +562,12 @@ public: FieldMarshaler::RestoreImpl(); } + START_COPY_TO_IMPL(FieldMarshaler_Nullable) + { + pDestFieldMarshaller->m_pNullableTypeMT.SetValueMaybeNull(GetMethodTable()); + } + END_COPY_TO_IMPL(FieldMarshaler_Nullable) + #ifdef _DEBUG BOOL IsRestored() const { @@ -550,7 +592,7 @@ public: } private: - FixupPointer<PTR_MethodTable> m_pNullableTypeMT; + RelativeFixupPointer<PTR_MethodTable> m_pNullableTypeMT; }; @@ -565,6 +607,7 @@ public: VOID DestroyNativeImpl(LPVOID pNativeValue) const; ELEMENT_SIZE_IMPL(sizeof(HSTRING), sizeof(HSTRING)) + COPY_TO_IMPL_BASE_STRUCT_ONLY() }; //======================================================================= @@ -578,6 +621,7 @@ public: VOID UpdateCLRImpl(const VOID * pNativeValue, OBJECTREF * ppProtectedCLRValue, OBJECTREF * ppProtectedOldCLRValue) const; ELEMENT_SIZE_IMPL(sizeof(HRESULT), sizeof(HRESULT)) + COPY_TO_IMPL_BASE_STRUCT_ONLY() }; #endif // FEATURE_COMINTEROP @@ -593,7 +637,7 @@ public: FieldMarshaler_NestedLayoutClass(MethodTable *pMT) { WRAPPER_NO_CONTRACT; - m_pNestedMethodTable.SetValue(pMT); + m_pNestedMethodTable.SetValueMaybeNull(pMT); } VOID UpdateNativeImpl(OBJECTREF* pCLRValue, LPVOID pNativeValue, OBJECTREF *ppCleanupWorkListOnStack) const; @@ -629,6 +673,12 @@ public: FieldMarshaler::RestoreImpl(); } + START_COPY_TO_IMPL(FieldMarshaler_NestedLayoutClass) + { + pDestFieldMarshaller->m_pNestedMethodTable.SetValueMaybeNull(GetMethodTable()); + } + END_COPY_TO_IMPL(FieldMarshaler_NestedLayoutClass) + #ifdef _DEBUG BOOL IsRestored() const { @@ -649,12 +699,12 @@ public: } CONTRACTL_END; - return m_pNestedMethodTable.GetValue(); + return m_pNestedMethodTable.GetValueMaybeNull(); } private: // MethodTable of nested FieldMarshaler. - FixupPointer<PTR_MethodTable> m_pNestedMethodTable; + RelativeFixupPointer<PTR_MethodTable> m_pNestedMethodTable; }; @@ -667,7 +717,7 @@ public: FieldMarshaler_NestedValueClass(MethodTable *pMT) { WRAPPER_NO_CONTRACT; - m_pNestedMethodTable.SetValue(pMT); + m_pNestedMethodTable.SetValueMaybeNull(pMT); } BOOL IsNestedValueClassMarshalerImpl() const @@ -712,6 +762,12 @@ public: FieldMarshaler::RestoreImpl(); } + START_COPY_TO_IMPL(FieldMarshaler_NestedValueClass) + { + pDestFieldMarshaller->m_pNestedMethodTable.SetValueMaybeNull(GetMethodTable()); + } + END_COPY_TO_IMPL(FieldMarshaler_NestedValueClass) + #ifdef _DEBUG BOOL IsRestored() const { @@ -738,13 +794,13 @@ public: } CONTRACTL_END; - return m_pNestedMethodTable.GetValue(); + return m_pNestedMethodTable.GetValueMaybeNull(); } private: // MethodTable of nested NStruct. - FixupPointer<PTR_MethodTable> m_pNestedMethodTable; + RelativeFixupPointer<PTR_MethodTable> m_pNestedMethodTable; }; @@ -760,6 +816,7 @@ public: VOID DestroyNativeImpl(LPVOID pNativeValue) const; ELEMENT_SIZE_IMPL(sizeof(LPWSTR), sizeof(LPWSTR)) + COPY_TO_IMPL_BASE_STRUCT_ONLY() }; //======================================================================= @@ -774,6 +831,7 @@ public: VOID DestroyNativeImpl(LPVOID pNativeValue) const; ELEMENT_SIZE_IMPL(sizeof(LPSTR), sizeof(LPSTR)) + COPY_TO_IMPL_BASE_STRUCT_ONLY() }; //======================================================================= @@ -806,6 +864,13 @@ public: return m_ThrowOnUnmappableChar; } + START_COPY_TO_IMPL(FieldMarshaler_StringAnsi) + { + pDestFieldMarshaller->m_BestFitMap = m_BestFitMap; + pDestFieldMarshaller->m_ThrowOnUnmappableChar = m_ThrowOnUnmappableChar; + } + END_COPY_TO_IMPL(FieldMarshaler_StringAnsi) + private: bool m_BestFitMap:1; bool m_ThrowOnUnmappableChar:1; @@ -829,6 +894,12 @@ public: m_numchar = numChar; } + START_COPY_TO_IMPL(FieldMarshaler_FixedStringUni) + { + pDestFieldMarshaller->m_numchar = m_numchar; + } + END_COPY_TO_IMPL(FieldMarshaler_FixedStringUni) + private: // # of characters for fixed strings UINT32 m_numchar; @@ -864,6 +935,14 @@ public: return m_ThrowOnUnmappableChar; } + START_COPY_TO_IMPL(FieldMarshaler_FixedStringAnsi) + { + pDestFieldMarshaller->m_numchar = m_numchar; + pDestFieldMarshaller->m_BestFitMap = m_BestFitMap; + pDestFieldMarshaller->m_ThrowOnUnmappableChar = m_ThrowOnUnmappableChar; + } + END_COPY_TO_IMPL(FieldMarshaler_FixedStringAnsi) + private: // # of characters for fixed strings UINT32 m_numchar; @@ -901,6 +980,14 @@ public: return m_ThrowOnUnmappableChar; } + START_COPY_TO_IMPL(FieldMarshaler_FixedCharArrayAnsi) + { + pDestFieldMarshaller->m_numElems = m_numElems; + pDestFieldMarshaller->m_BestFitMap = m_BestFitMap; + pDestFieldMarshaller->m_ThrowOnUnmappableChar = m_ThrowOnUnmappableChar; + } + END_COPY_TO_IMPL(FieldMarshaler_FixedCharArrayAnsi) + private: // # of elements for fixedchararray UINT32 m_numElems; @@ -980,6 +1067,16 @@ public: FieldMarshaler::RestoreImpl(); } + START_COPY_TO_IMPL(FieldMarshaler_FixedArray) + { + pDestFieldMarshaller->m_arrayType.SetValueMaybeNull(m_arrayType.GetValueMaybeNull()); + pDestFieldMarshaller->m_numElems = m_numElems; + pDestFieldMarshaller->m_vt = m_vt; + pDestFieldMarshaller->m_BestFitMap = m_BestFitMap; + pDestFieldMarshaller->m_ThrowOnUnmappableChar = m_ThrowOnUnmappableChar; + } + END_COPY_TO_IMPL(FieldMarshaler_FixedArray) + #ifdef _DEBUG BOOL IsRestored() const { @@ -994,7 +1091,7 @@ public: #endif private: - FixupPointer<TypeHandle> m_arrayType; + RelativeFixupPointer<TypeHandle> m_arrayType; UINT32 m_numElems; VARTYPE m_vt; bool m_BestFitMap:1; // Note: deliberately use small bools to save on working set - this is the largest FieldMarshaler and dominates the cost of the FieldMarshaler array @@ -1020,7 +1117,7 @@ public: { WRAPPER_NO_CONTRACT; m_vt = vt; - m_pMT.SetValue(pMT); + m_pMT.SetValueMaybeNull(pMT); } #ifdef FEATURE_PREJIT @@ -1049,6 +1146,13 @@ public: FieldMarshaler::RestoreImpl(); } + START_COPY_TO_IMPL(FieldMarshaler_SafeArray) + { + pDestFieldMarshaller->m_pMT.SetValueMaybeNull(m_pMT.GetValueMaybeNull()); + pDestFieldMarshaller->m_vt = m_vt; + } + END_COPY_TO_IMPL(FieldMarshaler_SafeArray) + #ifdef _DEBUG BOOL IsRestored() const { @@ -1079,7 +1183,7 @@ public: } private: - FixupPointer<PTR_MethodTable> m_pMT; + RelativeFixupPointer<PTR_MethodTable> m_pMT; VARTYPE m_vt; }; #endif //FEATURE_CLASSIC_COMINTEROP @@ -1094,7 +1198,7 @@ public: FieldMarshaler_Delegate(MethodTable* pMT) { WRAPPER_NO_CONTRACT; - m_pNestedMethodTable.SetValue(pMT); + m_pNestedMethodTable.SetValueMaybeNull(pMT); } VOID UpdateNativeImpl(OBJECTREF* pCLRValue, LPVOID pNativeValue, OBJECTREF *ppCleanupWorkListOnStack) const; @@ -1128,6 +1232,12 @@ public: FieldMarshaler::RestoreImpl(); } + START_COPY_TO_IMPL(FieldMarshaler_Delegate) + { + pDestFieldMarshaller->m_pNestedMethodTable.SetValueMaybeNull(m_pNestedMethodTable.GetValueMaybeNull()); + } + END_COPY_TO_IMPL(FieldMarshaler_Delegate) + #ifdef _DEBUG BOOL IsRestored() const { @@ -1148,10 +1258,10 @@ public: } CONTRACTL_END; - return m_pNestedMethodTable.GetValue(); + return m_pNestedMethodTable.GetValueMaybeNull(); } - FixupPointer<PTR_MethodTable> m_pNestedMethodTable; + RelativeFixupPointer<PTR_MethodTable> m_pNestedMethodTable; }; @@ -1168,6 +1278,7 @@ public: VOID UpdateCLRImpl(const VOID *pNativeValue, OBJECTREF *ppProtectedCLRValue, OBJECTREF *ppProtectedOldCLRValue) const; ELEMENT_SIZE_IMPL(sizeof(LPVOID), sizeof(LPVOID)) + COPY_TO_IMPL_BASE_STRUCT_ONLY() }; @@ -1184,6 +1295,7 @@ public: VOID UpdateCLRImpl(const VOID *pNativeValue, OBJECTREF *ppProtectedCLRValue, OBJECTREF *ppProtectedOldCLRValue) const; ELEMENT_SIZE_IMPL(sizeof(LPVOID), sizeof(LPVOID)) + COPY_TO_IMPL_BASE_STRUCT_ONLY() }; #ifdef FEATURE_COMINTEROP @@ -1204,8 +1316,8 @@ public: FieldMarshaler_Interface(MethodTable *pClassMT, MethodTable *pItfMT, DWORD dwFlags) { WRAPPER_NO_CONTRACT; - m_pClassMT.SetValue(pClassMT); - m_pItfMT.SetValue(pItfMT); + m_pClassMT.SetValueMaybeNull(pClassMT); + m_pItfMT.SetValueMaybeNull(pItfMT); m_dwFlags = dwFlags; } @@ -1237,6 +1349,14 @@ public: FieldMarshaler::RestoreImpl(); } + START_COPY_TO_IMPL(FieldMarshaler_Interface) + { + pDestFieldMarshaller->m_pClassMT.SetValueMaybeNull(m_pClassMT.GetValueMaybeNull()); + pDestFieldMarshaller->m_pItfMT.SetValueMaybeNull(m_pItfMT.GetValueMaybeNull()); + pDestFieldMarshaller->m_dwFlags = m_dwFlags; + } + END_COPY_TO_IMPL(FieldMarshaler_Interface) + #ifdef _DEBUG BOOL IsRestored() const { @@ -1275,7 +1395,7 @@ public: } CONTRACTL_END; - return m_pClassMT.GetValue(); + return m_pClassMT.GetValueMaybeNull(); } MethodTable *GetInterfaceMethodTable() const @@ -1289,12 +1409,12 @@ public: } CONTRACTL_END; - return m_pItfMT.GetValue(); + return m_pItfMT.GetValueMaybeNull(); } private: - FixupPointer<PTR_MethodTable> m_pClassMT; - FixupPointer<PTR_MethodTable> m_pItfMT; + RelativeFixupPointer<PTR_MethodTable> m_pClassMT; + RelativeFixupPointer<PTR_MethodTable> m_pItfMT; DWORD m_dwFlags; }; @@ -1328,6 +1448,7 @@ public: VOID DestroyNativeImpl(LPVOID pNativeValue) const; ELEMENT_SIZE_IMPL(sizeof(VARIANT), 8) + COPY_TO_IMPL_BASE_STRUCT_ONLY() }; #endif // FEATURE_COMINTEROP @@ -1352,7 +1473,13 @@ public: VOID ScalarUpdateCLRImpl(const VOID *pNative, LPVOID pCLR) const; SCALAR_MARSHALER_IMPL(1, 1) - + + START_COPY_TO_IMPL(FieldMarshaler_Illegal) + { + pDestFieldMarshaller->m_resIDWhy = m_resIDWhy; + } + END_COPY_TO_IMPL(FieldMarshaler_Illegal) + private: UINT m_resIDWhy; }; @@ -1369,6 +1496,7 @@ public: UNUSED_METHOD_IMPL(VOID UpdateCLRImpl(const VOID *pNativeValue, OBJECTREF *ppProtectedCLRValue, OBJECTREF *ppProtectedOldCLRValue) const) SCALAR_MARSHALER_IMPL(1, 1) + COPY_TO_IMPL_BASE_STRUCT_ONLY() VOID ScalarUpdateNativeImpl(LPVOID pCLR, LPVOID pNative) const { @@ -1413,6 +1541,7 @@ public: UNUSED_METHOD_IMPL(VOID UpdateCLRImpl(const VOID *pNativeValue, OBJECTREF *ppProtectedCLRValue, OBJECTREF *ppProtectedOldCLRValue) const) SCALAR_MARSHALER_IMPL(2, 2) + COPY_TO_IMPL_BASE_STRUCT_ONLY() VOID ScalarUpdateNativeImpl(LPVOID pCLR, LPVOID pNative) const { @@ -1456,6 +1585,7 @@ public: UNUSED_METHOD_IMPL(VOID UpdateCLRImpl(const VOID *pNativeValue, OBJECTREF *ppProtectedCLRValue, OBJECTREF *ppProtectedOldCLRValue) const) SCALAR_MARSHALER_IMPL(4, 4) + COPY_TO_IMPL_BASE_STRUCT_ONLY() VOID ScalarUpdateNativeImpl(LPVOID pCLR, LPVOID pNative) const { @@ -1499,6 +1629,7 @@ public: UNUSED_METHOD_IMPL(VOID UpdateCLRImpl(const VOID *pNativeValue, OBJECTREF *ppProtectedCLRValue, OBJECTREF *ppProtectedOldCLRValue) const) SCALAR_MARSHALER_IMPL(8, 8) + COPY_TO_IMPL_BASE_STRUCT_ONLY() VOID ScalarUpdateNativeImpl(LPVOID pCLR, LPVOID pNative) const { @@ -1599,6 +1730,13 @@ public: return m_ThrowOnUnmappableChar; } + START_COPY_TO_IMPL(FieldMarshaler_Ansi) + { + pDestFieldMarshaller->m_BestFitMap = m_BestFitMap; + pDestFieldMarshaller->m_ThrowOnUnmappableChar = m_ThrowOnUnmappableChar; + } + END_COPY_TO_IMPL(FieldMarshaler_Ansi) + private: bool m_BestFitMap:1; bool m_ThrowOnUnmappableChar:1; @@ -1614,6 +1752,7 @@ public: UNUSED_METHOD_IMPL(VOID UpdateCLRImpl(const VOID *pNativeValue, OBJECTREF *ppProtectedCLRValue, OBJECTREF *ppProtectedOldCLRValue) const) SCALAR_MARSHALER_IMPL(sizeof(BOOL), sizeof(BOOL)) + COPY_TO_IMPL_BASE_STRUCT_ONLY() VOID ScalarUpdateNativeImpl(LPVOID pCLR, LPVOID pNative) const { @@ -1661,6 +1800,7 @@ public: UNUSED_METHOD_IMPL(VOID UpdateCLRImpl(const VOID *pNativeValue, OBJECTREF *ppProtectedCLRValue, OBJECTREF *ppProtectedOldCLRValue) const) SCALAR_MARSHALER_IMPL(sizeof(VARIANT_BOOL), sizeof(VARIANT_BOOL)) + COPY_TO_IMPL_BASE_STRUCT_ONLY() VOID ScalarUpdateNativeImpl(LPVOID pCLR, LPVOID pNative) const { @@ -1711,6 +1851,7 @@ public: UNUSED_METHOD_IMPL(VOID UpdateCLRImpl(const VOID *pNativeValue, OBJECTREF *ppProtectedCLRValue, OBJECTREF *ppProtectedOldCLRValue) const) SCALAR_MARSHALER_IMPL(1, 1) + COPY_TO_IMPL_BASE_STRUCT_ONLY() VOID ScalarUpdateNativeImpl(LPVOID pCLR, LPVOID pNative) const { @@ -1752,6 +1893,7 @@ public: UNUSED_METHOD_IMPL(VOID UpdateCLRImpl(const VOID *pNativeValue, OBJECTREF *ppProtectedCLRValue, OBJECTREF *ppProtectedOldCLRValue) const) SCALAR_MARSHALER_IMPL(sizeof(DECIMAL), 8); + COPY_TO_IMPL_BASE_STRUCT_ONLY() VOID ScalarUpdateNativeImpl(LPVOID pCLR, LPVOID pNative) const { @@ -1793,6 +1935,7 @@ public: UNUSED_METHOD_IMPL(VOID UpdateCLRImpl(const VOID *pNativeValue, OBJECTREF *ppProtectedCLRValue, OBJECTREF *ppProtectedOldCLRValue) const) SCALAR_MARSHALER_IMPL(sizeof(DATE), sizeof(DATE)) + COPY_TO_IMPL_BASE_STRUCT_ONLY() VOID ScalarUpdateNativeImpl(LPVOID pCLR, LPVOID pNative) const; VOID ScalarUpdateCLRImpl(const VOID *pNative, LPVOID pCLR) const; @@ -1811,6 +1954,7 @@ public: UNUSED_METHOD_IMPL(VOID UpdateCLRImpl(const VOID *pNativeValue, OBJECTREF *ppProtectedCLRValue, OBJECTREF *ppProtectedOldCLRValue) const) SCALAR_MARSHALER_IMPL(sizeof(CURRENCY), sizeof(CURRENCY)) + COPY_TO_IMPL_BASE_STRUCT_ONLY() VOID ScalarUpdateNativeImpl(LPVOID pCLR, LPVOID pNative) const; VOID ScalarUpdateCLRImpl(const VOID *pNative, LPVOID pCLR) const; @@ -1825,6 +1969,7 @@ public: UNUSED_METHOD_IMPL(VOID UpdateCLRImpl(const VOID *pNativeValue, OBJECTREF *ppProtectedCLRValue, OBJECTREF *ppProtectedOldCLRValue) const) SCALAR_MARSHALER_IMPL(sizeof(INT64), sizeof(INT64)) + COPY_TO_IMPL_BASE_STRUCT_ONLY() VOID ScalarUpdateNativeImpl(LPVOID pCLR, LPVOID pNative) const; VOID ScalarUpdateCLRImpl(const VOID *pNative, LPVOID pCLR) const; |