mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-25 08:37:30 +09:00
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.
This commit is contained in:
parent
3bfbbf5d40
commit
74983ef77e
1 changed files with 17 additions and 4 deletions
|
|
@ -11,7 +11,8 @@
|
||||||
|
|
||||||
#include "mozilla/Assertions.h"
|
#include "mozilla/Assertions.h"
|
||||||
#include "mozilla/FloatingPoint.h"
|
#include "mozilla/FloatingPoint.h"
|
||||||
#include "mozilla/PodOperations.h"
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
#include "jsarray.h"
|
#include "jsarray.h"
|
||||||
#include "jscntxt.h"
|
#include "jscntxt.h"
|
||||||
|
|
@ -245,12 +246,24 @@ class UnsharedOps
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static void podCopy(SharedMem<T*> dest, SharedMem<T*> src, size_t nelem) {
|
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>
|
template<typename T>
|
||||||
static void podMove(SharedMem<T*> dest, SharedMem<T*> src, size_t nelem) {
|
static void podMove(SharedMem<T*> dest, SharedMem<T*> src, size_t n) {
|
||||||
mozilla::PodMove(dest.unwrapUnshared(), src.unwrapUnshared(), nelem);
|
// 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) {
|
static SharedMem<void*> extract(TypedArrayObject* obj) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue