Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/node_buffer.cc')
-rw-r--r--src/node_buffer.cc91
1 files changed, 3 insertions, 88 deletions
diff --git a/src/node_buffer.cc b/src/node_buffer.cc
index 467a6e88474..d7c27295e94 100644
--- a/src/node_buffer.cc
+++ b/src/node_buffer.cc
@@ -12,7 +12,6 @@
#include <string.h>
#include <limits.h>
-#include <utility>
#define BUFFER_ID 0xB0E4
@@ -49,38 +48,6 @@
THROW_AND_RETURN_IF_OOB(end <= end_max); \
size_t length = end - start;
-#if defined(__GNUC__) || defined(__clang__)
-#define BSWAP_INTRINSIC_2(x) __builtin_bswap16(x)
-#define BSWAP_INTRINSIC_4(x) __builtin_bswap32(x)
-#define BSWAP_INTRINSIC_8(x) __builtin_bswap64(x)
-#elif defined(__linux__)
-#include <byteswap.h>
-#define BSWAP_INTRINSIC_2(x) bswap_16(x)
-#define BSWAP_INTRINSIC_4(x) bswap_32(x)
-#define BSWAP_INTRINSIC_8(x) bswap_64(x)
-#elif defined(_MSC_VER)
-#include <intrin.h>
-#define BSWAP_INTRINSIC_2(x) _byteswap_ushort(x);
-#define BSWAP_INTRINSIC_4(x) _byteswap_ulong(x);
-#define BSWAP_INTRINSIC_8(x) _byteswap_uint64(x);
-#else
-#define BSWAP_INTRINSIC_2(x) ((x) << 8) | ((x) >> 8)
-#define BSWAP_INTRINSIC_4(x) \
- (((x) & 0xFF) << 24) | \
- (((x) & 0xFF00) << 8) | \
- (((x) >> 8) & 0xFF00) | \
- (((x) >> 24) & 0xFF)
-#define BSWAP_INTRINSIC_8(x) \
- (((x) & 0xFF00000000000000ull) >> 56) | \
- (((x) & 0x00FF000000000000ull) >> 40) | \
- (((x) & 0x0000FF0000000000ull) >> 24) | \
- (((x) & 0x000000FF00000000ull) >> 8) | \
- (((x) & 0x00000000FF000000ull) << 8) | \
- (((x) & 0x0000000000FF0000ull) << 24) | \
- (((x) & 0x000000000000FF00ull) << 40) | \
- (((x) & 0x00000000000000FFull) << 56)
-#endif
-
namespace node {
// if true, all Buffer and SlowBuffer instances will automatically zero-fill
@@ -1204,23 +1171,7 @@ void Swap16(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
THROW_AND_RETURN_UNLESS_BUFFER(env, args[0]);
SPREAD_ARG(args[0], ts_obj);
-
- CHECK_EQ(ts_obj_length % 2, 0);
-
- int align = reinterpret_cast<uintptr_t>(ts_obj_data) % sizeof(uint16_t);
-
- if (align == 0) {
- uint16_t* data16 = reinterpret_cast<uint16_t*>(ts_obj_data);
- size_t len16 = ts_obj_length / 2;
- for (size_t i = 0; i < len16; i++) {
- data16[i] = BSWAP_INTRINSIC_2(data16[i]);
- }
- } else {
- for (size_t i = 0; i < ts_obj_length; i += 2) {
- std::swap(ts_obj_data[i], ts_obj_data[i + 1]);
- }
- }
-
+ SwapBytes16(ts_obj_data, ts_obj_length);
args.GetReturnValue().Set(args[0]);
}
@@ -1229,24 +1180,7 @@ void Swap32(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
THROW_AND_RETURN_UNLESS_BUFFER(env, args[0]);
SPREAD_ARG(args[0], ts_obj);
-
- CHECK_EQ(ts_obj_length % 4, 0);
-
- int align = reinterpret_cast<uintptr_t>(ts_obj_data) % sizeof(uint32_t);
-
- if (align == 0) {
- uint32_t* data32 = reinterpret_cast<uint32_t*>(ts_obj_data);
- size_t len32 = ts_obj_length / 4;
- for (size_t i = 0; i < len32; i++) {
- data32[i] = BSWAP_INTRINSIC_4(data32[i]);
- }
- } else {
- for (size_t i = 0; i < ts_obj_length; i += 4) {
- std::swap(ts_obj_data[i], ts_obj_data[i + 3]);
- std::swap(ts_obj_data[i + 1], ts_obj_data[i + 2]);
- }
- }
-
+ SwapBytes32(ts_obj_data, ts_obj_length);
args.GetReturnValue().Set(args[0]);
}
@@ -1255,26 +1189,7 @@ void Swap64(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
THROW_AND_RETURN_UNLESS_BUFFER(env, args[0]);
SPREAD_ARG(args[0], ts_obj);
-
- CHECK_EQ(ts_obj_length % 8, 0);
-
- int align = reinterpret_cast<uintptr_t>(ts_obj_data) % sizeof(uint64_t);
-
- if (align == 0) {
- uint64_t* data64 = reinterpret_cast<uint64_t*>(ts_obj_data);
- size_t len32 = ts_obj_length / 8;
- for (size_t i = 0; i < len32; i++) {
- data64[i] = BSWAP_INTRINSIC_8(data64[i]);
- }
- } else {
- for (size_t i = 0; i < ts_obj_length; i += 8) {
- std::swap(ts_obj_data[i], ts_obj_data[i + 7]);
- std::swap(ts_obj_data[i + 1], ts_obj_data[i + 6]);
- std::swap(ts_obj_data[i + 2], ts_obj_data[i + 5]);
- std::swap(ts_obj_data[i + 3], ts_obj_data[i + 4]);
- }
- }
-
+ SwapBytes64(ts_obj_data, ts_obj_length);
args.GetReturnValue().Set(args[0]);
}