diff options
author | Jeremy Koritzinsky <jekoritz@microsoft.com> | 2019-09-17 12:26:35 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-17 12:26:35 -0700 |
commit | 82f0216940e8201214debdcc9ce34f376801c60a (patch) | |
tree | 19c78e77bba0e1d64b32d4125a38a29bb81bc392 | |
parent | 012b987f4d2c5af26f1e76c81a75e938e5b219f8 (diff) | |
download | coreclr-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.
-rw-r--r-- | src/vm/ilmarshalers.cpp | 5 | ||||
-rw-r--r-- | src/vm/mlinfo.cpp | 2 | ||||
-rw-r--r-- | src/vm/mlinfo.h | 1 |
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; |