Summary
Current node-suite/domain/members-emitter-errors segfaults in Perry when a domain-owned EventEmitter emits error. Node routes the emitter error through the domain error handler and returns false from emit().
Repro
import domain from "node:domain";
import { EventEmitter } from "node:events";
const d = domain.create();
const ee = new EventEmitter();
d.on("error", (err: any) => {
console.log("domain error:", err.message, err.domain === d, err.domainThrown, typeof err.domainBound, err.domainEmitter === ee);
});
d.add(ee);
console.log("members after add:", d.members.includes(ee), ee.domain === d, d.members.length);
console.log("emit returned:", ee.emit("error", new Error("emitter boom")));
d.remove(ee);
console.log("members after remove:", d.members.includes(ee), ee.domain, d.members.length);
Current behavior
Node v26.3.0:
members after add: true true 1
domain error: emitter boom true false undefined true
emit returned: false
members after remove: false null 0
Perry on current-main scan baseline 460fc3d6a:
Segmentation fault (core dumped)
exit=139
Focused parity output:
node-suite/domain/members-emitter-errors (output mismatch)
Perry: Segmentation fault (core dumped)
Suggested scope
Fix only node:domain membership and EventEmitter error routing for domain-owned emitters: domain.add(emitter), emitter.domain, domain error metadata (domain, domainEmitter, domainThrown, domainBound), emit("error", err) return value, and domain.remove(emitter).
Non-goals: broader domain async context semantics, unrelated EventEmitter behavior, and process-level uncaught exception handling beyond this fixture.
Summary
Current
node-suite/domain/members-emitter-errorssegfaults in Perry when a domain-ownedEventEmitteremitserror. Node routes the emitter error through the domain error handler and returnsfalsefromemit().Repro
Current behavior
Node v26.3.0:
Perry on current-main scan baseline
460fc3d6a:Focused parity output:
Suggested scope
Fix only
node:domainmembership andEventEmittererror routing for domain-owned emitters:domain.add(emitter),emitter.domain, domain error metadata (domain,domainEmitter,domainThrown,domainBound),emit("error", err)return value, anddomain.remove(emitter).Non-goals: broader domain async context semantics, unrelated EventEmitter behavior, and process-level uncaught exception handling beyond this fixture.