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", () => {