aboutsummaryrefslogtreecommitdiff
path: root/src/comp/middle/trans.rs
diff options
context:
space:
mode:
authorBrian Anderson <[email protected]>2011-01-28 00:09:26 -0500
committerGraydon Hoare <[email protected]>2011-01-28 11:12:57 -0800
commit6b7cab3602eae7893a4efcee760600ab69d75173 (patch)
tree0e73b029562b16641daae1b11ddf6a4396948016 /src/comp/middle/trans.rs
parentCorrectly handle "import foo = bar.zed;". (diff)
downloadrust-6b7cab3602eae7893a4efcee760600ab69d75173.tar.xz
rust-6b7cab3602eae7893a4efcee760600ab69d75173.zip
Teach rustc to fail
Diffstat (limited to 'src/comp/middle/trans.rs')
-rw-r--r--src/comp/middle/trans.rs27
1 files changed, 16 insertions, 11 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 249cb73e..54e9426e 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -2251,11 +2251,7 @@ fn trans_index(@block_ctxt cx, &ast.span sp, @ast.expr base,
ix.bcx.build.CondBr(bounds_check, next_cx.llbb, fail_cx.llbb);
// fail: bad bounds check.
- auto V_expr_str = p2i(C_cstr(cx.fcx.ccx, "out-of-bounds access"));
- auto V_filename = p2i(C_cstr(cx.fcx.ccx, sp.filename));
- auto V_line = sp.lo.line as int;
- auto args = vec(V_expr_str, V_filename, C_int(V_line));
- auto fail_res = trans_upcall(fail_cx, "upcall_fail", args);
+ auto fail_res = trans_fail(fail_cx, sp, "bounds check");
fail_res.bcx.build.Br(next_cx.llbb);
auto body = next_cx.build.GEP(v, vec(C_int(0), C_int(abi.vec_elt_data)));
@@ -2904,13 +2900,9 @@ fn trans_check_expr(@block_ctxt cx, @ast.expr e) -> result {
auto cond_res = trans_expr(cx, e);
// FIXME: need pretty-printer.
- auto V_expr_str = p2i(C_cstr(cx.fcx.ccx, "<expr>"));
- auto V_filename = p2i(C_cstr(cx.fcx.ccx, e.span.filename));
- auto V_line = e.span.lo.line as int;
- auto args = vec(V_expr_str, V_filename, C_int(V_line));
-
+ auto expr_str = "<expr>";
auto fail_cx = new_sub_block_ctxt(cx, "fail");
- auto fail_res = trans_upcall(fail_cx, "upcall_fail", args);
+ auto fail_res = trans_fail(fail_cx, e.span, expr_str);
auto next_cx = new_sub_block_ctxt(cx, "next");
fail_res.bcx.build.Br(next_cx.llbb);
@@ -2920,6 +2912,15 @@ fn trans_check_expr(@block_ctxt cx, @ast.expr e) -> result {
ret res(next_cx, C_nil());
}
+fn trans_fail(@block_ctxt cx, common.span sp, str fail_str) -> result {
+ auto V_fail_str = p2i(C_cstr(cx.fcx.ccx, fail_str));
+ auto V_filename = p2i(C_cstr(cx.fcx.ccx, sp.filename));
+ auto V_line = sp.lo.line as int;
+ auto args = vec(V_fail_str, V_filename, C_int(V_line));
+
+ ret trans_upcall(cx, "upcall_fail", args);
+}
+
fn trans_ret(@block_ctxt cx, &option.t[@ast.expr] e) -> result {
auto bcx = cx;
auto val = C_nil();
@@ -3035,6 +3036,10 @@ fn trans_stmt(@block_ctxt cx, &ast.stmt s) -> result {
bcx = trans_check_expr(cx, a).bcx;
}
+ case (ast.stmt_fail) {
+ bcx = trans_fail(cx, s.span, "explicit failure").bcx;
+ }
+
case (ast.stmt_ret(?e)) {
bcx = trans_ret(cx, e).bcx;
}