From eaea08ea454929c9e84e5e0b9294ea3cff4e5a7e Mon Sep 17 00:00:00 2001 From: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> Date: Sun, 22 Jan 2023 19:53:59 -0800 Subject: [PATCH] Add one gc test for eventemitter --- test/bun.js/event-emitter.test.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/test/bun.js/event-emitter.test.ts b/test/bun.js/event-emitter.test.ts index 1752af1f58..4e586cea46 100644 --- a/test/bun.js/event-emitter.test.ts +++ b/test/bun.js/event-emitter.test.ts @@ -7,6 +7,7 @@ import EventEmitter, { getEventListeners, captureRejectionSymbol, } from "node:events"; +import { heapStats } from "bun:jsc"; describe("EventEmitter", () => { it("captureRejectionSymbol", () => { @@ -147,3 +148,32 @@ test("EventEmitter.off", () => { var myEmitter = new EventEmitter(); expect(myEmitter.off("foo", () => {})).toBe(myEmitter); }); + +// Internally, EventEmitter has a JSC::Weak with the thisValue of the listener +test("EventEmitter GCs", () => { + Bun.gc(true); + + const startCount = heapStats().objectTypeCounts["EventEmitter"] || 0; + (function () { + Bun.gc(true); + + function EventEmitterSubclass() { + EventEmitter.call(this); + } + + Object.setPrototypeOf( + EventEmitterSubclass.prototype, + EventEmitter.prototype, + ); + Object.setPrototypeOf(EventEmitterSubclass, EventEmitter); + + var myEmitter = new EventEmitterSubclass(); + myEmitter.on("foo", () => {}); + myEmitter.emit("foo"); + Bun.gc(true); + })(); + Bun.gc(true); + + const endCount = heapStats().objectTypeCounts["EventEmitter"] || 0; + expect(endCount).toBe(startCount); +});