about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-09-07 16:39:08 -0700
committerBrian Anderson <banderson@mozilla.com>2011-09-11 17:31:38 -0700
commit4fba02c7e99758da1773069dca2afaa7f2e9cd31 (patch)
treed3a082d0fc8e2989439714c96cd17abb34447e28 /src/comp
parent4c9eee8aa42891ac2a165eb3bbae9c16e4ee438d (diff)
downloadrust-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.rs19
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());
 }