summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
Diffstat (limited to 'cli')
-rw-r--r--cli/js/buffer.ts3
-rw-r--r--cli/js/lib.deno.ns.d.ts8
-rw-r--r--cli/tests/unit/buffer_test.ts44
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);
});