diff options
author | trav90 <travawine@palemoon.org> | 2018-09-19 19:05:22 -0500 |
---|---|---|
committer | trav90 <travawine@palemoon.org> | 2018-09-19 19:05:22 -0500 |
commit | a0737572d41efaf6faaac5e0d92f623b3292aa8e (patch) | |
tree | 99497ee4009500def689345bf833b9105ac5e6e4 | |
parent | 33cd07bcee1268be688a9080cbc96007f06a91f5 (diff) | |
download | UXP-a0737572d41efaf6faaac5e0d92f623b3292aa8e.tar UXP-a0737572d41efaf6faaac5e0d92f623b3292aa8e.tar.gz UXP-a0737572d41efaf6faaac5e0d92f623b3292aa8e.tar.lz UXP-a0737572d41efaf6faaac5e0d92f623b3292aa8e.tar.xz UXP-a0737572d41efaf6faaac5e0d92f623b3292aa8e.zip |
Don't use PodCopy/PodMove to implement typed-array element-to-element copying
Standard std::copy and std::copy_n are readily optimized to the same thing, and they don't have a non-obvious requirement that the type being copied be trivial.
-rw-r--r-- | js/src/vm/TypedArrayCommon.h | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/js/src/vm/TypedArrayCommon.h b/js/src/vm/TypedArrayCommon.h index d29c93a65..f59419b28 100644 --- a/js/src/vm/TypedArrayCommon.h +++ b/js/src/vm/TypedArrayCommon.h @@ -11,7 +11,8 @@ #include "mozilla/Assertions.h" #include "mozilla/FloatingPoint.h" -#include "mozilla/PodOperations.h" + +#include <algorithm> #include "jsarray.h" #include "jscntxt.h" @@ -245,12 +246,24 @@ class UnsharedOps template<typename T> static void podCopy(SharedMem<T*> dest, SharedMem<T*> src, size_t nelem) { - mozilla::PodCopy(dest.unwrapUnshared(), src.unwrapUnshared(), nelem); + // std::copy_n better matches the argument values/types of this + // function, but as noted below it allows the input/output ranges to + // overlap. std::copy does not, so use it so the compiler has extra + // ability to optimize. + const auto* first = src.unwrapUnshared(); + const auto* last = first + nelem; + auto* result = dest.unwrapUnshared(); + std::copy(first, last, result); } template<typename T> - static void podMove(SharedMem<T*> dest, SharedMem<T*> src, size_t nelem) { - mozilla::PodMove(dest.unwrapUnshared(), src.unwrapUnshared(), nelem); + static void podMove(SharedMem<T*> dest, SharedMem<T*> src, size_t n) { + // std::copy_n copies from |src| to |dest| starting from |src|, so + // input/output ranges *may* permissibly overlap, as this function + // allows. + const auto* start = src.unwrapUnshared(); + auto* result = dest.unwrapUnshared(); + std::copy_n(start, n, result); } static SharedMem<void*> extract(TypedArrayObject* obj) { |