From f3e1c7dbabd38c02a7d5f0e2e0e1c4016479166c Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 9 Apr 2019 15:45:14 +0200 Subject: [PATCH] Fixes #71993: Ensure Buffer is always used when available --- src/vs/base/common/buffer.ts | 7 ++++++- src/vs/base/test/common/buffer.test.ts | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/vs/base/test/common/buffer.test.ts diff --git a/src/vs/base/common/buffer.ts b/src/vs/base/common/buffer.ts index ce5bb1d5622..840e5a87d90 100644 --- a/src/vs/base/common/buffer.ts +++ b/src/vs/base/common/buffer.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ declare var Buffer: any; -const hasBuffer = (typeof Buffer !== 'undefined'); +export const hasBuffer = (typeof Buffer !== 'undefined'); let textEncoder: TextEncoder | null; let textDecoder: TextDecoder | null; @@ -20,6 +20,11 @@ export class VSBuffer { } public static wrap(actual: Uint8Array): VSBuffer { + if (hasBuffer && !(Buffer.isBuffer(actual))) { + // https://nodejs.org/dist/latest-v10.x/docs/api/buffer.html#buffer_class_method_buffer_from_arraybuffer_byteoffset_length + // Create a zero-copy Buffer wrapper around the ArrayBuffer pointed to by the Uint8Array + actual = Buffer.from(actual.buffer, actual.byteOffset, actual.byteLength); + } return new VSBuffer(actual); } diff --git a/src/vs/base/test/common/buffer.test.ts b/src/vs/base/test/common/buffer.test.ts new file mode 100644 index 00000000000..a158aeeb519 --- /dev/null +++ b/src/vs/base/test/common/buffer.test.ts @@ -0,0 +1,20 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + + +import * as assert from 'assert'; +import { hasBuffer, VSBuffer } from 'vs/base/common/buffer'; + +suite('Buffer', () => { + + if (hasBuffer) { + test('issue #71993 - VSBuffer#toString returns numbers', () => { + const data = new Uint8Array([1, 2, 3, 'h'.charCodeAt(0), 'i'.charCodeAt(0), 4, 5]).buffer; + const buffer = VSBuffer.wrap(new Uint8Array(data, 3, 2)); + assert.deepEqual(buffer.toString(), 'hi'); + }); + } + +}); -- GitLab