diff options
| author | Brian Anderson <[email protected]> | 2011-01-28 00:09:26 -0500 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2011-01-28 11:12:57 -0800 |
| commit | 6b7cab3602eae7893a4efcee760600ab69d75173 (patch) | |
| tree | 0e73b029562b16641daae1b11ddf6a4396948016 | |
| parent | Correctly handle "import foo = bar.zed;". (diff) | |
| download | rust-6b7cab3602eae7893a4efcee760600ab69d75173.tar.xz rust-6b7cab3602eae7893a4efcee760600ab69d75173.zip | |
Teach rustc to fail
| -rw-r--r-- | src/comp/front/ast.rs | 1 | ||||
| -rw-r--r-- | src/comp/front/parser.rs | 6 | ||||
| -rw-r--r-- | src/comp/middle/fold.rs | 4 | ||||
| -rw-r--r-- | src/comp/middle/trans.rs | 27 | ||||
| -rw-r--r-- | src/comp/middle/typeck.rs | 4 |
5 files changed, 31 insertions, 11 deletions
diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs index 70da87dd..10bcd5c4 100644 --- a/src/comp/front/ast.rs +++ b/src/comp/front/ast.rs @@ -116,6 +116,7 @@ tag stmt_ { stmt_ret(option.t[@expr]); stmt_log(@expr); stmt_check_expr(@expr); + stmt_fail; stmt_expr(@expr); } diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs index 5c13ef86..bef37a3c 100644 --- a/src/comp/front/parser.rs +++ b/src/comp/front/parser.rs @@ -1158,6 +1158,11 @@ impure fn parse_stmt(parser p) -> @ast.stmt { } } + case (token.FAIL) { + p.bump(); + ret @spanned(lo, p.get_span(), ast.stmt_fail); + } + case (token.RET) { p.bump(); alt (p.peek()) { @@ -1315,6 +1320,7 @@ fn stmt_ends_with_semi(@ast.stmt stmt) -> bool { case (ast.stmt_ret(_)) { ret true; } case (ast.stmt_log(_)) { ret true; } case (ast.stmt_check_expr(_)) { ret true; } + case (ast.stmt_fail) { ret true; } case (ast.stmt_expr(?e)) { alt (e.node) { case (ast.expr_vec(_,_)) { ret true; } diff --git a/src/comp/middle/fold.rs b/src/comp/middle/fold.rs index 711db111..67c26014 100644 --- a/src/comp/middle/fold.rs +++ b/src/comp/middle/fold.rs @@ -615,6 +615,10 @@ fn fold_stmt[ENV](&ENV env, ast_fold[ENV] fld, &@stmt s) -> @stmt { ret fld.fold_stmt_check_expr(env_, s.span, ee); } + case (ast.stmt_fail) { + ret s; + } + case (ast.stmt_expr(?e)) { auto ee = fold_expr(env_, fld, e); ret fld.fold_stmt_expr(env_, s.span, ee); 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; } diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index c3ae8f58..ea9002ae 100644 --- a/src/comp/middle/typeck.rs +++ b/src/comp/middle/typeck.rs @@ -1682,6 +1682,10 @@ fn check_stmt(&@fn_ctxt fcx, &@ast.stmt stmt) -> @ast.stmt { ast.stmt_check_expr(expr_t)); } + case (ast.stmt_fail) { + ret stmt; + } + case (ast.stmt_expr(?expr)) { auto expr_t = check_expr(fcx, expr); ret @fold.respan[ast.stmt_](stmt.span, ast.stmt_expr(expr_t)); |