@@ -388,47 +388,47 @@ Maybe<size_t> StringBytes::StorageSize(Isolate* isolate,
388388 Local<Value> val,
389389 enum encoding encoding) {
390390 HandleScope scope (isolate);
391- size_t data_size = 0 ;
392- bool is_buffer = Buffer::HasInstance (val);
393391
394- if (is_buffer && (encoding == BUFFER || encoding == LATIN1)) {
392+ if (Buffer::HasInstance (val) && (encoding == BUFFER || encoding == LATIN1)) {
395393 return Just (Buffer::Length (val));
396394 }
397395
398396 Local<String> str;
399397 if (!val->ToString (isolate->GetCurrentContext ()).ToLocal (&str))
400398 return Nothing<size_t >();
399+ String::ValueView view (isolate, str);
400+ size_t data_size = 0 ;
401401
402402 switch (encoding) {
403403 case ASCII:
404404 case LATIN1:
405- data_size = str-> Length ();
405+ data_size = view. length ();
406406 break ;
407407
408408 case BUFFER:
409409 case UTF8:
410410 // A single UCS2 codepoint never takes up more than 3 utf8 bytes.
411411 // It is an exercise for the caller to decide when a string is
412412 // long enough to justify calling Size() instead of StorageSize()
413- data_size = 3 * str-> Length ();
413+ data_size = 3 * view. length ();
414414 break ;
415415
416416 case UCS2:
417- data_size = str-> Length () * sizeof (uint16_t );
417+ data_size = view. length () * sizeof (uint16_t );
418418 break ;
419419
420420 case BASE64URL:
421- data_size = simdutf::base64_length_from_binary (str-> Length (),
421+ data_size = simdutf::base64_length_from_binary (view. length (),
422422 simdutf::base64_url);
423423 break ;
424424
425425 case BASE64:
426- data_size = simdutf::base64_length_from_binary (str-> Length ());
426+ data_size = simdutf::base64_length_from_binary (view. length ());
427427 break ;
428428
429429 case HEX:
430- CHECK (str-> Length () % 2 == 0 && " invalid hex string length" );
431- data_size = str-> Length () / 2 ;
430+ CHECK (view. length () % 2 == 0 && " invalid hex string length" );
431+ data_size = view. length () / 2 ;
432432 break ;
433433
434434 default :
@@ -449,32 +449,36 @@ Maybe<size_t> StringBytes::Size(Isolate* isolate,
449449 Local<String> str;
450450 if (!val->ToString (isolate->GetCurrentContext ()).ToLocal (&str))
451451 return Nothing<size_t >();
452+ String::ValueView view (isolate, str);
452453
453454 switch (encoding) {
454455 case ASCII:
455456 case LATIN1:
456- return Just<size_t >(str-> Length ());
457+ return Just<size_t >(view. length ());
457458
458459 case BUFFER:
459460 case UTF8:
460- return Just<size_t >(str->Utf8Length (isolate));
461+ if (view.is_one_byte ()) {
462+ return Just<size_t >(simdutf::utf8_length_from_latin1 (
463+ reinterpret_cast <const char *>(view.data8 ()), view.length ()));
464+ }
465+ return Just<size_t >(simdutf::utf8_length_from_utf16 (
466+ reinterpret_cast <const char16_t *>(view.data16 ()), view.length ()));
461467
462468 case UCS2:
463- return Just (str-> Length () * sizeof (uint16_t ));
469+ return Just (view. length () * sizeof (uint16_t ));
464470
465471 case BASE64URL: {
466- String::Value value (isolate, str);
467- return Just (simdutf::base64_length_from_binary (value.length (),
472+ return Just (simdutf::base64_length_from_binary (view.length (),
468473 simdutf::base64_url));
469474 }
470475
471476 case BASE64: {
472- String::Value value (isolate, str);
473- return Just (simdutf::base64_length_from_binary (value.length ()));
477+ return Just (simdutf::base64_length_from_binary (view.length ()));
474478 }
475479
476480 case HEX:
477- return Just<size_t >(str-> Length () / 2 );
481+ return Just<size_t >(view. length () / 2 );
478482 }
479483
480484 UNREACHABLE ();
0 commit comments