@@ -567,19 +567,31 @@ void StringSlice(const FunctionCallbackInfo<Value>& args) { |
567 | 567 | THROW_AND_RETURN_UNLESS_BUFFER(env, args[0]); |
568 | 568 | ArrayBufferViewContents<char> buffer(args[0]); |
569 | 569 |
|
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(); |
572 | 576 |
|
573 | 577 | size_t start = 0; |
574 | 578 | size_t end = 0; |
575 | 579 | 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)); |
579 | 583 | size_t length = end - start; |
580 | 584 |
|
| 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 | + |
581 | 593 | Local<Value> ret; |
582 | | - if (StringBytes::Encode(isolate, buffer.data() + start, length, encoding) |
| 594 | + if (StringBytes::Encode(isolate, data_ptr + start, length, encoding) |
583 | 595 | .ToLocal(&ret)) { |
584 | 596 | args.GetReturnValue().Set(ret); |
585 | 597 | } |
|