From 8b3e83bb53783e5d56af504aeb82305f0865c0da Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sun, 12 May 2024 15:29:25 -0400 Subject: [PATCH] buffer: even faster atob PR-URL: https://github.com/nodejs/node/pull/52443 Reviewed-By: Yagiz Nizipli Reviewed-By: Benjamin Gruenbaum --- src/node_buffer.cc | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/node_buffer.cc b/src/node_buffer.cc index e63318b65b2e61..e7e3ead4416a40 100644 --- a/src/node_buffer.cc +++ b/src/node_buffer.cc @@ -1286,19 +1286,31 @@ static void Atob(const FunctionCallbackInfo& args) { auto ext = input->GetExternalOneByteStringResource(); size_t expected_length = simdutf::maximal_binary_length_from_base64(ext->data(), ext->length()); - buffer.AllocateSufficientStorage(expected_length + 1); - buffer.SetLengthAndZeroTerminate(expected_length); + buffer.AllocateSufficientStorage(expected_length); + buffer.SetLength(expected_length); result = simdutf::base64_to_binary( ext->data(), ext->length(), buffer.out(), simdutf::base64_default); + } else if (input->IsOneByte()) { + MaybeStackBuffer stack_buf(input->Length()); + input->WriteOneByte(args.GetIsolate(), + stack_buf.out(), + 0, + input->Length(), + String::NO_NULL_TERMINATION); + const char* data = reinterpret_cast(*stack_buf); + size_t expected_length = + simdutf::maximal_binary_length_from_base64(data, input->Length()); + buffer.AllocateSufficientStorage(expected_length); + buffer.SetLength(expected_length); + result = simdutf::base64_to_binary(data, input->Length(), buffer.out()); } else { // 16-bit case String::Value value(env->isolate(), input); auto data = reinterpret_cast(*value); size_t expected_length = simdutf::maximal_binary_length_from_base64(data, value.length()); - buffer.AllocateSufficientStorage(expected_length + 1); - buffer.SetLengthAndZeroTerminate(expected_length); - result = simdutf::base64_to_binary( - data, value.length(), buffer.out(), simdutf::base64_default); + buffer.AllocateSufficientStorage(expected_length); + buffer.SetLength(expected_length); + result = simdutf::base64_to_binary(data, value.length(), buffer.out()); } if (result.error == simdutf::error_code::SUCCESS) {