@@ -728,16 +728,28 @@ void SlowByteLengthUtf8(const FunctionCallbackInfo<Value>& args) {
728
728
args.GetReturnValue ().Set (args[0 ].As <String>()->Utf8Length (env->isolate ()));
729
729
}
730
730
731
- uint32_t FastByteLengthUtf8 (Local<Value> receiver,
732
- const v8::FastOneByteString& source) {
731
+ uint32_t FastByteLengthUtf8 (
732
+ Local<Value> receiver,
733
+ Local<Value> sourceValue,
734
+ v8::FastApiCallbackOptions& options) { // NOLINT(runtime/references)
735
+ TRACK_V8_FAST_API_CALL (" Buffer::FastByteLengthUtf8" );
736
+ auto isolate = options.isolate ;
737
+ HandleScope handleScope (isolate);
738
+ CHECK (sourceValue->IsString ());
739
+ Local<String> sourceStr = sourceValue.As <String>();
740
+
741
+ if (!sourceStr->IsExternalOneByte ()) {
742
+ return sourceStr->Utf8Length (isolate);
743
+ }
744
+ auto source = sourceStr->GetExternalOneByteStringResource ();
733
745
// For short inputs, the function call overhead to simdutf is maybe
734
746
// not worth it, reserve simdutf for long strings.
735
- if (source. length > 128 ) {
736
- return simdutf::utf8_length_from_latin1 (source. data , source. length );
747
+ if (source-> length () > 128 ) {
748
+ return simdutf::utf8_length_from_latin1 (source-> data () , source-> length () );
737
749
}
738
750
739
- uint32_t length = source. length ;
740
- const auto input = reinterpret_cast <const uint8_t *>(source. data );
751
+ uint32_t length = source-> length () ;
752
+ const auto input = reinterpret_cast <const uint8_t *>(source-> data () );
741
753
742
754
uint32_t answer = length;
743
755
uint32_t i = 0 ;
0 commit comments