@@ -1399,7 +1399,20 @@ namespace {
13991399std::pair<void *, size_t > DecomposeBufferToParts (Local<Value> buffer) {
14001400 void * pointer;
14011401 size_t byte_length;
1402- if (buffer->IsArrayBuffer ()) {
1402+
1403+ if (buffer->IsArrayBufferView ()) {
1404+ Local<ArrayBufferView> view = buffer.As <ArrayBufferView>();
1405+ Local<ArrayBuffer> buffer = view->Buffer ();
1406+
1407+ // Handle potential detached buffer case
1408+ if (buffer.IsEmpty () || buffer->Data () == nullptr ) {
1409+ pointer = nullptr ;
1410+ byte_length = 0 ;
1411+ } else {
1412+ pointer = static_cast <uint8_t *>(buffer->Data ()) + view->ByteOffset ();
1413+ byte_length = view->ByteLength ();
1414+ }
1415+ } else if (buffer->IsArrayBuffer ()) {
14031416 Local<ArrayBuffer> ab = buffer.As <ArrayBuffer>();
14041417 pointer = ab->Data ();
14051418 byte_length = ab->ByteLength ();
@@ -1449,37 +1462,6 @@ void CopyArrayBuffer(const FunctionCallbackInfo<Value>& args) {
14491462 memcpy (dest, src, bytes_to_copy);
14501463}
14511464
1452- std::pair<void *, size_t > DecomposeBufferToParts (Local<Value> source) {
1453- void * pointer;
1454- size_t byte_length;
1455-
1456- if (source->IsArrayBufferView ()) {
1457- Local<ArrayBufferView> view = source.As <ArrayBufferView>();
1458- Local<ArrayBuffer> buffer = view->Buffer ();
1459-
1460- // Handle potential detached buffer case
1461- if (buffer.IsEmpty () || buffer->Data () == nullptr ) {
1462- pointer = nullptr ;
1463- byte_length = 0 ;
1464- } else {
1465- pointer = static_cast <uint8_t *>(buffer->Data ()) + view->ByteOffset ();
1466- byte_length = view->ByteLength ();
1467- }
1468- } else if (source->IsArrayBuffer ()) {
1469- Local<ArrayBuffer> ab = source.As <ArrayBuffer>();
1470- pointer = ab->Data ();
1471- byte_length = ab->ByteLength ();
1472- } else if (source->IsSharedArrayBuffer ()) {
1473- Local<SharedArrayBuffer> ab = source.As <SharedArrayBuffer>();
1474- pointer = ab->Data ();
1475- byte_length = ab->ByteLength ();
1476- } else {
1477- UNREACHABLE (); // Caller must validate.
1478- }
1479-
1480- return {pointer, byte_length};
1481- }
1482-
14831465void StaticCopy (const FunctionCallbackInfo<Value>& args) {
14841466 Environment* env = Environment::GetCurrent (args);
14851467
0 commit comments