Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 14 additions & 12 deletions stdlib/REPL/src/REPL.jl
Original file line number Diff line number Diff line change
Expand Up @@ -452,8 +452,8 @@ function repl_backend_loop(backend::REPLBackend, get_module::Function)
try
ret = f()
put!(backend.response_channel, Pair{Any, Bool}(ret, false))
catch err
put!(backend.response_channel, Pair{Any, Bool}(err, true))
catch
put!(backend.response_channel, Pair{Any, Bool}(current_exceptions(), true))
end
else
ast = ast_or_func
Expand Down Expand Up @@ -594,11 +594,11 @@ function print_response(errio::IO, response, backend::Union{REPLBackendRef,Nothi
if val !== nothing && show_value
val2, iserr = if specialdisplay === nothing
# display calls may require being run on the main thread
eval_with_backend(backend) do
call_on_backend(backend) do
Base.invokelatest(display, val)
end
else
eval_with_backend(backend) do
call_on_backend(backend) do
Base.invokelatest(display, specialdisplay, val)
end
end
Expand Down Expand Up @@ -715,7 +715,7 @@ function run_frontend(repl::BasicREPL, backend::REPLBackendRef)
(isa(ast,Expr) && ast.head === :incomplete) || break
end
if !isempty(line)
response = eval_with_backend(ast, backend)
response = eval_on_backend(ast, backend)
print_response(repl, response, !ends_with_semicolon(line), false)
end
write(repl.terminal, '\n')
Expand Down Expand Up @@ -1166,21 +1166,23 @@ find_hist_file() = get(ENV, "JULIA_HISTORY",
backend(r::AbstractREPL) = hasproperty(r, :backendref) ? r.backendref : nothing


function eval_with_backend(ast::Expr, backend::REPLBackendRef)
function eval_on_backend(ast, backend::REPLBackendRef)
put!(backend.repl_channel, (ast, 1)) # (f, show_value)
return take!(backend.response_channel) # (val, iserr)
end
function eval_with_backend(f, backend::REPLBackendRef)
function call_on_backend(f, backend::REPLBackendRef)
applicable(f) || error("internal error: f is not callable")
put!(backend.repl_channel, (f, 2)) # (f, show_value) 2 indicates function (rather than ast)
return take!(backend.response_channel) # (val, iserr)
end
# if no backend just eval (used by tests)
function eval_with_backend(f, backend::Nothing)
eval_on_backend(ast, backend::Nothing) = error("no backend for eval ast")
function call_on_backend(f, backend::Nothing)
try
ret = f()
return (ret, false) # (val, iserr)
catch err
return (err, true)
catch
return (current_exceptions(), true)
end
end

Expand All @@ -1196,7 +1198,7 @@ function respond(f, repl, main; pass_empty::Bool = false, suppress_on_semicolon:
local response
try
ast = Base.invokelatest(f, line)
response = eval_with_backend(ast, backend(repl))
response = eval_on_backend(ast, backend(repl))
catch
response = Pair{Any, Bool}(current_exceptions(), true)
end
Expand Down Expand Up @@ -1803,7 +1805,7 @@ function run_frontend(repl::StreamREPL, backend::REPLBackendRef)
if have_color
print(repl.stream, Base.color_normal)
end
response = eval_with_backend(ast, backend)
response = eval_on_backend(ast, backend)
print_response(repl, response, !ends_with_semicolon(line), have_color)
end
end
Expand Down