diff options
| author | Brian Anderson <banderson@mozilla.com> | 2011-09-07 16:39:08 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2011-09-11 17:31:38 -0700 |
| commit | 4fba02c7e99758da1773069dca2afaa7f2e9cd31 (patch) | |
| tree | d3a082d0fc8e2989439714c96cd17abb34447e28 /src/comp | |
| parent | 4c9eee8aa42891ac2a165eb3bbae9c16e4ee438d (diff) | |
| download | rust-4fba02c7e99758da1773069dca2afaa7f2e9cd31.tar.gz rust-4fba02c7e99758da1773069dca2afaa7f2e9cd31.zip | |
Invoke upcall_fail
This allows landing pads to be generated around fail statements Issue #236
Diffstat (limited to 'src/comp')
| -rw-r--r-- | src/comp/middle/trans.rs | 19 |
1 files changed, 15 insertions, 4 deletions
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<span>, 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()); } |
