提交 d5284620 编写于 作者: J Johannes Rieken

fix #76076

上级 aae636e2
...@@ -78,7 +78,10 @@ export class VSBuffer { ...@@ -78,7 +78,10 @@ export class VSBuffer {
} }
slice(start?: number, end?: number): VSBuffer { slice(start?: number, end?: number): VSBuffer {
return new VSBuffer(this.buffer.slice(start, end)); // IMPORTANT: use subarray instead of slice because TypedArray#slice
// creates shallow copy and NodeBuffer#slice doesn't. The use of subarray
// ensures the same, performant, behaviour.
return new VSBuffer(this.buffer.subarray(start!/*bad lib.d.ts*/, end));
} }
set(array: VSBuffer, offset?: number): void { set(array: VSBuffer, offset?: number): void {
...@@ -437,4 +440,4 @@ class VSBufferWriteableStreamImpl implements VSBufferWriteableStream { ...@@ -437,4 +440,4 @@ class VSBufferWriteableStreamImpl implements VSBufferWriteableStream {
this.listeners.end.length = 0; this.listeners.end.length = 0;
} }
} }
} }
\ No newline at end of file
...@@ -364,4 +364,42 @@ suite('Buffer', () => { ...@@ -364,4 +364,42 @@ suite('Buffer', () => {
assert.equal(ended, false); assert.equal(ended, false);
assert.equal(errors.length, 0); assert.equal(errors.length, 0);
}); });
test('Performance issue with VSBuffer#slice #76076', function () {
// Buffer#slice creates a view
{
const buff = Buffer.from([10, 20, 30, 40]);
const b2 = buff.slice(1, 3);
assert.equal(buff[1], 20);
assert.equal(b2[0], 20);
buff[1] = 17; // modify buff AND b2
assert.equal(buff[1], 17);
assert.equal(b2[0], 17);
}
// TypedArray#slice creates a copy
{
const unit = new Uint8Array([10, 20, 30, 40]);
const u2 = unit.slice(1, 3);
assert.equal(unit[1], 20);
assert.equal(u2[0], 20);
unit[1] = 17; // modify unit, NOT b2
assert.equal(unit[1], 17);
assert.equal(u2[0], 20);
}
// TypedArray#subarray creates a view
{
const unit = new Uint8Array([10, 20, 30, 40]);
const u2 = unit.subarray(1, 3);
assert.equal(unit[1], 20);
assert.equal(u2[0], 20);
unit[1] = 17; // modify unit AND b2
assert.equal(unit[1], 17);
assert.equal(u2[0], 17);
}
});
}); });
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册