summaryrefslogtreecommitdiff
path: root/cli/rt
diff options
context:
space:
mode:
Diffstat (limited to 'cli/rt')
-rw-r--r--cli/rt/40_repl.js15
1 files changed, 14 insertions, 1 deletions
diff --git a/cli/rt/40_repl.js b/cli/rt/40_repl.js
index 650fb7fc8..a249b578d 100644
--- a/cli/rt/40_repl.js
+++ b/cli/rt/40_repl.js
@@ -52,10 +52,21 @@
// Evaluate code.
// Returns true if code is consumed (no error/irrecoverable error).
// Returns false if error is recoverable
- function evaluate(code) {
+ function evaluate(code, preprocess = true) {
+ const rawCode = code;
+ if (preprocess) {
+ // It is a bit unexpected that { "foo": "bar" } is interpreted as a block
+ // statement rather than an object literal so we interpret it as an expression statement
+ // to match the behavior found in a typical prompt including browser developer tools.
+ if (code.trimLeft().startsWith("{") && !code.trimRight().endsWith(";")) {
+ code = `(${code})`;
+ }
+ }
+
// each evalContext is a separate function body, and we want strict mode to
// work, so we should ensure that the code starts with "use strict"
const [result, errInfo] = core.evalContext(`"use strict";\n\n${code}`);
+
if (!errInfo) {
// when a function is eval'ed with just "use strict" sometimes the result
// is "use strict" which should be discarded
@@ -65,6 +76,8 @@
if (!isCloseCalled()) {
replLog("%o", lastEvalResult);
}
+ } else if (errInfo.isCompileError && code.length != rawCode.length) {
+ return evaluate(rawCode, false);
} else if (errInfo.isCompileError && isRecoverableError(errInfo.thrown)) {
// Recoverable compiler error
return false; // don't consume code.