Skip to content

Commit

Permalink
readline: fix calling constructor without new
Browse files Browse the repository at this point in the history
Previously, we detected options object based on amount of arguments
supplied. But if we're calling readline without new operator,
constructor gets re-called and will always have 4 arguments.
  • Loading branch information
rlidwka committed Apr 9, 2015
1 parent 7049d7b commit acfbada
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 1 deletion.
5 changes: 4 additions & 1 deletion lib/readline.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,10 @@ exports.createInterface = function(input, output, completer, terminal) {

function Interface(input, output, completer, terminal) {
if (!(this instanceof Interface)) {
return new Interface(input, output, completer, terminal);
// call the constructor preserving original number of arguments
const self = Object.create(Interface.prototype);
Interface.apply(self, arguments);
return self;
}

this._sawReturn = false;
Expand Down
12 changes: 12 additions & 0 deletions test/parallel/test-readline-interface.js
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,18 @@ function isWarned(emitter) {
fi.emit('data', ''); // removes listener
});

// calling readline without `new`
fi = new FakeInput();
rli = readline.Interface({ input: fi, output: fi, terminal: terminal });
called = false;
rli.on('line', function(line) {
called = true;
assert.equal(line, 'asdf');
});
fi.emit('data', 'asdf\n');
assert.ok(called);
rli.close();

if (terminal) {
// question
fi = new FakeInput();
Expand Down

0 comments on commit acfbada

Please sign in to comment.