readline: fix calling constructor without new
authorAlex Kocharin <alex@kocharin.ru>
Thu, 9 Apr 2015 15:55:26 +0000 (18:55 +0300)
committerBen Noordhuis <info@bnoordhuis.nl>
Fri, 10 Apr 2015 08:56:19 +0000 (10:56 +0200)
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: https://github.com/iojs/io.js/pull/1385
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
lib/readline.js
test/parallel/test-readline-interface.js

index 63a7aa8..a684501 100644 (file)
@@ -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;
index ae8a418..69eb4bf 100644 (file)
@@ -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();