feat(cli): add copy argument to Buffer.bytes (#6697)

This commit is contained in:
Marcos Casagrande 2020-07-13 06:58:59 +02:00 committed by GitHub
parent 63edeb1c36
commit 1a96a96e10
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 47 additions and 8 deletions

View file

@ -39,7 +39,8 @@ export class Buffer implements Reader, ReaderSync, Writer, WriterSync {
this.#buf = new Uint8Array(ab);
}
bytes(): Uint8Array {
bytes(options: { copy?: boolean } = { copy: true }): Uint8Array {
if (options.copy === false) return this.#buf.subarray(this.#off);
return this.#buf.slice(this.#off);
}

View file

@ -820,10 +820,12 @@ declare namespace Deno {
*
* The slice is valid for use only until the next buffer modification (that
* is, only until the next call to a method like `read()`, `write()`,
* `reset()`, or `truncate()`). The slice aliases the buffer content at
* `reset()`, or `truncate()`). If `options.copy` is false the slice aliases the buffer content at
* least until the next buffer modification, so immediate changes to the
* slice will affect the result of future reads. */
bytes(): Uint8Array;
* slice will affect the result of future reads.
* @param options Defaults to `{ copy: true }`
*/
bytes(options?: { copy?: boolean }): Uint8Array;
/** Returns whether the unread portion of the buffer is empty. */
empty(): boolean;
/** A read only number of bytes of the unread portion of the buffer. */

View file

@ -402,14 +402,50 @@ unitTest(function testWriteAllSync(): void {
});
unitTest(function testBufferBytesArrayBufferLength(): void {
const bytes = new TextEncoder().encode("a");
// defaults to copy
const args = [{}, { copy: undefined }, undefined, { copy: true }];
for (const arg of args) {
const bufSize = 64 * 1024;
const bytes = new TextEncoder().encode("a".repeat(bufSize));
const reader = new Deno.Buffer();
Deno.writeAllSync(reader, bytes);
const writer = new Deno.Buffer();
writer.readFromSync(reader);
const actualBytes = writer.bytes(arg);
assertEquals(actualBytes.byteLength, bufSize);
assert(actualBytes.buffer !== writer.bytes(arg).buffer);
assertEquals(actualBytes.byteLength, actualBytes.buffer.byteLength);
}
});
unitTest(function testBufferBytesCopyFalse(): void {
const bufSize = 64 * 1024;
const bytes = new TextEncoder().encode("a".repeat(bufSize));
const reader = new Deno.Buffer();
Deno.writeAllSync(reader, bytes);
const writer = new Deno.Buffer();
writer.readFromSync(reader);
const actualBytes = writer.bytes();
const actualBytes = writer.bytes({ copy: false });
assertEquals(bytes.byteLength, 1);
assertEquals(bytes.byteLength, actualBytes.buffer.byteLength);
assertEquals(actualBytes.byteLength, bufSize);
assertEquals(actualBytes.buffer, writer.bytes({ copy: false }).buffer);
assert(actualBytes.buffer.byteLength > actualBytes.byteLength);
});
unitTest(function testBufferBytesCopyFalseGrowExactBytes(): void {
const bufSize = 64 * 1024;
const bytes = new TextEncoder().encode("a".repeat(bufSize));
const reader = new Deno.Buffer();
Deno.writeAllSync(reader, bytes);
const writer = new Deno.Buffer();
writer.grow(bufSize);
writer.readFromSync(reader);
const actualBytes = writer.bytes({ copy: false });
assertEquals(actualBytes.byteLength, bufSize);
assertEquals(actualBytes.buffer.byteLength, actualBytes.byteLength);
});