Permalink
Browse files

repl: preprocess only for defaultEval

Code preprocessing is applicable only for default
eval function. Therefore, Moved `preprocess` function
invocation inside `defaultEval` function.

Fixes: #9743
PR-URL: #9752
Reviewed-By: Anna Henningsen <anna@addaleax.net>
  • Loading branch information...
princejwesley authored and Fishrock123 committed Nov 22, 2016
1 parent 0c745e3 commit 6087e361e5cf8b73bf2503d8e6555f8d8f27085b
Showing with 35 additions and 26 deletions.
  1. +27 −24 lib/repl.js
  2. +8 −2 test/parallel/test-repl-eval.js
View
@@ -238,7 +238,33 @@ function REPLServer(prompt,
eval_ = eval_ || defaultEval;
function preprocess(code) {
let cmd = code;
if (/^\s*\{/.test(cmd) && /\}\s*$/.test(cmd)) {
// It's confusing for `{ a : 1 }` to be interpreted as a block
// statement rather than an object literal. So, we first try
// to wrap it in parentheses, so that it will be interpreted as
// an expression.
cmd = `(${cmd})`;
self.wrappedCmd = true;
} else {
// Mitigate https://github.com/nodejs/node/issues/548
cmd = cmd.replace(
/^\s*function(?:\s*(\*)\s*|\s+)([^(]+)/,
(_, genStar, name) => `var ${name} = function ${genStar || ''}${name}`
);
}
// Append a \n so that it will be either
// terminated, or continued onto the next expression if it's an
// unexpected end of input.
return `${cmd}\n`;
}
function defaultEval(code, context, file, cb) {
// Remove trailing new line
code = code.replace(/\n$/, '');
code = preprocess(code);
var err, result, retry = false, input = code, wrappedErr;
// first, create the Script object to check the syntax
@@ -506,8 +532,7 @@ function REPLServer(prompt,
}
}
var evalCmd = self.bufferedCommand + cmd;
evalCmd = preprocess(evalCmd);
const evalCmd = self.bufferedCommand + cmd + '\n';
debug('eval %j', evalCmd);
self.eval(evalCmd, self.context, 'repl', finish);
@@ -564,28 +589,6 @@ function REPLServer(prompt,
// Display prompt again
self.displayPrompt();
}
function preprocess(code) {
let cmd = code;
if (/^\s*\{/.test(cmd) && /\}\s*$/.test(cmd)) {
// It's confusing for `{ a : 1 }` to be interpreted as a block
// statement rather than an object literal. So, we first try
// to wrap it in parentheses, so that it will be interpreted as
// an expression.
cmd = `(${cmd})`;
self.wrappedCmd = true;
} else {
// Mitigate https://github.com/nodejs/node/issues/548
cmd = cmd.replace(
/^\s*function(?:\s*(\*)\s*|\s+)([^(]+)/,
(_, genStar, name) => `var ${name} = function ${genStar || ''}${name}`
);
}
// Append a \n so that it will be either
// terminated, or continued onto the next expression if it's an
// unexpected end of input.
return `${cmd}\n`;
}
});
self.on('SIGCONT', function onSigCont() {
@@ -10,15 +10,21 @@ const repl = require('repl');
eval: common.mustCall((cmd, context) => {
// Assertions here will not cause the test to exit with an error code
// so set a boolean that is checked in process.on('exit',...) instead.
evalCalledWithExpectedArgs = (cmd === 'foo\n' && context.foo === 'bar');
evalCalledWithExpectedArgs = (cmd === 'function f() {}\n' &&
context.foo === 'bar');
})
};
const r = repl.start(options);
r.context = {foo: 'bar'};
try {
r.write('foo\n');
// Default preprocessor transforms
// function f() {} to
// var f = function f() {}
// Test to ensure that original input is preserved.
// Reference: https://github.com/nodejs/node/issues/9743
r.write('function f() {}\n');
} finally {
r.write('.exit\n');
}

0 comments on commit 6087e36

Please sign in to comment.