@@ -388,47 +388,47 @@ Maybe<size_t> StringBytes::StorageSize(Isolate* isolate,
388
388
Local<Value> val,
389
389
enum encoding encoding) {
390
390
HandleScope scope (isolate);
391
- size_t data_size = 0 ;
392
- bool is_buffer = Buffer::HasInstance (val);
393
391
394
- if (is_buffer && (encoding == BUFFER || encoding == LATIN1)) {
392
+ if (Buffer::HasInstance (val) && (encoding == BUFFER || encoding == LATIN1)) {
395
393
return Just (Buffer::Length (val));
396
394
}
397
395
398
396
Local<String> str;
399
397
if (!val->ToString (isolate->GetCurrentContext ()).ToLocal (&str))
400
398
return Nothing<size_t >();
399
+ String::ValueView view (isolate, str);
400
+ size_t data_size = 0 ;
401
401
402
402
switch (encoding) {
403
403
case ASCII:
404
404
case LATIN1:
405
- data_size = str-> Length ();
405
+ data_size = view. length ();
406
406
break ;
407
407
408
408
case BUFFER:
409
409
case UTF8:
410
410
// A single UCS2 codepoint never takes up more than 3 utf8 bytes.
411
411
// It is an exercise for the caller to decide when a string is
412
412
// long enough to justify calling Size() instead of StorageSize()
413
- data_size = 3 * str-> Length ();
413
+ data_size = 3 * view. length ();
414
414
break ;
415
415
416
416
case UCS2:
417
- data_size = str-> Length () * sizeof (uint16_t );
417
+ data_size = view. length () * sizeof (uint16_t );
418
418
break ;
419
419
420
420
case BASE64URL:
421
- data_size = simdutf::base64_length_from_binary (str-> Length (),
421
+ data_size = simdutf::base64_length_from_binary (view. length (),
422
422
simdutf::base64_url);
423
423
break ;
424
424
425
425
case BASE64:
426
- data_size = simdutf::base64_length_from_binary (str-> Length ());
426
+ data_size = simdutf::base64_length_from_binary (view. length ());
427
427
break ;
428
428
429
429
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 ;
432
432
break ;
433
433
434
434
default :
@@ -449,32 +449,36 @@ Maybe<size_t> StringBytes::Size(Isolate* isolate,
449
449
Local<String> str;
450
450
if (!val->ToString (isolate->GetCurrentContext ()).ToLocal (&str))
451
451
return Nothing<size_t >();
452
+ String::ValueView view (isolate, str);
452
453
453
454
switch (encoding) {
454
455
case ASCII:
455
456
case LATIN1:
456
- return Just<size_t >(str-> Length ());
457
+ return Just<size_t >(view. length ());
457
458
458
459
case BUFFER:
459
460
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 ()));
461
467
462
468
case UCS2:
463
- return Just (str-> Length () * sizeof (uint16_t ));
469
+ return Just (view. length () * sizeof (uint16_t ));
464
470
465
471
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 (),
468
473
simdutf::base64_url));
469
474
}
470
475
471
476
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 ()));
474
478
}
475
479
476
480
case HEX:
477
- return Just<size_t >(str-> Length () / 2 );
481
+ return Just<size_t >(view. length () / 2 );
478
482
}
479
483
480
484
UNREACHABLE ();
0 commit comments