|
1 | 1 | #include "node_json_parser.h" |
2 | 2 | #include "base_object-inl.h" |
3 | 3 | #include "node_errors.h" |
| 4 | +#include "simdutf.h" |
4 | 5 | #include "util-inl.h" |
5 | 6 |
|
6 | 7 | #include <cstring> |
@@ -398,22 +399,31 @@ void JsonParser::Parse(const FunctionCallbackInfo<Value>& args) { |
398 | 399 |
|
399 | 400 | Local<String> str = args[0].As<String>(); |
400 | 401 | 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 | + } |
417 | 427 | } |
418 | 428 |
|
419 | 429 | simdjson::padded_string_view view( |
|
0 commit comments