From ba4735d7cbc87f2951dadadc3edae002db69088a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 10 Apr 2019 15:35:12 +0200 Subject: [PATCH] debt - don't use Buffer in extHost-protocol --- .../api/browser/mainThreadFileSystem.ts | 13 +++++------- .../workbench/api/common/extHost.protocol.ts | 13 ++++++------ .../workbench/api/common/extHostFileSystem.ts | 21 +++++++++---------- .../api/node/extHostExtensionService.ts | 10 ++++----- .../services/extensions/common/rpcProtocol.ts | 9 ++++---- .../extensionHostProcessManager.ts | 3 ++- .../workbench/services/files/node/streams.ts | 2 +- 7 files changed, 34 insertions(+), 37 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadFileSystem.ts b/src/vs/workbench/api/browser/mainThreadFileSystem.ts index 264e0eb9ec5..61871e2c39b 100644 --- a/src/vs/workbench/api/browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/browser/mainThreadFileSystem.ts @@ -10,6 +10,7 @@ import { FileWriteOptions, FileSystemProviderCapabilities, IFileChange, IFileSer import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { ExtHostContext, ExtHostFileSystemShape, IExtHostContext, IFileChangeDto, MainContext, MainThreadFileSystemShape } from '../common/extHost.protocol'; import { ResourceLabelFormatter, ILabelService } from 'vs/platform/label/common/label'; +import { VSBuffer } from 'vs/base/common/buffer'; @extHostNamedCustomer(MainContext.MainThreadFileSystem) export class MainThreadFileSystem implements MainThreadFileSystemShape { @@ -105,10 +106,6 @@ class RemoteFileSystemProvider implements IFileSystemProvider { // --- forwarding calls - private static _asBuffer(data: Uint8Array): Buffer { - return Buffer.isBuffer(data) ? data : Buffer.from(data.buffer, data.byteOffset, data.byteLength); - } - stat(resource: URI): Promise { return this._proxy.$stat(this._handle, resource).then(undefined, err => { throw err; @@ -116,11 +113,11 @@ class RemoteFileSystemProvider implements IFileSystemProvider { } readFile(resource: URI): Promise { - return this._proxy.$readFile(this._handle, resource); + return this._proxy.$readFile(this._handle, resource).then(buffer => buffer.buffer); } writeFile(resource: URI, content: Uint8Array, opts: FileWriteOptions): Promise { - return this._proxy.$writeFile(this._handle, resource, RemoteFileSystemProvider._asBuffer(content), opts); + return this._proxy.$writeFile(this._handle, resource, VSBuffer.wrap(content), opts); } delete(resource: URI, opts: FileDeleteOptions): Promise { @@ -153,12 +150,12 @@ class RemoteFileSystemProvider implements IFileSystemProvider { read(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise { return this._proxy.$read(this._handle, fd, pos, length).then(readData => { - data.set(readData, offset); + data.set(readData.buffer, offset); return readData.byteLength; }); } write(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise { - return this._proxy.$write(this._handle, fd, pos, Buffer.from(data, offset, length)); + return this._proxy.$write(this._handle, fd, pos, VSBuffer.wrap(data).slice(offset, offset + length)); } } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index b83116f0964..1ea00a20b9c 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -46,6 +46,7 @@ import * as codeInset from 'vs/workbench/contrib/codeinset/common/codeInset'; import * as callHierarchy from 'vs/workbench/contrib/callHierarchy/common/callHierarchy'; import { IRelativePattern } from 'vs/base/common/glob'; import { IRemoteConsoleLog } from 'vs/base/common/console'; +import { VSBuffer } from 'vs/base/common/buffer'; export interface IEnvironment { isExtensionDevelopmentDebug: boolean; @@ -783,8 +784,8 @@ export interface ExtHostWorkspaceShape { export interface ExtHostFileSystemShape { $stat(handle: number, resource: UriComponents): Promise; $readdir(handle: number, resource: UriComponents): Promise<[string, files.FileType][]>; - $readFile(handle: number, resource: UriComponents): Promise; - $writeFile(handle: number, resource: UriComponents, content: Buffer, opts: files.FileWriteOptions): Promise; + $readFile(handle: number, resource: UriComponents): Promise; + $writeFile(handle: number, resource: UriComponents, content: VSBuffer, opts: files.FileWriteOptions): Promise; $rename(handle: number, resource: UriComponents, target: UriComponents, opts: files.FileOverwriteOptions): Promise; $copy(handle: number, resource: UriComponents, target: UriComponents, opts: files.FileOverwriteOptions): Promise; $mkdir(handle: number, resource: UriComponents): Promise; @@ -793,8 +794,8 @@ export interface ExtHostFileSystemShape { $unwatch(handle: number, session: number): void; $open(handle: number, resource: UriComponents, opts: files.FileOpenOptions): Promise; $close(handle: number, fd: number): Promise; - $read(handle: number, fd: number, pos: number, length: number): Promise; - $write(handle: number, fd: number, pos: number, data: Buffer): Promise; + $read(handle: number, fd: number, pos: number, length: number): Promise; + $write(handle: number, fd: number, pos: number, data: VSBuffer): Promise; } export interface ExtHostSearchShape { @@ -812,8 +813,8 @@ export interface ExtHostExtensionServiceShape { $deltaExtensions(toAdd: IExtensionDescription[], toRemove: ExtensionIdentifier[]): Promise; $test_latency(n: number): Promise; - $test_up(b: Buffer): Promise; - $test_down(size: number): Promise; + $test_up(b: VSBuffer): Promise; + $test_down(size: number): Promise; } export interface FileSystemEvents { diff --git a/src/vs/workbench/api/common/extHostFileSystem.ts b/src/vs/workbench/api/common/extHostFileSystem.ts index 44640d77173..a46c3fd8417 100644 --- a/src/vs/workbench/api/common/extHostFileSystem.ts +++ b/src/vs/workbench/api/common/extHostFileSystem.ts @@ -16,6 +16,7 @@ import { ResourceLabelFormatter } from 'vs/platform/label/common/label'; import { State, StateMachine, LinkComputer, Edge } from 'vs/editor/common/modes/linkComputer'; import { commonPrefixLength } from 'vs/base/common/strings'; import { CharCode } from 'vs/base/common/charCode'; +import { VSBuffer } from 'vs/base/common/buffer'; class FsLinkProvider { @@ -229,14 +230,12 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { return Promise.resolve(this.getProvider(handle).readDirectory(URI.revive(resource))); } - $readFile(handle: number, resource: UriComponents): Promise { - return Promise.resolve(this.getProvider(handle).readFile(URI.revive(resource))).then(data => { - return Buffer.isBuffer(data) ? data : Buffer.from(data.buffer, data.byteOffset, data.byteLength); - }); + $readFile(handle: number, resource: UriComponents): Promise { + return Promise.resolve(this.getProvider(handle).readFile(URI.revive(resource))).then(data => VSBuffer.wrap(data)); } - $writeFile(handle: number, resource: UriComponents, content: Buffer, opts: files.FileWriteOptions): Promise { - return Promise.resolve(this.getProvider(handle).writeFile(URI.revive(resource), content, opts)); + $writeFile(handle: number, resource: UriComponents, content: VSBuffer, opts: files.FileWriteOptions): Promise { + return Promise.resolve(this.getProvider(handle).writeFile(URI.revive(resource), content.buffer, opts)); } $delete(handle: number, resource: UriComponents, opts: files.FileDeleteOptions): Promise { @@ -288,23 +287,23 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { return Promise.resolve(provider.close(fd)); } - $read(handle: number, fd: number, pos: number, length: number): Promise { + $read(handle: number, fd: number, pos: number, length: number): Promise { const provider = this.getProvider(handle); if (!provider.read) { throw new Error('FileSystemProvider does not implement "read"'); } - const data = Buffer.allocUnsafe(length); - return Promise.resolve(provider.read(fd, pos, data, 0, length)).then(read => { + const data = VSBuffer.alloc(length); + return Promise.resolve(provider.read(fd, pos, data.buffer, 0, length)).then(read => { return data.slice(0, read); // don't send zeros }); } - $write(handle: number, fd: number, pos: number, data: Buffer): Promise { + $write(handle: number, fd: number, pos: number, data: VSBuffer): Promise { const provider = this.getProvider(handle); if (!provider.write) { throw new Error('FileSystemProvider does not implement "write"'); } - return Promise.resolve(provider.write(fd, pos, data, 0, data.length)); + return Promise.resolve(provider.write(fd, pos, data.buffer, 0, data.byteLength)); } private getProvider(handle: number): vscode.FileSystemProvider { diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index 29c99553e0c..76963806352 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -31,6 +31,7 @@ import { IWorkspace } from 'vs/platform/workspace/common/workspace'; import { Schemas } from 'vs/base/common/network'; import { withNullAsUndefined } from 'vs/base/common/types'; import { realpath } from 'vs/base/node/extpath'; +import { VSBuffer } from 'vs/base/common/buffer'; class ExtensionMemento implements IExtensionMemento { @@ -752,13 +753,12 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { return n; } - public async $test_up(b: Buffer): Promise { - return b.length; + public async $test_up(b: VSBuffer): Promise { + return b.byteLength; } - public async $test_down(size: number): Promise { - const b = Buffer.alloc(size, Math.random() % 256); - return b; + public async $test_down(size: number): Promise { + return VSBuffer.wrap(Buffer.alloc(size, Math.random() % 256)); } } diff --git a/src/vs/workbench/services/extensions/common/rpcProtocol.ts b/src/vs/workbench/services/extensions/common/rpcProtocol.ts index 4e5d42cb130..bf8473b89fb 100644 --- a/src/vs/workbench/services/extensions/common/rpcProtocol.ts +++ b/src/vs/workbench/services/extensions/common/rpcProtocol.ts @@ -739,7 +739,6 @@ class MessageIO { } private static _serializeReplyOKVSBuffer(req: number, res: VSBuffer): VSBuffer { - let len = 0; len += MessageBuffer.sizeVSBuffer(res); @@ -809,10 +808,10 @@ const enum MessageType { Cancel = 6, ReplyOKEmpty = 7, ReplyOKBuffer = 8, - ReplyOKVSBuffer = 8, - ReplyOKJSON = 9, - ReplyErrError = 10, - ReplyErrEmpty = 11, + ReplyOKVSBuffer = 9, + ReplyOKJSON = 10, + ReplyErrError = 11, + ReplyErrEmpty = 12, } const enum ArgType { diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHostProcessManager.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHostProcessManager.ts index 51f8fbb32eb..e3337b10009 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHostProcessManager.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHostProcessManager.ts @@ -27,6 +27,7 @@ import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/wor import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IUntitledResourceInput } from 'vs/workbench/common/editor'; import { StopWatch } from 'vs/base/common/stopwatch'; +import { VSBuffer } from 'vs/base/common/buffer'; // Enable to see detailed message communication between window and extension host const LOG_EXTENSION_HOST_COMMUNICATION = false; @@ -154,7 +155,7 @@ export class ExtensionHostProcessManager extends Disposable { let b = Buffer.alloc(SIZE, Math.random() % 256); const sw = StopWatch.create(true); - await proxy.$test_up(b); + await proxy.$test_up(VSBuffer.wrap(b)); sw.stop(); return ExtensionHostProcessManager._convert(SIZE, sw.elapsed()); } diff --git a/src/vs/workbench/services/files/node/streams.ts b/src/vs/workbench/services/files/node/streams.ts index b667cfb8f7a..b1996cb37a4 100644 --- a/src/vs/workbench/services/files/node/streams.ts +++ b/src/vs/workbench/services/files/node/streams.ts @@ -127,7 +127,7 @@ function createSimpleReadable(provider: IFileSystemProvider, resource: URI, posi return; } this._readOperation = provider.readFile!(resource).then(data => { - this.push(data.slice(position)); + this.push(Buffer.from(data.buffer, data.byteOffset, data.byteLength).slice(position)); this.push(null); }, err => { this.emit('error', err); -- GitLab