Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
87d6e45
Remove HELPER_METHOD_FRAME from MngdNativeArrayMarshaler
jkoritzinsky Jan 23, 2024
f5a1ef2
Mechanically convert the fixed array marshaller to QCalls.
jkoritzinsky Jan 24, 2024
aea5952
Move MngdFixedArrayMarshaler.ConvertSpaceToNative to managed code.
jkoritzinsky Jan 24, 2024
9baf634
Move the ICustomMarshaler-based marshalling to be written primarily i…
jkoritzinsky Jan 24, 2024
e4b52ae
Convert SafeArray marshaller to QCalls
jkoritzinsky Jan 24, 2024
5e59fc9
Merge branch 'main' of github.com:dotnet/runtime into helper-method-f…
jkoritzinsky Jan 24, 2024
8920776
PR feedback and move CreateMarshaler implementations to manged code f…
jkoritzinsky Jan 24, 2024
83ea897
Remove some unused parameters, make some test failures more diagnosab…
jkoritzinsky Feb 1, 2024
8acfba5
Instead of passing around an IntPtr to the helper, just pass around t…
jkoritzinsky Feb 3, 2024
113ff88
Swallow exceptions from CleanUpNativeData like how the old implementa…
jkoritzinsky Feb 3, 2024
92acfbd
Fix two edge cases.
jkoritzinsky Feb 3, 2024
d124b48
Fix null ref check
jkoritzinsky Feb 7, 2024
d37dd1b
Use `in` in more cases to make things clearer
jkoritzinsky Feb 7, 2024
095628d
Don't call CleanUpManagedData for null managed values
jkoritzinsky Feb 7, 2024
0a306f4
One more case I missed
jkoritzinsky Feb 7, 2024
b3a65be
Apply suggestions from code review
jkoritzinsky Feb 8, 2024
a99e9bb
PR feedback
jkoritzinsky Feb 8, 2024
b1c24b1
Merge branch 'helper-method-frame-removal' of github.com:jkoritzinsky…
jkoritzinsky Feb 8, 2024
9cee4d4
Apply suggestions from code review
jkoritzinsky Feb 8, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Mechanically convert the fixed array marshaller to QCalls.
  • Loading branch information
jkoritzinsky committed Jan 24, 2024
commit f5a1ef29afcf7a6e85e5521069992c67f18603fb
62 changes: 49 additions & 13 deletions src/coreclr/System.Private.CoreLib/src/System/StubHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -657,25 +657,61 @@ internal static void ClearNativeContents(IntPtr pMarshalState, ref object pManag
private static partial void ClearNativeContents(IntPtr pMarshalState, ObjectHandleOnStack pManagedHome, IntPtr pNativeHome, int cElements);
} // class MngdNativeArrayMarshaler

