diff options
author | Jan Kotas <jkotas@microsoft.com> | 2015-02-04 13:18:29 -0800 |
---|---|---|
committer | Jan Kotas <jkotas@microsoft.com> | 2015-02-04 13:18:29 -0800 |
commit | cbf5cbf6c257bc7766185b813a5d50078defcb74 (patch) | |
tree | c11544a069bb6ec2e126f603f16acfa20ed2aab8 /src | |
parent | 8dd39ebdd57bf5a5678fbf4bd37fb7b5f60a8eea (diff) | |
parent | a5dd659fdc1719f943fead7e1b6e2db167a271a4 (diff) | |
download | coreclr-cbf5cbf6c257bc7766185b813a5d50078defcb74.tar.gz coreclr-cbf5cbf6c257bc7766185b813a5d50078defcb74.tar.bz2 coreclr-cbf5cbf6c257bc7766185b813a5d50078defcb74.zip |
Merge pull request #36 from benaadams/patch-1
Avoid unnecessary work for identical locations in Buffer.BlockCopy
Diffstat (limited to 'src')
-rw-r--r-- | src/vm/comutilnative.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/vm/comutilnative.cpp b/src/vm/comutilnative.cpp index 8c27b2f478..ae9a9c18ed 100644 --- a/src/vm/comutilnative.cpp +++ b/src/vm/comutilnative.cpp @@ -1443,9 +1443,12 @@ FCIMPL5(VOID, Buffer::BlockCopy, ArrayBase *src, int srcOffset, ArrayBase *dst, if (srcLen < (SIZE_T)srcOffset + (SIZE_T)count || dstLen < (SIZE_T)dstOffset + (SIZE_T)count) { FCThrowArgumentVoid(NULL, W("Argument_InvalidOffLen")); } + + PTR_BYTE srcPtr = src->GetDataPtr() + srcOffset; + PTR_BYTE dstPtr = dst->GetDataPtr() + dstOffset; - if (count > 0) { - memmove(dst->GetDataPtr() + dstOffset, src->GetDataPtr() + srcOffset, count); + if ((srcPtr != dstPtr) && (count > 0)) { + memmove(dstPtr, srcPtr, count); } FC_GC_POLL(); |