@@ -537,6 +537,37 @@ Maybe<size_t> StringBytes::Size(Isolate* isolate,
537537 } \
538538 } while (0 )
539539
540+ // Converts known-valid, known-non-ASCII UTF-8 (buflen >= 32) to a V8 string
541+ // via the fast UTF-16 path. Callers must ensure buflen is range-checked.
542+ static MaybeLocal<Value> EncodeKnownValidNonAsciiUTF8 (Isolate* isolate,
543+ const char * buf,
544+ size_t buflen) {
545+ size_t u16size = simdutf::utf16_length_from_utf8 (buf, buflen);
546+ if (u16size > static_cast <size_t >(v8::String::kMaxLength )) {
547+ isolate->ThrowException (ERR_STRING_TOO_LONG (isolate));
548+ return MaybeLocal<Value>();
549+ }
550+ return EncodeTwoByteString (
551+ isolate, u16size, [buf, buflen, u16size](uint16_t * dst) {
552+ size_t written = simdutf::convert_valid_utf8_to_utf16 (
553+ buf, buflen, reinterpret_cast <char16_t *>(dst));
554+ CHECK_EQ (written, u16size);
555+ });
556+ }
557+
558+ MaybeLocal<Value> StringBytes::EncodeValidatedUTF8 (Isolate* isolate,
559+ const char * buf,
560+ size_t buflen) {
561+ buflen = keep_buflen_in_range (buflen);
562+ if (buflen >= 32 )
563+ return EncodeKnownValidNonAsciiUTF8 (isolate, buf, buflen);
564+ Local<String> str;
565+ if (!String::NewFromUtf8 (isolate, buf, v8::NewStringType::kNormal , buflen)
566+ .ToLocal (&str))
567+ isolate->ThrowException (node::ERR_STRING_TOO_LONG (isolate));
568+ return str;
569+ }
570+
540571MaybeLocal<Value> StringBytes::Encode (Isolate* isolate,
541572 const char * buf,
542573 size_t buflen,
@@ -650,17 +681,7 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
650681 static_cast <int >(r.count ));
651682 }
652683 } else if (simdutf::validate_utf8 (buf, buflen)) {
653- size_t u16size = simdutf::utf16_length_from_utf8 (buf, buflen);
654- if (u16size > static_cast <size_t >(v8::String::kMaxLength )) {
655- isolate->ThrowException (ERR_STRING_TOO_LONG (isolate));
656- return MaybeLocal<Value>();
657- }
658- return EncodeTwoByteString (
659- isolate, u16size, [buf, buflen, u16size](uint16_t * dst) {
660- size_t written = simdutf::convert_valid_utf8_to_utf16 (
661- buf, buflen, reinterpret_cast <char16_t *>(dst));
662- CHECK_EQ (written, u16size);
663- });
684+ return EncodeKnownValidNonAsciiUTF8 (isolate, buf, buflen);
664685 }
665686 }
666687
@@ -736,40 +757,6 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
736757 }
737758}
738759
739- MaybeLocal<Value> StringBytes::EncodeValidUtf8 (Isolate* isolate,
740- const char * buf,
741- size_t buflen) {
742- CHECK_BUFLEN_IN_RANGE (buflen);
743- if (!buflen) return String::Empty (isolate);
744- buflen = keep_buflen_in_range (buflen);
745-
746- // ASCII fast path
747- if (!simdutf::validate_ascii_with_errors (buf, buflen).error ) {
748- return ExternOneByteString::NewFromCopy (isolate, buf, buflen);
749- }
750-
751- if (buflen >= 32 ) {
752- size_t u16size = simdutf::utf16_length_from_utf8 (buf, buflen);
753- if (u16size > static_cast <size_t >(v8::String::kMaxLength )) {
754- isolate->ThrowException (ERR_STRING_TOO_LONG (isolate));
755- return MaybeLocal<Value>();
756- }
757- return EncodeTwoByteString (
758- isolate, u16size, [buf, buflen, u16size](uint16_t * dst) {
759- size_t written = simdutf::convert_valid_utf8_to_utf16 (
760- buf, buflen, reinterpret_cast <char16_t *>(dst));
761- CHECK_EQ (written, u16size);
762- });
763- }
764-
765- Local<String> str;
766- if (!String::NewFromUtf8 (isolate, buf, v8::NewStringType::kNormal , buflen)
767- .ToLocal (&str)) {
768- isolate->ThrowException (node::ERR_STRING_TOO_LONG (isolate));
769- }
770- return str;
771- }
772-
773760MaybeLocal<Value> StringBytes::Encode (Isolate* isolate,
774761 const uint16_t * buf,
775762 size_t buflen) {
0 commit comments