internal static class MngdFixedArrayMarshaler
internal static partial class MngdFixedArrayMarshaler
{
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern void CreateMarshaler(IntPtr pMarshalState, IntPtr pMT, int dwFlags, int cElements, IntPtr pManagedMarshaler);
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MngdFixedArrayMarshaler_CreateMarshaler")]
[SuppressGCTransition]
internal static partial void CreateMarshaler(IntPtr pMarshalState, IntPtr pMT, int dwFlags, int cElements, IntPtr pManagedMarshaler);

[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern void ConvertSpaceToNative(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome);
internal static void ConvertSpaceToNative(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome)
{
object managedHome = pManagedHome;
ObjectHandleOnStack pManagedHomeAddr = ObjectHandleOnStack.Create(ref managedHome);
ConvertSpaceToNative(pMarshalState, pManagedHomeAddr, pNativeHome);
}

[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern void ConvertContentsToNative(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome);
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MngdFixedArrayMarshaler_ConvertSpaceToNative")]
private static partial void ConvertSpaceToNative(IntPtr pMarshalState, ObjectHandleOnStack pManagedHome, IntPtr pNativeHome);

[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern void ConvertSpaceToManaged(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome);
internal static void ConvertContentsToNative(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome)
{
object managedHome = pManagedHome;
ObjectHandleOnStack pManagedHomeAddr = ObjectHandleOnStack.Create(ref managedHome);
ConvertContentsToNative(pMarshalState, pManagedHomeAddr, pNativeHome);
}

[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern void ConvertContentsToManaged(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome);
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MngdFixedArrayMarshaler_ConvertContentsToNative")]
private static partial void ConvertContentsToNative(IntPtr pMarshalState, ObjectHandleOnStack pManagedHome, IntPtr pNativeHome);

[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern void ClearNativeContents(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome);
internal static void ConvertSpaceToManaged(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome)
{
object managedHome = pManagedHome;
ObjectHandleOnStack pManagedHomeAddr = ObjectHandleOnStack.Create(ref managedHome);
ConvertSpaceToManaged(pMarshalState, pManagedHomeAddr, pNativeHome);
}

[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MngdFixedArrayMarshaler_ConvertSpaceToManaged")]
private static partial void ConvertSpaceToManaged(IntPtr pMarshalState, ObjectHandleOnStack pManagedHome, IntPtr pNativeHome);

internal static void ConvertContentsToManaged(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome)
{
object managedHome = pManagedHome;
ObjectHandleOnStack pManagedHomeAddr = ObjectHandleOnStack.Create(ref managedHome);
ConvertContentsToManaged(pMarshalState, pManagedHomeAddr, pNativeHome);
}

[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MngdFixedArrayMarshaler_ConvertContentsToManaged")]
private static partial void ConvertContentsToManaged(IntPtr pMarshalState, ObjectHandleOnStack pManagedHome, IntPtr pNativeHome);

internal static void ClearNativeContents(IntPtr pMarshalState, ref object pManagedHome, IntPtr pNativeHome)
{
object managedHome = pManagedHome;
ObjectHandleOnStack pManagedHomeAddr = ObjectHandleOnStack.Create(ref managedHome);
ClearNativeContents(pMarshalState, pManagedHomeAddr, pNativeHome);
}

[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MngdFixedArrayMarshaler_ClearNativeContents")]
private static partial void ClearNativeContents(IntPtr pMarshalState, ObjectHandleOnStack pManagedHome, IntPtr pNativeHome);
} // class MngdFixedArrayMarshaler

#if FEATURE_COMINTEROP
Expand Down
10 changes: 0 additions & 10 deletions src/coreclr/vm/ecalllist.h
Original file line number Diff line number Diff line change
Expand Up @@ -488,15 +488,6 @@ FCFuncStart(gMethodTableFuncs)
FCFuncElement("GetNumInstanceFieldBytes", MethodTableNative::GetNumInstanceFieldBytes)
FCFuncEnd()

FCFuncStart(gMngdFixedArrayMarshalerFuncs)
FCFuncElement("CreateMarshaler", MngdFixedArrayMarshaler::CreateMarshaler)
FCFuncElement("ConvertSpaceToNative", MngdFixedArrayMarshaler::ConvertSpaceToNative)
FCFuncElement("ConvertContentsToNative", MngdFixedArrayMarshaler::ConvertContentsToNative)
FCFuncElement("ConvertSpaceToManaged", MngdFixedArrayMarshaler::ConvertSpaceToManaged)
FCFuncElement("ConvertContentsToManaged", MngdFixedArrayMarshaler::ConvertContentsToManaged)
FCFuncElement("ClearNativeContents", MngdFixedArrayMarshaler::ClearNativeContents)
FCFuncEnd()

#ifdef FEATURE_COMINTEROP
FCFuncStart(gMngdSafeArrayMarshalerFuncs)
FCFuncElement("CreateMarshaler", MngdSafeArrayMarshaler::CreateMarshaler)
Expand Down Expand Up @@ -626,7 +617,6 @@ FCClassElement("Math", "System", gMathFuncs)
FCClassElement("MathF", "System", gMathFFuncs)
FCClassElement("MetadataImport", "System.Reflection", gMetaDataImport)
FCClassElement("MethodTable", "System.Runtime.CompilerServices", gMethodTableFuncs)
FCClassElement("MngdFixedArrayMarshaler", "System.StubHelpers", gMngdFixedArrayMarshalerFuncs)
FCClassElement("MngdRefCustomMarshaler", "System.StubHelpers", gMngdRefCustomMarshalerFuncs)
#ifdef FEATURE_COMINTEROP
FCClassElement("MngdSafeArrayMarshaler", "System.StubHelpers", gMngdSafeArrayMarshalerFuncs)
Expand Down
91 changes: 47 additions & 44 deletions src/coreclr/vm/ilmarshalers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4501,7 +4501,7 @@ extern "C" void QCALLTYPE MngdNativeArrayMarshaler_ClearNativeContents(MngdNativ
END_QCALL;
}

extern "C" void MngdNativeArrayMarshaler::DoClearNativeContents(MngdNativeArrayMarshaler* pThis, OBJECTREF* pManagedHome, void** pNativeHome, INT32 cElements)
void MngdNativeArrayMarshaler::DoClearNativeContents(MngdNativeArrayMarshaler* pThis, OBJECTREF* pManagedHome, void** pNativeHome, INT32 cElements)
{
CONTRACTL
{
Expand Down Expand Up @@ -4564,48 +4564,56 @@ void ILFixedArrayMarshaler::EmitCreateMngdMarshaler(ILCodeStream* pslILEmit)
}


FCIMPL5(void, MngdFixedArrayMarshaler::CreateMarshaler, MngdFixedArrayMarshaler* pThis, MethodTable* pMT, UINT32 dwFlags, UINT32 cElements, PCODE pManagedElementMarshaler)
extern "C" void QCALLTYPE MngdFixedArrayMarshaler_CreateMarshaler(MngdFixedArrayMarshaler* pThis, MethodTable* pMT, UINT32 dwFlags, UINT32 cElements, PCODE pManagedElementMarshaler)
{
FCALL_CONTRACT;
QCALL_CONTRACT_NO_GC_TRANSITION;
BEGIN_QCALL;

// Don't check whether the input values are negative - passing negative size-controlling
// arguments and compensating them with a positive SizeConst has always worked.
pThis->m_pElementMT = pMT;
pThis->m_vt = (VARTYPE)(dwFlags);
pThis->m_NativeDataValid = (BYTE)((dwFlags & FLAG_NATIVE_DATA_VALID) != 0);
dwFlags &= ~FLAG_NATIVE_DATA_VALID;
pThis->m_NativeDataValid = (BYTE)((dwFlags & MngdFixedArrayMarshaler::FLAG_NATIVE_DATA_VALID) != 0);
dwFlags &= ~MngdFixedArrayMarshaler::FLAG_NATIVE_DATA_VALID;
pThis->m_BestFitMap = (BYTE)(dwFlags >> 16);
pThis->m_ThrowOnUnmappableChar = (BYTE)(dwFlags >> 24);
pThis->m_Array = TypeHandle();
pThis->m_cElements = cElements;
pThis->m_pManagedElementMarshaler = pManagedElementMarshaler;

END_QCALL;
}
FCIMPLEND

FCIMPL3(void, MngdFixedArrayMarshaler::ConvertSpaceToNative, MngdFixedArrayMarshaler* pThis, OBJECTREF* pManagedHome, void* pNativeHome)
extern "C" void QCALLTYPE MngdFixedArrayMarshaler_ConvertSpaceToNative(MngdFixedArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void* pNativeHome)
{
FCALL_CONTRACT;
QCALL_CONTRACT;
BEGIN_QCALL;

BASEARRAYREF arrayRef = (BASEARRAYREF)*pManagedHome;
GCX_COOP();

HELPER_METHOD_FRAME_BEGIN_1(arrayRef);
BASEARRAYREF arrayRef = NULL;
GCPROTECT_BEGIN(arrayRef);
arrayRef = (BASEARRAYREF)pManagedHome.Get();

if (arrayRef != NULL && arrayRef->GetNumComponents() < pThis->m_cElements)
{
COMPlusThrow(kArgumentException, IDS_WRONGSIZEARRAY_IN_NSTRUCT);
}

HELPER_METHOD_FRAME_END();
GCPROTECT_END();
END_QCALL;
}
FCIMPLEND

FCIMPL3(void, MngdFixedArrayMarshaler::ConvertContentsToNative, MngdFixedArrayMarshaler* pThis, OBJECTREF* pManagedHome, void* pNativeHome)
extern "C" void QCALLTYPE MngdFixedArrayMarshaler_ConvertContentsToNative(MngdFixedArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void* pNativeHome)
{
FCALL_CONTRACT;
QCALL_CONTRACT;
BEGIN_QCALL;

BASEARRAYREF arrayRef = (BASEARRAYREF)*pManagedHome;
GCX_COOP();

HELPER_METHOD_FRAME_BEGIN_1(arrayRef);
BASEARRAYREF arrayRef = NULL;
GCPROTECT_BEGIN(arrayRef);
arrayRef = (BASEARRAYREF)pManagedHome.Get();

if (pThis->m_vt == VTHACK_ANSICHAR)
{
Expand Down Expand Up @@ -4652,21 +4660,18 @@ FCIMPL3(void, MngdFixedArrayMarshaler::ConvertContentsToNative, MngdFixedArrayMa
}
}

HELPER_METHOD_FRAME_END();
GCPROTECT_END();
END_QCALL;
}
FCIMPLEND

FCIMPL3(void, MngdFixedArrayMarshaler::ConvertSpaceToManaged, MngdFixedArrayMarshaler* pThis,
OBJECTREF* pManagedHome, void* pNativeHome)
extern "C" void QCALLTYPE MngdFixedArrayMarshaler_ConvertSpaceToManaged(MngdFixedArrayMarshaler* pThis,
QCall::ObjectHandleOnStack pManagedHome, void* pNativeHome)
{
FCALL_CONTRACT;
QCALL_CONTRACT;

HELPER_METHOD_FRAME_BEGIN_0();
BEGIN_QCALL;

// In the field scenario, pManagedHome points to a field inside a struct/object.
// Since we are setting the value of this field with SetObjectReference, we need to
// make sure that pManagedHome is GC-protected.
GCPROTECT_BEGININTERIOR(pManagedHome);
GCX_COOP();

// <TODO>@todo: lookup this class before marshal time</TODO>
if (pThis->m_Array.IsNull())
Expand All @@ -4681,21 +4686,22 @@ FCIMPL3(void, MngdFixedArrayMarshaler::ConvertSpaceToManaged, MngdFixedArrayMars
//

OBJECTREF arrayRef = AllocateSzArray(pThis->m_Array, pThis->m_cElements);
SetObjectReference(pManagedHome, arrayRef);

GCPROTECT_END();
pManagedHome.Set(arrayRef);

HELPER_METHOD_FRAME_END();
END_QCALL;
}
FCIMPLEND

FCIMPL3(void, MngdFixedArrayMarshaler::ConvertContentsToManaged, MngdFixedArrayMarshaler* pThis, OBJECTREF* pManagedHome, void* pNativeHome)
extern "C" void QCALLTYPE MngdFixedArrayMarshaler_ConvertContentsToManaged(MngdFixedArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void* pNativeHome)
{
FCALL_CONTRACT;
QCALL_CONTRACT;
BEGIN_QCALL;

BASEARRAYREF arrayRef = (BASEARRAYREF)*pManagedHome;
GCX_COOP();

HELPER_METHOD_FRAME_BEGIN_1(arrayRef);
BASEARRAYREF arrayRef = NULL;

GCPROTECT_BEGIN(arrayRef);
arrayRef = (BASEARRAYREF)pManagedHome.Get();

if (pThis->m_vt == VTHACK_ANSICHAR)
{
Expand Down Expand Up @@ -4726,15 +4732,15 @@ FCIMPL3(void, MngdFixedArrayMarshaler::ConvertContentsToManaged, MngdFixedArrayM
}
}

HELPER_METHOD_FRAME_END();
GCPROTECT_END();
END_QCALL;
}
FCIMPLEND

FCIMPL3(void, MngdFixedArrayMarshaler::ClearNativeContents, MngdFixedArrayMarshaler* pThis, OBJECTREF* pManagedHome, void* pNativeHome)
extern "C" void QCALLTYPE MngdFixedArrayMarshaler_ClearNativeContents(MngdFixedArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void* pNativeHome)
{
FCALL_CONTRACT;
QCALL_CONTRACT;

HELPER_METHOD_FRAME_BEGIN_0();
BEGIN_QCALL;

const OleVariant::Marshaler* pMarshaler = OleVariant::GetMarshalerForVarType(pThis->m_vt, FALSE);

Expand All @@ -4743,11 +4749,8 @@ FCIMPL3(void, MngdFixedArrayMarshaler::ClearNativeContents, MngdFixedArrayMarsha
pMarshaler->ClearOleArray(pNativeHome, pThis->m_cElements, pThis->m_pElementMT, pThis->m_pManagedElementMarshaler);
}

HELPER_METHOD_FRAME_END();
END_QCALL;
}
FCIMPLEND



#ifdef FEATURE_COMINTEROP
void ILSafeArrayMarshaler::EmitCreateMngdMarshaler(ILCodeStream* pslILEmit)
Expand Down
14 changes: 7 additions & 7 deletions src/coreclr/vm/ilmarshalers.h
Original file line number Diff line number Diff line change
Expand Up @@ -3304,13 +3304,6 @@ class ILFixedArrayMarshaler : public ILMngdMarshaler
class MngdFixedArrayMarshaler
{
public:
static FCDECL5(void, CreateMarshaler, MngdFixedArrayMarshaler* pThis, MethodTable* pMT, UINT32 dwFlags, UINT32 cElements, PCODE pManagedElementMarshaler);
static FCDECL3(void, ConvertSpaceToNative, MngdFixedArrayMarshaler* pThis, OBJECTREF* pManagedHome, void* pNativeHome);
static FCDECL3(void, ConvertContentsToNative, MngdFixedArrayMarshaler* pThis, OBJECTREF* pManagedHome, void* pNativeHome);
static FCDECL3(void, ConvertSpaceToManaged, MngdFixedArrayMarshaler* pThis, OBJECTREF* pManagedHome, void* pNativeHome);
static FCDECL3(void, ConvertContentsToManaged, MngdFixedArrayMarshaler* pThis, OBJECTREF* pManagedHome, void* pNativeHome);
static FCDECL3(void, ClearNativeContents, MngdFixedArrayMarshaler* pThis, OBJECTREF* pManagedHome, void* pNativeHome);

enum
{
FLAG_NATIVE_DATA_VALID = 0x40000000
Expand All @@ -3326,6 +3319,13 @@ class MngdFixedArrayMarshaler
UINT32 m_cElements;
};

extern "C" void QCALLTYPE MngdFixedArrayMarshaler_CreateMarshaler(MngdFixedArrayMarshaler* pThis, MethodTable* pMT, UINT32 dwFlags, UINT32 cElements, PCODE pManagedElementMarshaler);
extern "C" void QCALLTYPE MngdFixedArrayMarshaler_ConvertSpaceToNative(MngdFixedArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void* pNativeHome);
extern "C" void QCALLTYPE MngdFixedArrayMarshaler_ConvertContentsToNative(MngdFixedArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void* pNativeHome);
extern "C" void QCALLTYPE MngdFixedArrayMarshaler_ConvertSpaceToManaged(MngdFixedArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void* pNativeHome);
extern "C" void QCALLTYPE MngdFixedArrayMarshaler_ConvertContentsToManaged(MngdFixedArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void* pNativeHome);
extern "C" void QCALLTYPE MngdFixedArrayMarshaler_ClearNativeContents(MngdFixedArrayMarshaler* pThis, QCall::ObjectHandleOnStack pManagedHome, void* pNativeHome);

#ifdef FEATURE_COMINTEROP
class ILSafeArrayMarshaler : public ILMngdMarshaler
{
Expand Down
6 changes: 6 additions & 0 deletions src/coreclr/vm/qcallentrypoints.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,12 @@ static const Entry s_QCall[] =
DllImportEntry(MngdNativeArrayMarshaler_ConvertContentsToManaged)
DllImportEntry(MngdNativeArrayMarshaler_ClearNative)
DllImportEntry(MngdNativeArrayMarshaler_ClearNativeContents)
DllImportEntry(MngdFixedArrayMarshaler_CreateMarshaler)
DllImportEntry(MngdFixedArrayMarshaler_ConvertSpaceToNative)
DllImportEntry(MngdFixedArrayMarshaler_ConvertContentsToNative)
DllImportEntry(MngdFixedArrayMarshaler_ConvertSpaceToManaged)
DllImportEntry(MngdFixedArrayMarshaler_ConvertContentsToManaged)
DllImportEntry(MngdFixedArrayMarshaler_ClearNativeContents)
#ifdef FEATURE_COMINTEROP
DllImportEntry(OAVariant_ChangeType)
#endif // FEATURE_COMINTEROP
Expand Down