diff --git a/lib/repl.js b/lib/repl.js index aef0e9e2d3..c425603ef5 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -115,12 +115,17 @@ function REPLServer(prompt, stream) { // and statements e.g. // 'for (var i = 0; i < 10; i++) console.log(i);' - var ret; + var ret, success = false; try { // First we attempt to eval as expression with parens. // This catches '{a : 1}' properly. ret = vm.runInContext('(' + self.bufferedCommand + ')', context, 'repl'); + if (typeof ret !== 'function') success = true; } catch (e) { + success = false; + } + + if (!success) { // Now as statement without parens. ret = vm.runInContext(self.bufferedCommand, context, 'repl'); } diff --git a/test/simple/test-repl.js b/test/simple/test-repl.js index 22b41add01..de839f5635 100644 --- a/test/simple/test-repl.js +++ b/test/simple/test-repl.js @@ -97,7 +97,26 @@ function error_test() { // invalid input to JSON.parse error is special case of syntax error, // should throw { client: client_unix, send: 'JSON.parse(\'{invalid: \\\'json\\\'}\');', - expect: /^SyntaxError: Unexpected token ILLEGAL/ } + expect: /^SyntaxError: Unexpected token ILLEGAL/ }, + // Named functions can be used: + { client: client_unix, send: 'function blah() { return 1; }', + expect: prompt_unix }, + { client: client_unix, send: 'blah()', + expect: "1\n" + prompt_unix }, + // Multiline object + { client: client_unix, send: '{ a: ', + expect: prompt_multiline }, + { client: client_unix, send: '1 }', + expect: "{ a: 1 }" }, + // Multiline anonymous function with comment + { client: client_unix, send: '(function () {', + expect: prompt_multiline }, + { client: client_unix, send: '// blah', + expect: prompt_multiline }, + { client: client_unix, send: 'return 1;', + expect: prompt_multiline }, + { client: client_unix, send: '})()', + expect: "1" }, ]); }