GeezerVison is showing github.com — stream: pre-allocate _events · nodejs/node@dd52068
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: lib/events.js +12-2Lines changed: 12 additions & 2 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -86,6 +86,7 @@ const { | 86 | 86 |
| 87 | 87 | const kCapture = Symbol('kCapture'); | 88 | 88 | const kErrorMonitor = Symbol('events.errorMonitor'); | | 89 | +const kShapeMode = Symbol('shapeMode'); | 89 | 90 | const kMaxEventTargetListeners = Symbol('events.maxEventTargetListeners'); | 90 | 91 | const kMaxEventTargetListenersWarned = | 91 | 92 | Symbol('events.maxEventTargetListenersWarned'); | @@ -343,6 +344,9 @@ EventEmitter.init = function(opts) { | 343 | 344 | this._events === ObjectGetPrototypeOf(this)._events) { | 344 | 345 | this._events = { __proto__: null }; | 345 | 346 | this._eventsCount = 0; | | 347 | + this[kShapeMode] = false; | | 348 | + } else { | | 349 | + this[kShapeMode] = true; | 346 | 350 | } | 347 | 351 |
| 348 | 352 | this._maxListeners = this._maxListeners || undefined; | @@ -685,9 +689,13 @@ EventEmitter.prototype.removeListener = | 685 | 689 | return this; | 686 | 690 |
| 687 | 691 | if (list === listener || list.listener === listener) { | 688 | | - if (--this._eventsCount === 0) | | 692 | + this._eventsCount -= 1; | | 693 | + | | 694 | + if (this[kShapeMode]) { | | 695 | + events[type] = undefined; | | 696 | + } else if (this._eventsCount === 0) { | 689 | 697 | this._events = { __proto__: null }; | 690 | | - else { | | 698 | + } else { | 691 | 699 | delete events[type]; | 692 | 700 | if (events.removeListener) | 693 | 701 | this.emit('removeListener', type, list.listener || listener); | @@ -749,6 +757,7 @@ EventEmitter.prototype.removeAllListeners = | 749 | 757 | else | 750 | 758 | delete events[type]; | 751 | 759 | } | | 760 | + this[kShapeMode] = false; | 752 | 761 | return this; | 753 | 762 | } | 754 | 763 |
| @@ -761,6 +770,7 @@ EventEmitter.prototype.removeAllListeners = | 761 | 770 | this.removeAllListeners('removeListener'); | 762 | 771 | this._events = { __proto__: null }; | 763 | 772 | this._eventsCount = 0; | | 773 | + this[kShapeMode] = false; | 764 | 774 | return this; | 765 | 775 | } | 766 | 776 |
| |
Collapse file Copy file name to clipboardExpand all lines: lib/internal/streams/duplex.js +18Lines changed: 18 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -63,6 +63,24 @@ function Duplex(options) { | 63 | 63 | if (!(this instanceof Duplex)) | 64 | 64 | return new Duplex(options); | 65 | 65 |
| | 66 | + this._events ??= { | | 67 | + close: undefined, | | 68 | + error: undefined, | | 69 | + prefinish: undefined, | | 70 | + finish: undefined, | | 71 | + drain: undefined, | | 72 | + data: undefined, | | 73 | + end: undefined, | | 74 | + readable: undefined, | | 75 | + // Skip uncommon events... | | 76 | + // pause: undefined, | | 77 | + // resume: undefined, | | 78 | + // pipe: undefined, | | 79 | + // unpipe: undefined, | | 80 | + // [destroyImpl.kConstruct]: undefined, | | 81 | + // [destroyImpl.kDestroy]: undefined, | | 82 | + }; | | 83 | + | 66 | 84 | this._readableState = new Readable.ReadableState(options, this, true); | 67 | 85 | this._writableState = new Writable.WritableState(options, this, true); | 68 | 86 |
| |
Collapse file Copy file name to clipboardExpand all lines: lib/internal/streams/readable.js +15Lines changed: 15 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -319,6 +319,21 @@ function Readable(options) { | 319 | 319 | if (!(this instanceof Readable)) | 320 | 320 | return new Readable(options); | 321 | 321 |
| | 322 | + this._events ??= { | | 323 | + close: undefined, | | 324 | + error: undefined, | | 325 | + data: undefined, | | 326 | + end: undefined, | | 327 | + readable: undefined, | | 328 | + // Skip uncommon events... | | 329 | + // pause: undefined, | | 330 | + // resume: undefined, | | 331 | + // pipe: undefined, | | 332 | + // unpipe: undefined, | | 333 | + // [destroyImpl.kConstruct]: undefined, | | 334 | + // [destroyImpl.kDestroy]: undefined, | | 335 | + }; | | 336 | + | 322 | 337 | this._readableState = new ReadableState(options, this, false); | 323 | 338 |
| 324 | 339 | if (options) { | |
Collapse file Copy file name to clipboardExpand all lines: lib/internal/streams/writable.js +11Lines changed: 11 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -385,6 +385,17 @@ function Writable(options) { | 385 | 385 | if (!(this instanceof Writable)) | 386 | 386 | return new Writable(options); | 387 | 387 |
| | 388 | + this._events ??= { | | 389 | + close: undefined, | | 390 | + error: undefined, | | 391 | + prefinish: undefined, | | 392 | + finish: undefined, | | 393 | + drain: undefined, | | 394 | + // Skip uncommon events... | | 395 | + // [destroyImpl.kConstruct]: undefined, | | 396 | + // [destroyImpl.kDestroy]: undefined, | | 397 | + }; | | 398 | + | 388 | 399 | this._writableState = new WritableState(options, this, false); | 389 | 400 |
| 390 | 401 | if (options) { | |
Collapse file Copy file name to clipboardExpand all lines: test/parallel/test-readline-interface.js +1-1Lines changed: 1 addition & 1 deletion | Original file line number | Diff line number | Diff line change |
|---|
@@ -44,7 +44,7 @@ class FakeInput extends EventEmitter { | 44 | 44 | function isWarned(emitter) { | 45 | 45 | for (const name in emitter) { | 46 | 46 | const listeners = emitter[name]; | 47 | | - if (listeners.warned) return true; | | 47 | + if (listeners && listeners.warned) return true; | 48 | 48 | } | 49 | 49 | return false; | 50 | 50 | } | |
Collapse file Copy file name to clipboardExpand all lines: test/parallel/test-readline-promises-interface.js +1-1Lines changed: 1 addition & 1 deletion | Original file line number | Diff line number | Diff line change |
|---|
@@ -22,7 +22,7 @@ class FakeInput extends EventEmitter { | 22 | 22 | function isWarned(emitter) { | 23 | 23 | for (const name in emitter) { | 24 | 24 | const listeners = emitter[name]; | 25 | | - if (listeners.warned) return true; | | 25 | + if (listeners && listeners.warned) return true; | 26 | 26 | } | 27 | 27 | return false; | 28 | 28 | } | |
|