From 4fba02c7e99758da1773069dca2afaa7f2e9cd31 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 7 Sep 2011 16:39:08 -0700 Subject: [PATCH] Invoke upcall_fail This allows landing pads to be generated around fail statements Issue #236 --- src/comp/middle/trans.rs | 19 +++++++++++++++---- src/test/run-fail/unwind-fail.rs | 6 ++++++ 2 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 src/test/run-fail/unwind-fail.rs diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index aa82e03d57b..a78b452a4bd 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -3794,14 +3794,25 @@ fn trans_call(in_cx: &@block_ctxt, f: &@ast::expr, ret rslt(bcx, retval); } +fn invoke(bcx: &@block_ctxt, llfn: ValueRef, + llargs: &[ValueRef]) -> result { + ret invoke_(bcx, llfn, llargs, Invoke); +} + fn invoke_fastcall(bcx: &@block_ctxt, llfn: ValueRef, llargs: &[ValueRef]) -> result { + ret invoke_(bcx, llfn, llargs, FastInvoke); +} +fn invoke_(bcx: &@block_ctxt, llfn: ValueRef, + llargs: &[ValueRef], + invoker: fn(&@block_ctxt, ValueRef, &[ValueRef], + BasicBlockRef, BasicBlockRef) -> ValueRef) -> result { let normal_bcx = new_sub_block_ctxt(bcx, "normal return"); let unwind_bcx = new_sub_block_ctxt(bcx, "unwind"); - let retval = FastInvoke(bcx, llfn, llargs, - normal_bcx.llbb, - unwind_bcx.llbb); + let retval = invoker(bcx, llfn, llargs, + normal_bcx.llbb, + unwind_bcx.llbb); trans_landing_pad(unwind_bcx); ret rslt(normal_bcx, retval); } @@ -4291,7 +4302,7 @@ fn trans_fail_value(cx: &@block_ctxt, sp_opt: &option::t, let V_str = PointerCast(cx, V_fail_str, T_ptr(T_i8())); V_filename = PointerCast(cx, V_filename, T_ptr(T_i8())); let args = [cx.fcx.lltaskptr, V_str, V_filename, C_int(V_line)]; - Call(cx, bcx_ccx(cx).upcalls._fail, args); + let cx = invoke(cx, bcx_ccx(cx).upcalls._fail, args).bcx; Unreachable(cx); ret rslt(cx, C_nil()); } diff --git a/src/test/run-fail/unwind-fail.rs b/src/test/run-fail/unwind-fail.rs new file mode 100644 index 00000000000..2d4f138e715 --- /dev/null +++ b/src/test/run-fail/unwind-fail.rs @@ -0,0 +1,6 @@ +// error-pattern:fail + +fn main() { + @0; + fail; +} \ No newline at end of file -- GitLab