summaryrefslogtreecommitdiff
path: root/src/vm/comutilnative.cpp
diff options
context:
space:
mode:
authorJames Ko <jamesqko@gmail.com>2016-05-07 10:14:06 -0400
committerJan Kotas <jkotas@microsoft.com>2016-05-07 07:14:06 -0700
commit9a67ab7affc527168578a6749410c64ec3233f55 (patch)
tree46eea5b535681551a13aa54a448062bde3884bf5 /src/vm/comutilnative.cpp
parent29fcfe2938e3890cd6fb302d2f8c6dabc1a09fc4 (diff)
downloadcoreclr-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.cpp9
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) {