diff options
author | James Ko <jamesqko@gmail.com> | 2016-05-07 10:14:06 -0400 |
---|---|---|
committer | Jan Kotas <jkotas@microsoft.com> | 2016-05-07 07:14:06 -0700 |
commit | 9a67ab7affc527168578a6749410c64ec3233f55 (patch) | |
tree | 46eea5b535681551a13aa54a448062bde3884bf5 /src/vm/comutilnative.cpp | |
parent | 29fcfe2938e3890cd6fb302d2f8c6dabc1a09fc4 (diff) | |
download | coreclr-9a67ab7affc527168578a6749410c64ec3233f55.tar.gz coreclr-9a67ab7affc527168578a6749410c64ec3233f55.tar.bz2 coreclr-9a67ab7affc527168578a6749410c64ec3233f55.zip |
Buffer.BlockCopy: Avoid double-typechecks for arrays of same type (#4807)
Diffstat (limited to 'src/vm/comutilnative.cpp')
-rw-r--r-- | src/vm/comutilnative.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/vm/comutilnative.cpp b/src/vm/comutilnative.cpp index 3ab4a38457..a0755e6a9d 100644 --- a/src/vm/comutilnative.cpp +++ b/src/vm/comutilnative.cpp @@ -1454,10 +1454,13 @@ FCIMPL5(VOID, Buffer::BlockCopy, ArrayBase *src, int srcOffset, ArrayBase *dst, } else { - const CorElementType dstET = dst->GetArrayElementType(); - if (!CorTypeInfo::IsPrimitiveType_NoThrow(dstET)) - FCThrowArgumentVoid(W("dest"), W("Arg_MustBePrimArray")); dstLen = dst->GetNumComponents() * dst->GetComponentSize(); + if (dst->GetMethodTable() != src->GetMethodTable()) + { + const CorElementType dstET = dst->GetArrayElementType(); + if (!CorTypeInfo::IsPrimitiveType_NoThrow(dstET)) + FCThrowArgumentVoid(W("dest"), W("Arg_MustBePrimArray")); + } } if (srcOffset < 0 || dstOffset < 0 || count < 0) { |