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.

PR-URL: #1385
Reviewed-By: Ben Noordhuis <[email protected]>
  • Loading branch information
rlidwka authored and bnoordhuis committed Apr 10, 2015
1 parent 8bc8bd4 commit f0bf6bb
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 f0bf6bb

Please sign in to comment.