@@ -567,19 +567,31 @@ void StringSlice(const FunctionCallbackInfo<Value>& args) {
567567 THROW_AND_RETURN_UNLESS_BUFFER (env, args[0 ]);
568568 ArrayBufferViewContents<char > buffer (args[0 ]);
569569
570- if (buffer.length () == 0 )
571- return args.GetReturnValue ().SetEmptyString ();
570+ auto buffer_length = buffer.length ();
571+ const char * data_ptr = buffer.data ();
572+
573+ Local<ArrayBufferView> view = args[0 ].As <ArrayBufferView>();
574+
575+ if (buffer_length == 0 ) return args.GetReturnValue ().SetEmptyString ();
572576
573577 size_t start = 0 ;
574578 size_t end = 0 ;
575579 THROW_AND_RETURN_IF_OOB (ParseArrayIndex (env, args[1 ], 0 , &start));
576- THROW_AND_RETURN_IF_OOB (ParseArrayIndex (env, args[2 ], buffer. length () , &end));
577- if (end < start) end = start ;
578- THROW_AND_RETURN_IF_OOB (Just (end <= buffer. length () ));
580+ THROW_AND_RETURN_IF_OOB (ParseArrayIndex (env, args[2 ], buffer_length , &end));
581+ if (end <= start) return args. GetReturnValue (). SetEmptyString () ;
582+ THROW_AND_RETURN_IF_OOB (Just (end <= buffer_length ));
579583 size_t length = end - start;
580584
585+ std::unique_ptr<char []> data_copy;
586+ if (view->Buffer ()->IsSharedArrayBuffer ()) {
587+ data_copy = std::make_unique_for_overwrite<char []>(length);
588+ memcpy (data_copy.get (), data_ptr + start, length);
589+ data_ptr = data_copy.get ();
590+ start = 0 ;
591+ }
592+
581593 Local<Value> ret;
582- if (StringBytes::Encode (isolate, buffer. data () + start, length, encoding)
594+ if (StringBytes::Encode (isolate, data_ptr + start, length, encoding)
583595 .ToLocal (&ret)) {
584596 args.GetReturnValue ().Set (ret);
585597 }
0 commit comments