From dfd4b01a976fcdb093af64eec947d19becf9f4cc Mon Sep 17 00:00:00 2001 From: Hanaasagi Date: Thu, 7 Dec 2023 16:41:31 +0800 Subject: [PATCH] fix(jest): fix segfault when passing jest.fn into another jest.fn (#7507) Close: #5900 --- src/bun.js/bindings/JSMockFunction.cpp | 2 ++ test/js/bun/test/mock-fn.test.js | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/bun.js/bindings/JSMockFunction.cpp b/src/bun.js/bindings/JSMockFunction.cpp index e9c9c1f1e1..40a8c97b31 100644 --- a/src/bun.js/bindings/JSMockFunction.cpp +++ b/src/bun.js/bindings/JSMockFunction.cpp @@ -280,6 +280,8 @@ public: if (lengthJSValue.isNumber()) { this->putDirect(vm, vm.propertyNames->length, (lengthJSValue), JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::ReadOnly); } + } else if (auto* fn = jsDynamicCast(value)) { + nameToUse = fn->get(global, vm.propertyNames->name).toWTFString(global); } else if (auto* fn = jsDynamicCast(value)) { nameToUse = fn->name(); } else { diff --git a/test/js/bun/test/mock-fn.test.js b/test/js/bun/test/mock-fn.test.js index cb9e1140a1..6a700eb385 100644 --- a/test/js/bun/test/mock-fn.test.js +++ b/test/js/bun/test/mock-fn.test.js @@ -620,6 +620,21 @@ describe("mock()", () => { expect(fn).toHaveBeenNthCalledWith(5, 1, undefined); expect(fn).not.toHaveBeenNthCalledWith(5, 1); }); + + it("no segmentation fault when passing jest.fn into another jest.fn, issue#5900", () => { + function foo() { + return true; + } + + function bar(fn = jest.fn(foo)) { + expect(fn.getMockName()).toBe("foo"); + let newFn = jest.fn(fn); + expect(newFn.getMockName()).toBe("foo"); + return newFn; + } + + expect(bar()()).toBe(true); + }); }); describe("spyOn", () => {