Skip to content

Commit 1c2391b

Browse files
committed
src: transcode using simdutf
1 parent 542a3dd commit 1c2391b

File tree

1 file changed

+26
-16
lines changed

1 file changed

+26
-16
lines changed

src/node_json_parser.cc

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "node_json_parser.h"
22
#include "base_object-inl.h"
33
#include "node_errors.h"
4+
#include "simdutf.h"
45
#include "util-inl.h"
56

67
#include <cstring>
@@ -398,22 +399,31 @@ void JsonParser::Parse(const FunctionCallbackInfo<Value>& args) {
398399

399400
Local<String> str = args[0].As<String>();
400401
size_t len;
401-
if (str->IsOneByte()) {
402-
const uint32_t char_len = str->Length();
403-
self->padded_buffer_.resize(char_len + simdjson::SIMDJSON_PADDING);
404-
std::memset(
405-
self->padded_buffer_.data() + char_len, 0, simdjson::SIMDJSON_PADDING);
406-
str->WriteOneByteV2(isolate,
407-
0,
408-
char_len,
409-
reinterpret_cast<uint8_t*>(self->padded_buffer_.data()));
410-
len = char_len;
411-
} else {
412-
const size_t utf8_len = str->Utf8LengthV2(isolate);
413-
self->padded_buffer_.resize(utf8_len + simdjson::SIMDJSON_PADDING);
414-
std::memset(
415-
self->padded_buffer_.data() + utf8_len, 0, simdjson::SIMDJSON_PADDING);
416-
len = str->WriteUtf8V2(isolate, self->padded_buffer_.data(), utf8_len);
402+
{
403+
v8::String::ValueView str_view(isolate, str);
404+
if (str_view.is_one_byte()) {
405+
const char* data = reinterpret_cast<const char*>(str_view.data8());
406+
const size_t char_len = str_view.length();
407+
const size_t utf8_len =
408+
simdutf::utf8_length_from_latin1(data, char_len);
409+
self->padded_buffer_.resize(utf8_len + simdjson::SIMDJSON_PADDING);
410+
std::memset(self->padded_buffer_.data() + utf8_len,
411+
0,
412+
simdjson::SIMDJSON_PADDING);
413+
len = simdutf::convert_latin1_to_utf8(
414+
data, char_len, self->padded_buffer_.data());
415+
} else {
416+
const char16_t* data =
417+
reinterpret_cast<const char16_t*>(str_view.data16());
418+
const size_t char_len = str_view.length();
419+
const size_t utf8_len = simdutf::utf8_length_from_utf16(data, char_len);
420+
self->padded_buffer_.resize(utf8_len + simdjson::SIMDJSON_PADDING);
421+
std::memset(self->padded_buffer_.data() + utf8_len,
422+
0,
423+
simdjson::SIMDJSON_PADDING);
424+
len = simdutf::convert_utf16_to_utf8(
425+
data, char_len, self->padded_buffer_.data());
426+
}
417427
}
418428

419429
simdjson::padded_string_view view(

0 commit comments

Comments
 (0)