Skip to content

Commit

Permalink
repl: preprocess only for defaultEval
Browse files Browse the repository at this point in the history
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 MylesBorins committed Dec 21, 2016
1 parent 8abfeb4 commit aed2f35
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 26 deletions.
51 changes: 27 additions & 24 deletions lib/repl.js
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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() {
Expand Down
10 changes: 8 additions & 2 deletions test/parallel/test-repl-eval.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
}
Expand Down

0 comments on commit aed2f35

Please sign in to comment.