From 310e025402d2fc24aefe29e36c1efde2ec73aaf4 Mon Sep 17 00:00:00 2001 From: Johannes Date: Mon, 9 Jan 2023 14:49:46 +0100 Subject: [PATCH] Revert "ipc: use vql for uint types (#167407)" This reverts commit 0899758daeebc6d5429679b4e9b5d76ee9794273. --- src/vs/base/parts/ipc/common/ipc.ts | 90 ++++++------------- src/vs/base/parts/ipc/test/common/ipc.test.ts | 18 +--- test/unit/README.md | 2 +- 3 files changed, 27 insertions(+), 83 deletions(-) diff --git a/src/vs/base/parts/ipc/common/ipc.ts b/src/vs/base/parts/ipc/common/ipc.ts index 1d8c4a45efaf1..90041425e03e3 100644 --- a/src/vs/base/parts/ipc/common/ipc.ts +++ b/src/vs/base/parts/ipc/common/ipc.ts @@ -164,50 +164,7 @@ interface IWriter { write(buffer: VSBuffer): void; } - -/** - * @see https://en.wikipedia.org/wiki/Variable-length_quantity - */ -function readIntVQL(reader: IReader) { - let value = 0; - for (let n = 0; ; n += 7) { - const next = reader.read(1); - value |= (next.buffer[0] & 0b01111111) << n; - if (!(next.buffer[0] & 0b10000000)) { - return value; - } - } -} - -const vqlZero = createOneByteBuffer(0); - -/** - * @see https://en.wikipedia.org/wiki/Variable-length_quantity - */ -function writeInt32VQL(writer: IWriter, value: number) { - if (value === 0) { - writer.write(vqlZero); - return; - } - - let len = 0; - for (let v2 = value; v2 !== 0; v2 = v2 >>> 7) { - len++; - } - - const scratch = VSBuffer.alloc(len); - for (let i = 0; value !== 0; i++) { - scratch.buffer[i] = value & 0b01111111; - value = value >>> 7; - if (value > 0) { - scratch.buffer[i] |= 0b10000000; - } - } - - writer.write(scratch); -} - -export class BufferReader implements IReader { +class BufferReader implements IReader { private pos = 0; @@ -220,7 +177,7 @@ export class BufferReader implements IReader { } } -export class BufferWriter implements IWriter { +class BufferWriter implements IWriter { private buffers: VSBuffer[] = []; @@ -239,8 +196,17 @@ enum DataType { Buffer = 2, VSBuffer = 3, Array = 4, - Object = 5, - Int = 6 + Object = 5 +} + +function createSizeBuffer(size: number): VSBuffer { + const result = VSBuffer.alloc(4); + result.writeUInt32BE(size, 0); + return result; +} + +function readSizeBuffer(reader: IReader): number { + return reader.read(4).readUInt32BE(0); } function createOneByteBuffer(value: number): VSBuffer { @@ -256,58 +222,53 @@ const BufferPresets = { VSBuffer: createOneByteBuffer(DataType.VSBuffer), Array: createOneByteBuffer(DataType.Array), Object: createOneByteBuffer(DataType.Object), - Uint: createOneByteBuffer(DataType.Int), }; declare const Buffer: any; const hasBuffer = (typeof Buffer !== 'undefined'); -export function serialize(writer: IWriter, data: any): void { +function serialize(writer: IWriter, data: any): void { if (typeof data === 'undefined') { writer.write(BufferPresets.Undefined); } else if (typeof data === 'string') { const buffer = VSBuffer.fromString(data); writer.write(BufferPresets.String); - writeInt32VQL(writer, buffer.byteLength); + writer.write(createSizeBuffer(buffer.byteLength)); writer.write(buffer); } else if (hasBuffer && Buffer.isBuffer(data)) { const buffer = VSBuffer.wrap(data); writer.write(BufferPresets.Buffer); - writeInt32VQL(writer, buffer.byteLength); + writer.write(createSizeBuffer(buffer.byteLength)); writer.write(buffer); } else if (data instanceof VSBuffer) { writer.write(BufferPresets.VSBuffer); - writeInt32VQL(writer, data.byteLength); + writer.write(createSizeBuffer(data.byteLength)); writer.write(data); } else if (Array.isArray(data)) { writer.write(BufferPresets.Array); - writeInt32VQL(writer, data.length); + writer.write(createSizeBuffer(data.length)); for (const el of data) { serialize(writer, el); } - } else if (typeof data === 'number' && (data | 0) === data) { - // write a vql if it's a number that we can do bitwise operations on - writer.write(BufferPresets.Uint); - writeInt32VQL(writer, data); } else { const buffer = VSBuffer.fromString(JSON.stringify(data)); writer.write(BufferPresets.Object); - writeInt32VQL(writer, buffer.byteLength); + writer.write(createSizeBuffer(buffer.byteLength)); writer.write(buffer); } } -export function deserialize(reader: IReader): any { +function deserialize(reader: IReader): any { const type = reader.read(1).readUInt8(0); switch (type) { case DataType.Undefined: return undefined; - case DataType.String: return reader.read(readIntVQL(reader)).toString(); - case DataType.Buffer: return reader.read(readIntVQL(reader)).buffer; - case DataType.VSBuffer: return reader.read(readIntVQL(reader)); + case DataType.String: return reader.read(readSizeBuffer(reader)).toString(); + case DataType.Buffer: return reader.read(readSizeBuffer(reader)).buffer; + case DataType.VSBuffer: return reader.read(readSizeBuffer(reader)); case DataType.Array: { - const length = readIntVQL(reader); + const length = readSizeBuffer(reader); const result: any[] = []; for (let i = 0; i < length; i++) { @@ -316,8 +277,7 @@ export function deserialize(reader: IReader): any { return result; } - case DataType.Object: return JSON.parse(reader.read(readIntVQL(reader)).toString()); - case DataType.Int: return readIntVQL(reader); + case DataType.Object: return JSON.parse(reader.read(readSizeBuffer(reader)).toString()); } } diff --git a/src/vs/base/parts/ipc/test/common/ipc.test.ts b/src/vs/base/parts/ipc/test/common/ipc.test.ts index eaead87178e1a..d4a9a4bbb0847 100644 --- a/src/vs/base/parts/ipc/test/common/ipc.test.ts +++ b/src/vs/base/parts/ipc/test/common/ipc.test.ts @@ -11,7 +11,7 @@ import { canceled } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; import { isEqual } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; -import { BufferReader, BufferWriter, ClientConnectionEvent, deserialize, IChannel, IMessagePassingProtocol, IPCClient, IPCServer, IServerChannel, ProxyChannel, serialize } from 'vs/base/parts/ipc/common/ipc'; +import { ClientConnectionEvent, IChannel, IMessagePassingProtocol, IPCClient, IPCServer, IServerChannel, ProxyChannel } from 'vs/base/parts/ipc/common/ipc'; class QueueProtocol implements IMessagePassingProtocol { @@ -319,22 +319,6 @@ suite('Base IPC', function () { const r = await ipcService.buffersLength([VSBuffer.alloc(2), VSBuffer.alloc(3)]); return assert.strictEqual(r, 5); }); - - test('round trips numbers', () => { - const input = [ - 0, - 1, - -1, - 12345, - -12345, - 42.6, - 123412341234 - ]; - - const writer = new BufferWriter(); - serialize(writer, input); - assert.deepStrictEqual(deserialize(new BufferReader(writer.buffer)), input); - }); }); suite('one to one (proxy)', function () { diff --git a/test/unit/README.md b/test/unit/README.md index 9ad1c7a6a1579..8ac82b99d8cd9 100644 --- a/test/unit/README.md +++ b/test/unit/README.md @@ -27,7 +27,7 @@ Unit tests from layers `common` and `browser` are run inside `chromium`, `webkit ## Run (with node) - yarn test-node --run src/vs/editor/test/browser/controller/cursor.test.ts + yarn run mocha --ui tdd --run src/vs/editor/test/browser/controller/cursor.test.ts ## Coverage