diff options
author | Marcos Casagrande <marcoscvp90@gmail.com> | 2020-07-13 06:58:59 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-13 00:58:59 -0400 |
commit | 1a96a96e101140a2c39114710f93ab21c98fca01 (patch) | |
tree | fe2166564dfad2c34dbbaec2cd72b51446b1d26f /cli | |
parent | 63edeb1c36bfcea278c248e8be92f7dbb75f7671 (diff) |
feat(cli): add copy argument to Buffer.bytes (#6697)
Diffstat (limited to 'cli')
-rw-r--r-- | cli/js/buffer.ts | 3 | ||||
-rw-r--r-- | cli/js/lib.deno.ns.d.ts | 8 | ||||
-rw-r--r-- | cli/tests/unit/buffer_test.ts | 44 |
3 files changed, 47 insertions, 8 deletions
diff --git a/cli/js/buffer.ts b/cli/js/buffer.ts index 3308a9a0c..4f88ff625 100644 --- a/cli/js/buffer.ts +++ b/cli/js/buffer.ts @@ -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); } diff --git a/cli/js/lib.deno.ns.d.ts b/cli/js/lib.deno.ns.d.ts index 32b9bb39b..373f3be2f 100644 --- a/cli/js/lib.deno.ns.d.ts +++ b/cli/js/lib.deno.ns.d.ts @@ -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. */ diff --git a/cli/tests/unit/buffer_test.ts b/cli/tests/unit/buffer_test.ts index 440dd5495..320dddcc1 100644 --- a/cli/tests/unit/buffer_test.ts +++ b/cli/tests/unit/buffer_test.ts @@ -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(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(bytes.byteLength, 1); - assertEquals(bytes.byteLength, actualBytes.buffer.byteLength); + assertEquals(actualBytes.byteLength, bufSize); + assertEquals(actualBytes.buffer.byteLength, actualBytes.byteLength); }); |