diff options
author | Hans Bolinder <hasse@erlang.org> | 2013-01-02 10:42:04 +0100 |
---|---|---|
committer | Hans Bolinder <hasse@erlang.org> | 2013-01-07 15:10:27 +0100 |
commit | 565578af186989161c6657cad375b6daf19d971a (patch) | |
tree | 73813dc6d3626bf7a6346187f60b919714d6d186 /lib/stdlib | |
parent | 4d4b3c710cf76d94c1545ffc530f00c11b9d6b7e (diff) | |
download | otp-565578af186989161c6657cad375b6daf19d971a.tar.gz otp-565578af186989161c6657cad375b6daf19d971a.tar.bz2 otp-565578af186989161c6657cad375b6daf19d971a.zip |
[stdlib] Improve the Erlang shell's handling of scanner errors
The Erlang shell now skips the rest of the line when
it encounters an Erlang scanner error.
Examples:
1> $\xtt.
* 1: illegal character
1> "$\xtt".
* 1: illegal character
1>
Diffstat (limited to 'lib/stdlib')
-rw-r--r-- | lib/stdlib/src/shell.erl | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/lib/stdlib/src/shell.erl b/lib/stdlib/src/shell.erl index 424650b8b3..688492d724 100644 --- a/lib/stdlib/src/shell.erl +++ b/lib/stdlib/src/shell.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2012. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -244,7 +244,7 @@ server_loop(N0, Eval_0, Bs00, RT, Ds00, History0, Results0) -> {Eval_1,Bs0,Ds0,Prompt} = prompt(N, Eval_0, Bs00, RT, Ds00), {Res,Eval0} = get_command(Prompt, Eval_1, Bs0, RT, Ds0), case Res of - {ok,Es0,_EndLine} -> + {ok,Es0} -> case expand_hist(Es0, N) of {ok,Es} -> {V,Eval,Bs,Ds} = shell_cmd(Es, Eval0, Bs0, RT, Ds0, cmd), @@ -266,7 +266,7 @@ server_loop(N0, Eval_0, Bs00, RT, Ds00, History0, Results0) -> fwrite_severity(benign, <<"~ts">>, [E]), server_loop(N0, Eval0, Bs0, RT, Ds0, History0, Results0) end; - {error,{Line,Mod,What},_EndLine} -> + {error,{Line,Mod,What}} -> fwrite_severity(benign, <<"~w: ~ts">>, [Line, Mod:format_error(What)]), server_loop(N0, Eval0, Bs0, RT, Ds0, History0, Results0); @@ -281,9 +281,6 @@ server_loop(N0, Eval_0, Bs00, RT, Ds00, History0, Results0) -> fwrite_severity(benign, <<"~w: Invalid tokens.">>, [N]), server_loop(N0, Eval0, Bs0, RT, Ds0, History0, Results0); - {eof,_EndLine} -> - fwrite_severity(fatal, <<"Terminating erlang (~w)">>, [node()]), - halt(); eof -> fwrite_severity(fatal, <<"Terminating erlang (~w)">>, [node()]), halt() @@ -292,7 +289,22 @@ server_loop(N0, Eval_0, Bs00, RT, Ds00, History0, Results0) -> get_command(Prompt, Eval, Bs, RT, Ds) -> Parse = fun() -> - exit(io:parse_erl_exprs(group_leader(), Prompt, 1, [unicode])) + exit( + case + io:scan_erl_exprs(group_leader(), Prompt, 1, [unicode]) + of + {ok,Toks,_EndPos} -> + erl_parse:parse_exprs(Toks); + {eof,_EndPos} -> + eof; + {error,ErrorInfo,_EndPos} -> + %% Skip the rest of the line: + _ = io:get_line(''), + {error,ErrorInfo}; + Else -> + Else + end + ) end, Pid = spawn_link(Parse), get_command1(Pid, Eval, Bs, RT, Ds). @@ -1469,6 +1481,7 @@ enc() -> garb(Shell) -> erlang:garbage_collect(Shell), catch erlang:garbage_collect(whereis(user)), + catch erlang:garbage_collect(whereis(group)), catch erlang:garbage_collect(group_leader()), erlang:garbage_collect(). |