Skip to content

Commit 7293910

Browse files
committed
fixuP
1 parent 321c41c commit 7293910

File tree

4 files changed

+37
-7
lines changed

4 files changed

+37
-7
lines changed

lib/events.js

+31-7
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ const {
8787

8888
const kCapture = Symbol('kCapture');
8989
const kErrorMonitor = Symbol('events.errorMonitor');
90+
const kShapeMode = Symbol('shapeMode');
9091
const kMaxEventTargetListeners = Symbol('events.maxEventTargetListeners');
9192
const kMaxEventTargetListenersWarned =
9293
Symbol('events.maxEventTargetListenersWarned');
@@ -344,6 +345,9 @@ EventEmitter.init = function(opts) {
344345
this._events === ObjectGetPrototypeOf(this)._events) {
345346
this._events = { __proto__: null };
346347
this._eventsCount = 0;
348+
this[kShapeMode] = false;
349+
} else {
350+
this[kShapeMode] = true;
347351
}
348352

349353
this._maxListeners = this._maxListeners || undefined;
@@ -686,10 +690,18 @@ EventEmitter.prototype.removeListener =
686690
return this;
687691

688692
if (list === listener || list.listener === listener) {
689-
if (--this._eventsCount === 0)
690-
this._events = { __proto__: null };
691-
else {
692-
delete events[type];
693+
if (--this._eventsCount === 0) {
694+
if (this[kShapeMode]) {
695+
events[type] = undefined;
696+
} else {
697+
this._events = { __proto__: null };
698+
}
699+
} else {
700+
if (this[kShapeMode]) {
701+
events[type] = undefined;
702+
} else {
703+
delete events[type];
704+
}
693705
if (events.removeListener)
694706
this.emit('removeListener', type, list.listener || listener);
695707
}
@@ -741,7 +753,12 @@ EventEmitter.prototype.removeAllListeners =
741753

742754
// Not listening for removeListener, no need to emit
743755
if (events.removeListener === undefined) {
744-
if (arguments.length === 0) {
756+
if (this[kShapeMode]) {
757+
for (const key of Object.keys(this._events)) {
758+
this._events[key] = undefined;
759+
}
760+
this._eventsCount = 0;
761+
} else if (arguments.length === 0) {
745762
this._events = { __proto__: null };
746763
this._eventsCount = 0;
747764
} else if (events[type] !== undefined) {
@@ -760,8 +777,15 @@ EventEmitter.prototype.removeAllListeners =
760777
this.removeAllListeners(key);
761778
}
762779
this.removeAllListeners('removeListener');
763-
this._events = { __proto__: null };
764-
this._eventsCount = 0;
780+
if (this[kShapeMode]) {
781+
for (const key of Object.keys(this._events)) {
782+
this._events[key] = undefined;
783+
}
784+
this._eventsCount = 0;
785+
} else {
786+
this._events = { __proto__: null };
787+
this._eventsCount = 0;
788+
}
765789
return this;
766790
}
767791

lib/internal/streams/duplex.js

+2
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ function Duplex(options) {
7676
readable: undefined,
7777
pipe: undefined,
7878
unpipe: undefined,
79+
[destroyImpl.kConstruct]: undefined,
80+
[destroyImpl.kDestroy]: undefined,
7981
};
8082

8183
this._readableState = new Readable.ReadableState(options, this, true);

lib/internal/streams/readable.js

+2
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,8 @@ function Readable(options) {
326326
readable: undefined,
327327
pipe: undefined,
328328
unpipe: undefined,
329+
[destroyImpl.kConstruct]: undefined,
330+
[destroyImpl.kDestroy]: undefined,
329331
};
330332

331333
this._readableState = new ReadableState(options, this, false);

lib/internal/streams/writable.js

+2
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,8 @@ function Writable(options) {
388388
prefinish: undefined,
389389
finish: undefined,
390390
drain: undefined,
391+
[destroyImpl.kConstruct]: undefined,
392+
[destroyImpl.kDestroy]: undefined,
391393
};
392394

393395
this._writableState = new WritableState(options, this, false);

0 commit comments

Comments
 (0)