diff --git a/lib/readline.js b/lib/readline.js index 1fa217ccdd7..19ef759fbb1 100644 --- a/lib/readline.js +++ b/lib/readline.js @@ -97,6 +97,13 @@ function Interface(input, output, completer, terminal) { self.close(); } + function ontermend() { + if (util.isString(self.line) && self.line.length > 0) { + self.emit('line', self.line); + } + self.close(); + } + function onkeypress(s, key) { self._ttyWrite(s, key); } @@ -121,11 +128,7 @@ function Interface(input, output, completer, terminal) { // input usually refers to stdin input.on('keypress', onkeypress); - input.on('end', function inputEnd() { - if (util.isString(self.line) && self.line.length > 0) - self.emit('line', self.line); - self.close(); - }); + input.on('end', ontermend); // Current line this.line = ''; @@ -142,6 +145,7 @@ function Interface(input, output, completer, terminal) { output.on('resize', onresize); self.once('close', function() { input.removeListener('keypress', onkeypress); + input.removeListener('end', ontermend); output.removeListener('resize', onresize); }); } diff --git a/test/simple/test-readline-interface.js b/test/simple/test-readline-interface.js index 930cf22d29e..abd3681134e 100644 --- a/test/simple/test-readline-interface.js +++ b/test/simple/test-readline-interface.js @@ -35,6 +35,14 @@ FakeInput.prototype.pause = function() {}; FakeInput.prototype.write = function() {}; FakeInput.prototype.end = function() {}; +function isWarned(emitter) { + for (var name in emitter) { + var listeners = emitter[name]; + if (listeners.warned) return true; + } + return false; +} + [ true, false ].forEach(function(terminal) { var fi; var rli; @@ -262,4 +270,17 @@ FakeInput.prototype.end = function() {}; assert.equal(readline.getStringWidth('> '), 2); assert.deepEqual(fi.listeners(terminal ? 'keypress' : 'data'), []); + + // check EventEmitter memory leak + for (var i=0; i<12; i++) { + var rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + }); + rl.close(); + assert.equal(isWarned(process.stdin._events), false); + assert.equal(isWarned(process.stdout._events), false); + } + }); +