summaryrefslogtreecommitdiff
path: root/src/vm
diff options
context:
space:
mode:
authorJeremy Koritzinsky <jekoritz@microsoft.com>2019-09-17 12:26:35 -0700
committerGitHub <noreply@github.com>2019-09-17 12:26:35 -0700
commit82f0216940e8201214debdcc9ce34f376801c60a (patch)
tree19c78e77bba0e1d64b32d4125a38a29bb81bc392 /src/vm
parent012b987f4d2c5af26f1e76c81a75e938e5b219f8 (diff)
downloadcoreclr-82f0216940e8201214debdcc9ce34f376801c60a.tar.gz
coreclr-82f0216940e8201214debdcc9ce34f376801c60a.tar.bz2
coreclr-82f0216940e8201214debdcc9ce34f376801c60a.zip
[release/3.1] Fix marshalling a pinnable multi-dimensional arr… (#26664)
* Use the exact methodtable of the parameter to calculate the offset into a pinned array.
Diffstat (limited to 'src/vm')
-rw-r--r--src/vm/ilmarshalers.cpp5
-rw-r--r--src/vm/mlinfo.cpp2
-rw-r--r--src/vm/mlinfo.h1
3 files changed, 5 insertions, 3 deletions
diff --git a/src/vm/ilmarshalers.cpp b/src/vm/ilmarshalers.cpp
index 19db7dff73..a89aeaf2a1 100644
--- a/src/vm/ilmarshalers.cpp
+++ b/src/vm/ilmarshalers.cpp
@@ -3808,7 +3808,7 @@ void ILMngdMarshaler::EmitCallMngdMarshalerMethod(ILCodeStream* pslILEmit, Metho
bool ILNativeArrayMarshaler::UsePinnedArraySpecialCase()
{
- if (IsCLRToNative(m_dwMarshalFlags) && !IsByref(m_dwMarshalFlags) && (NULL == OleVariant::GetMarshalerForVarType(m_pargs->na.m_vt, TRUE)))
+ if (IsCLRToNative(m_dwMarshalFlags) && !IsByref(m_dwMarshalFlags) && (NULL != m_pargs->na.m_pArrayMT) && (NULL == OleVariant::GetMarshalerForVarType(m_pargs->na.m_vt, TRUE)))
{
return true;
}
@@ -3855,7 +3855,6 @@ void ILNativeArrayMarshaler::EmitCreateMngdMarshaler(ILCodeStream* pslILEmit)
pslILEmit->EmitCALL(METHOD__MNGD_NATIVE_ARRAY_MARSHALER__CREATE_MARSHALER, 3, 0);
}
-
void ILNativeArrayMarshaler::EmitMarshalArgumentCLRToNative()
{
CONTRACTL
@@ -3900,7 +3899,7 @@ void ILNativeArrayMarshaler::EmitMarshalArgumentCLRToNative()
m_pcsMarshal->EmitCONV_I();
// Optimize marshalling by emitting the data ptr offset directly into the IL stream
// instead of doing an FCall to recalulate it each time when possible.
- m_pcsMarshal->EmitLDC(ArrayBase::GetDataPtrOffset(m_pargs->m_pMarshalInfo->GetArrayElementTypeHandle().MakeSZArray().GetMethodTable()));
+ m_pcsMarshal->EmitLDC(ArrayBase::GetDataPtrOffset(m_pargs->na.m_pArrayMT));
m_pcsMarshal->EmitADD();
EmitStoreNativeValue(m_pcsMarshal);
diff --git a/src/vm/mlinfo.cpp b/src/vm/mlinfo.cpp
index 4e5ddf9588..586044ba94 100644
--- a/src/vm/mlinfo.cpp
+++ b/src/vm/mlinfo.cpp
@@ -2802,6 +2802,8 @@ MarshalInfo::MarshalInfo(Module* pModule,
}
}
+ m_args.na.m_pArrayMT = arrayTypeHnd.GetMethodTable();
+
// Handle retrieving the information for the array type.
IfFailGoto(HandleArrayElemType(&ParamInfo, thElement, asArray->GetRank(), mtype == ELEMENT_TYPE_SZARRAY, isParam, pAssembly), lFail);
break;
diff --git a/src/vm/mlinfo.h b/src/vm/mlinfo.h
index 46057d5875..46dd79cfc7 100644
--- a/src/vm/mlinfo.h
+++ b/src/vm/mlinfo.h
@@ -82,6 +82,7 @@ struct OverrideProcArgs
struct
{
+ MethodTable* m_pArrayMT;
VARTYPE m_vt;
#ifdef FEATURE_COMINTEROP
SIZE_T m_cbElementSize;