summaryrefslogtreecommitdiff
path: root/src/vm/fieldmarshaler.h
diff options
context:
space:
mode:
authorRuben Ayrapetyan <ruben-ayrapetyan@users.noreply.github.com>2017-06-28 09:16:01 +0300
committerJan Kotas <jkotas@microsoft.com>2017-06-27 23:16:01 -0700
commit44f57065649af5f8bcbb7c71d827221a7bc1bf7a (patch)
treedaa511e0217853b725dec53e3ec676683ecd2224 /src/vm/fieldmarshaler.h
parent7cc721ec6ec56c998d66f1d57e7341cf7141a8a3 (diff)
downloadcoreclr-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.h197
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;