From bdccbbc8285acb60e34e5186c69cef100a4ee59e Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Tue, 11 Feb 2025 18:10:43 -0800 Subject: [PATCH] node: fix Buffer.from(arrayBuffer) (#17267) --- src/codegen/generate-classes.ts | 2 +- test/js/node/buffer.test.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/codegen/generate-classes.ts b/src/codegen/generate-classes.ts index 8d8f01be84..844a64c4c5 100644 --- a/src/codegen/generate-classes.ts +++ b/src/codegen/generate-classes.ts @@ -2281,7 +2281,7 @@ JSC_DEFINE_HOST_FUNCTION(Zig::jsFunctionInherits, (JSC::JSGlobalObject * globalO switch (id) { ${jsclasses .map(v => v[0]) - .map((v, i) => ` case ${i}: return JSValue::encode(jsBoolean(cell->inherits()));`) + .map((v, i) => ` case ${i}: return JSValue::encode(jsBoolean(jsDynamicCast(cell) != nullptr));`) .join("\n")} } return JSValue::encode(jsBoolean(false)); diff --git a/test/js/node/buffer.test.js b/test/js/node/buffer.test.js index b19ae42cf2..8d5b2c27b3 100644 --- a/test/js/node/buffer.test.js +++ b/test/js/node/buffer.test.js @@ -2980,3 +2980,31 @@ it("should not trim utf-8 start bytes at end of string", () => { const buf2 = Buffer.from("36e1", "hex"); expect(buf2.toString("utf-8")).toEqual("6\uFFFD"); }); + +it("Buffer.from(arrayBuffer)", () => { + const ab = Buffer.from([10, 11, 12, 13, 14, 15, 16, 17, 18, 19]).buffer; + const buf = Buffer.from(ab); + expect(buf.length).toBe(10); + expect(buf.buffer).toBe(ab); + expect(buf.byteOffset).toBe(0); + expect(buf.byteLength).toBe(10); + expect(buf[Symbol.iterator]().toArray()).toEqual([10, 11, 12, 13, 14, 15, 16, 17, 18, 19]); +}); +it("Buffer.from(arrayBuffer, byteOffset)", () => { + const ab = Buffer.from([10, 11, 12, 13, 14, 15, 16, 17, 18, 19]).buffer; + const buf = Buffer.from(ab, 2); + expect(buf.length).toBe(8); + expect(buf.buffer).toBe(ab); + expect(buf.byteOffset).toBe(2); + expect(buf.byteLength).toBe(8); + expect(buf[Symbol.iterator]().toArray()).toEqual([12, 13, 14, 15, 16, 17, 18, 19]); +}); +it("Buffer.from(arrayBuffer, byteOffset, length)", () => { + const ab = Buffer.from([10, 11, 12, 13, 14, 15, 16, 17, 18, 19]).buffer; + const buf = Buffer.from(ab, 3, 5); + expect(buf.length).toBe(5); + expect(buf.buffer).toBe(ab); + expect(buf.byteOffset).toBe(3); + expect(buf.byteLength).toBe(5); + expect(buf[Symbol.iterator]().toArray()).toEqual([13, 14, 15, 16, 17]); +});