@@ -1286,19 +1286,31 @@ static void Atob(const FunctionCallbackInfo<Value>& args) {
12861286 auto ext = input->GetExternalOneByteStringResource();
12871287 size_t expected_length =
12881288 simdutf::maximal_binary_length_from_base64(ext->data(), ext->length());
1289- buffer.AllocateSufficientStorage(expected_length + 1 );
1290- buffer.SetLengthAndZeroTerminate (expected_length);
1289+ buffer.AllocateSufficientStorage(expected_length);
1290+ buffer.SetLength (expected_length);
12911291 result = simdutf::base64_to_binary(
12921292 ext->data(), ext->length(), buffer.out(), simdutf::base64_default);
1293+ } else if (input->IsOneByte()) {
1294+ MaybeStackBuffer<uint8_t> stack_buf(input->Length());
1295+ input->WriteOneByte(args.GetIsolate(),
1296+ stack_buf.out(),
1297+ 0,
1298+ input->Length(),
1299+ String::NO_NULL_TERMINATION);
1300+ const char* data = reinterpret_cast<const char*>(*stack_buf);
1301+ size_t expected_length =
1302+ simdutf::maximal_binary_length_from_base64(data, input->Length());
1303+ buffer.AllocateSufficientStorage(expected_length);
1304+ buffer.SetLength(expected_length);
1305+ result = simdutf::base64_to_binary(data, input->Length(), buffer.out());
12931306 } else { // 16-bit case
12941307 String::Value value(env->isolate(), input);
12951308 auto data = reinterpret_cast<const char16_t*>(*value);
12961309 size_t expected_length =
12971310 simdutf::maximal_binary_length_from_base64(data, value.length());
1298- buffer.AllocateSufficientStorage(expected_length + 1);
1299- buffer.SetLengthAndZeroTerminate(expected_length);
1300- result = simdutf::base64_to_binary(
1301- data, value.length(), buffer.out(), simdutf::base64_default);
1311+ buffer.AllocateSufficientStorage(expected_length);
1312+ buffer.SetLength(expected_length);
1313+ result = simdutf::base64_to_binary(data, value.length(), buffer.out());
13021314 }
13031315
13041316 if (result.error == simdutf::error_code::SUCCESS) {
0 commit comments