fix: REPL does not exit properly when close() is called (#5451)

This commit is contained in:
uki00a 2020-05-20 02:33:11 +09:00 committed by GitHub
parent 1be7ec47ac
commit cdc9323ccc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 2 deletions

View file

@ -32,6 +32,13 @@ function isRecoverableError(e: Error): boolean {
return recoverableErrorMessages.includes(e.message);
}
// Returns `true` if `close()` is called in REPL.
// We should quit the REPL when this function returns `true`.
function isCloseCalled(): boolean {
// @ts-ignore
return globalThis.closed;
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
type Value = any;
@ -45,7 +52,9 @@ function evaluate(code: string): boolean {
const [result, errInfo] = core.evalContext(code);
if (!errInfo) {
lastEvalResult = result;
replLog(result);
if (!isCloseCalled()) {
replLog(result);
}
} else if (errInfo.isCompileError && isRecoverableError(errInfo.thrown)) {
// Recoverable compiler error
return false; // don't consume code.
@ -110,6 +119,10 @@ export async function replLoop(): Promise<void> {
replLog("exit using ctrl+d or close()");
while (true) {
if (isCloseCalled()) {
quitRepl(0);
}
let code = "";
// Top level read
try {

View file

@ -696,13 +696,15 @@ const REPL_MSG: &str = "exit using ctrl+d or close()\n";
#[test]
fn repl_test_close_command() {
let (_out, err) = util::run_and_collect_output(
let (out, err) = util::run_and_collect_output(
true,
"repl",
Some(vec!["close()", "'ignored'"]),
None,
false,
);
assert!(!out.contains("ignored"));
assert!(err.is_empty());
}