@@ -419,47 +419,47 @@ Maybe<size_t> StringBytes::StorageSize(Isolate* isolate,
419
419
Local<Value> val,
420
420
enum encoding encoding) {
421
421
HandleScope scope (isolate);
422
- size_t data_size = 0 ;
423
- bool is_buffer = Buffer::HasInstance (val);
424
422
425
- if (is_buffer && (encoding == BUFFER || encoding == LATIN1)) {
423
+ if (Buffer::HasInstance (val) && (encoding == BUFFER || encoding == LATIN1)) {
426
424
return Just (Buffer::Length (val));
427
425
}
428
426
429
427
Local<String> str;
430
428
if (!val->ToString (isolate->GetCurrentContext ()).ToLocal (&str))
431
429
return Nothing<size_t >();
430
+ String::ValueView view (isolate, str);
431
+ size_t data_size = 0 ;
432
432
433
433
switch (encoding) {
434
434
case ASCII:
435
435
case LATIN1:
436
- data_size = str-> Length ();
436
+ data_size = view. length ();
437
437
break ;
438
438
439
439
case BUFFER:
440
440
case UTF8:
441
441
// A single UCS2 codepoint never takes up more than 3 utf8 bytes.
442
442
// It is an exercise for the caller to decide when a string is
443
443
// long enough to justify calling Size() instead of StorageSize()
444
- data_size = 3 * str-> Length ();
444
+ data_size = 3 * view. length ();
445
445
break ;
446
446
447
447
case UCS2:
448
- data_size = str-> Length () * sizeof (uint16_t );
448
+ data_size = view. length () * sizeof (uint16_t );
449
449
break ;
450
450
451
451
case BASE64URL:
452
- data_size = simdutf::base64_length_from_binary (str-> Length (),
452
+ data_size = simdutf::base64_length_from_binary (view. length (),
453
453
simdutf::base64_url);
454
454
break ;
455
455
456
456
case BASE64:
457
- data_size = simdutf::base64_length_from_binary (str-> Length ());
457
+ data_size = simdutf::base64_length_from_binary (view. length ());
458
458
break ;
459
459
460
460
case HEX:
461
- CHECK (str-> Length () % 2 == 0 && " invalid hex string length" );
462
- data_size = str-> Length () / 2 ;
461
+ CHECK (view. length () % 2 == 0 && " invalid hex string length" );
462
+ data_size = view. length () / 2 ;
463
463
break ;
464
464
465
465
default :
@@ -480,32 +480,36 @@ Maybe<size_t> StringBytes::Size(Isolate* isolate,
480
480
Local<String> str;
481
481
if (!val->ToString (isolate->GetCurrentContext ()).ToLocal (&str))
482
482
return Nothing<size_t >();
483
+ String::ValueView view (isolate, str);
483
484
484
485
switch (encoding) {
485
486
case ASCII:
486
487
case LATIN1:
487
- return Just<size_t >(str-> Length ());
488
+ return Just<size_t >(view. length ());
488
489
489
490
case BUFFER:
490
491
case UTF8:
491
- return Just<size_t >(str->Utf8Length (isolate));
492
+ if (view.is_one_byte ()) {
493
+ return Just<size_t >(simdutf::utf8_length_from_latin1 (
494
+ reinterpret_cast <const char *>(view.data8 ()), view.length ()));
495
+ }
496
+ return Just<size_t >(simdutf::utf8_length_from_utf16 (
497
+ reinterpret_cast <const char16_t *>(view.data16 ()), view.length ()));
492
498
493
499
case UCS2:
494
- return Just (str-> Length () * sizeof (uint16_t ));
500
+ return Just (view. length () * sizeof (uint16_t ));
495
501
496
502
case BASE64URL: {
497
- String::Value value (isolate, str);
498
- return Just (simdutf::base64_length_from_binary (value.length (),
503
+ return Just (simdutf::base64_length_from_binary (view.length (),
499
504
simdutf::base64_url));
500
505
}
501
506
502
507
case BASE64: {
503
- String::Value value (isolate, str);
504
- return Just (simdutf::base64_length_from_binary (value.length ()));
508
+ return Just (simdutf::base64_length_from_binary (view.length ()));
505
509
}
506
510
507
511
case HEX:
508
- return Just<size_t >(str-> Length () / 2 );
512
+ return Just<size_t >(view. length () / 2 );
509
513
}
510
514
511
515
UNREACHABLE ();
0 commit comments