@@ -1286,19 +1286,31 @@ static void Atob(const FunctionCallbackInfo<Value>& args) {
1286
1286
auto ext = input->GetExternalOneByteStringResource ();
1287
1287
size_t expected_length =
1288
1288
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);
1291
1291
result = simdutf::base64_to_binary (
1292
1292
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 ());
1293
1306
} else { // 16-bit case
1294
1307
String::Value value (env->isolate (), input);
1295
1308
auto data = reinterpret_cast <const char16_t *>(*value);
1296
1309
size_t expected_length =
1297
1310
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 ());
1302
1314
}
1303
1315
1304
1316
if (result.error == simdutf::error_code::SUCCESS) {
0 commit comments