Skip to content

Commit

Permalink
Revert "ipc: use vql for uint types (#167407)"
Browse files Browse the repository at this point in the history
This reverts commit 0899758.
  • Loading branch information
jrieken committed Jan 9, 2023
1 parent 0899758 commit 310e025
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 83 deletions.
90 changes: 25 additions & 65 deletions src/vs/base/parts/ipc/common/ipc.ts
Expand Up @@ -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;

Expand All @@ -220,7 +177,7 @@ export class BufferReader implements IReader {
}
}

export class BufferWriter implements IWriter {
class BufferWriter implements IWriter {

private buffers: VSBuffer[] = [];

Expand All @@ -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 {
Expand All @@ -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++) {
Expand All @@ -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());
}
}

Expand Down
18 changes: 1 addition & 17 deletions src/vs/base/parts/ipc/test/common/ipc.test.ts
Expand Up @@ -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 {

Expand Down Expand Up @@ -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 () {
Expand Down
2 changes: 1 addition & 1 deletion test/unit/README.md
Expand Up @@ -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

Expand Down

0 comments on commit 310e025

Please sign in to comment.