@@ -728,16 +728,28 @@ void SlowByteLengthUtf8(const FunctionCallbackInfo<Value>& args) {
728728 args.GetReturnValue ().Set (args[0 ].As <String>()->Utf8Length (env->isolate ()));
729729}
730730
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 ();
733745 // For short inputs, the function call overhead to simdutf is maybe
734746 // 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 () );
737749 }
738750
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 () );
741753
742754 uint32_t answer = length;
743755 uint32_t i = 0 ;
0 commit comments