diff --git a/ext/node/polyfills/internal/buffer.mjs b/ext/node/polyfills/internal/buffer.mjs index a051965a39..c324945558 100644 --- a/ext/node/polyfills/internal/buffer.mjs +++ b/ext/node/polyfills/internal/buffer.mjs @@ -220,12 +220,9 @@ function fromString(string, encoding) { return buf; } -function fromArrayLike(array) { - const length = array.length < 0 ? 0 : checked(array.length) | 0; - const buf = createBuffer(length); - for (let i = 0; i < length; i += 1) { - buf[i] = array[i] & 255; - } +function fromArrayLike(obj) { + const buf = new Uint8Array(obj); + Object.setPrototypeOf(buf, Buffer.prototype); return buf; } @@ -234,6 +231,7 @@ function fromObject(obj) { if (typeof obj.length !== "number") { return createBuffer(0); } + return fromArrayLike(obj); } diff --git a/tests/unit_node/buffer_test.ts b/tests/unit_node/buffer_test.ts index 0005b1b5d3..07f5dd2c19 100644 --- a/tests/unit_node/buffer_test.ts +++ b/tests/unit_node/buffer_test.ts @@ -534,15 +534,18 @@ Deno.test({ }); Deno.test({ - name: "[node/buffer] Buffer from another buffer creates a Buffer", + name: "[node/buffer] Buffer from another buffer creates a copy", fn() { - const buffer: Buffer = Buffer.from(Buffer.from("test")); - assertEquals(buffer.length, 4, "Buffer length should be 4"); + const buffer1: Buffer = Buffer.from("test"); + const buffer2: Buffer = Buffer.from(buffer1); + assertEquals(buffer2.length, 4, "Buffer length should be 4"); assertEquals( - buffer.toString(), + buffer2.toString(), "test", "Buffer to string should recover the string", ); + buffer1[0] = 114; + assertEquals(buffer2.toString(), "test", "Buffer should be a copy"); }, });