From 28af3b350bb2f6ab427e55e8cadbe539a5ef5a5e Mon Sep 17 00:00:00 2001 From: Kristoffer Carlsson Date: Mon, 4 Mar 2019 20:01:10 +0100 Subject: [PATCH] only break if we are throwing an uncaught exception (#89) --- src/interpret.jl | 10 ++++++---- test/breakpoints.jl | 29 +++++++++++++++++++---------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/interpret.jl b/src/interpret.jl index 8d317da2266c8d..f59f6e6fa9bc78 100644 --- a/src/interpret.jl +++ b/src/interpret.jl @@ -486,6 +486,11 @@ function step_expr!(stack, frame, istoplevel::Bool=false) end function handle_err(stack, frame, pc, err) + if !isempty(frame.exception_frames) + # Exception caught + frame.last_exception[] = err + return JuliaProgramCounter(frame.exception_frames[end]) + end if break_on_error[] frame.pc[] = pc push!(stack, frame) @@ -499,12 +504,9 @@ function handle_err(stack, frame, pc, err) hasmethod(err.f, arg_types) && !hasmethod(err.f, arg_types, world = err.world)) @warn "likely failure to return to toplevel, try JuliaInterpreter.split_expressions" - rethrow(err) end end - isempty(frame.exception_frames) && rethrow(err) - frame.last_exception[] = err - return JuliaProgramCounter(frame.exception_frames[end]) + rethrow(err) end """ diff --git a/test/breakpoints.jl b/test/breakpoints.jl index 3aef22c9ee75ed..80b288cdd040bf 100644 --- a/test/breakpoints.jl +++ b/test/breakpoints.jl @@ -84,14 +84,23 @@ end remove() # break on error - inner(x) = error("oops") - outer() = inner(1) - JuliaInterpreter.break_on_error[] = true - stack = JuliaStackFrame[] - frame = JuliaInterpreter.enter_call(outer) - bp = JuliaInterpreter.finish_and_return!(stack, frame) - @test bp.err == ErrorException("oops") - @test length(stack) >= 2 - @test stack[1].code.scope.name == :outer - @test stack[2].code.scope.name == :inner + try + JuliaInterpreter.break_on_error[] = true + + inner(x) = error("oops") + outer() = inner(1) + stack = JuliaStackFrame[] + frame = JuliaInterpreter.enter_call(outer) + bp = JuliaInterpreter.finish_and_return!(stack, frame) + @test bp.err == ErrorException("oops") + @test length(stack) >= 2 + @test stack[1].code.scope.name == :outer + @test stack[2].code.scope.name == :inner + + f_catch() = try error(); catch; return 2; end + @test @interpret f_catch() == 2 + + finally + JuliaInterpreter.break_on_error[] = false + end end