aboutsummaryrefslogtreecommitdiff
path: root/src/comp/middle
diff options
context:
space:
mode:
authorBrian Anderson <[email protected]>2011-01-30 17:18:19 -0500
committerGraydon Hoare <[email protected]>2011-02-10 12:12:10 -0800
commit378c0087ca7572cd17726c704fe04d57bf4687af (patch)
treec158d769375cee5b19b4be83d314c46acab28b12 /src/comp/middle
parentRevert EI_OSABI ELF header field back to 0 for Linux (diff)
downloadrust-378c0087ca7572cd17726c704fe04d57bf4687af.tar.xz
rust-378c0087ca7572cd17726c704fe04d57bf4687af.zip
Parse 'be' statement. Pass tailcall tests. No actual tailcalls yet.
Diffstat (limited to 'src/comp/middle')
-rw-r--r--src/comp/middle/fold.rs13
-rw-r--r--src/comp/middle/trans.rs9
-rw-r--r--src/comp/middle/typeck.rs15
3 files changed, 37 insertions, 0 deletions
diff --git a/src/comp/middle/fold.rs b/src/comp/middle/fold.rs
index 7e5c2d26..9194f734 100644
--- a/src/comp/middle/fold.rs
+++ b/src/comp/middle/fold.rs
@@ -177,6 +177,9 @@ type ast_fold[ENV] =
&option.t[@expr] rv) -> @stmt) fold_stmt_ret,
(fn(&ENV e, &span sp,
+ @expr e) -> @stmt) fold_stmt_be,
+
+ (fn(&ENV e, &span sp,
@expr e) -> @stmt) fold_stmt_log,
(fn(&ENV e, &span sp,
@@ -636,6 +639,11 @@ fn fold_stmt[ENV](&ENV env, ast_fold[ENV] fld, &@stmt s) -> @stmt {
ret fld.fold_stmt_ret(env_, s.span, oee);
}
+ case (ast.stmt_be(?e)) {
+ auto ee = fold_expr(env_, fld, e);
+ ret fld.fold_stmt_be(env_, s.span, ee);
+ }
+
case (ast.stmt_log(?e)) {
auto ee = fold_expr(env_, fld, e);
ret fld.fold_stmt_log(env_, s.span, ee);
@@ -1136,6 +1144,10 @@ fn identity_fold_stmt_ret[ENV](&ENV env, &span sp,
ret @respan(sp, ast.stmt_ret(rv));
}
+fn identity_fold_stmt_be[ENV](&ENV env, &span sp, @expr x) -> @stmt {
+ ret @respan(sp, ast.stmt_be(x));
+}
+
fn identity_fold_stmt_log[ENV](&ENV e, &span sp, @expr x) -> @stmt {
ret @respan(sp, ast.stmt_log(x));
}
@@ -1366,6 +1378,7 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
fold_stmt_decl = bind identity_fold_stmt_decl[ENV](_,_,_),
fold_stmt_ret = bind identity_fold_stmt_ret[ENV](_,_,_),
+ fold_stmt_be = bind identity_fold_stmt_be[ENV](_,_,_),
fold_stmt_log = bind identity_fold_stmt_log[ENV](_,_,_),
fold_stmt_check_expr
= bind identity_fold_stmt_check_expr[ENV](_,_,_),
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 2a9c32da..499ab027 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -3128,6 +3128,11 @@ fn trans_ret(@block_ctxt cx, &option.t[@ast.expr] e) -> result {
ret res(bcx, C_nil());
}
+fn trans_be(@block_ctxt cx, @ast.expr e) -> result {
+ // FIXME: So this isn't actually a tail call
+ ret trans_ret(cx, some(e));
+}
+
fn init_local(@block_ctxt cx, @ast.local local) -> result {
// Make a note to drop this slot on the way out.
@@ -3178,6 +3183,10 @@ fn trans_stmt(@block_ctxt cx, &ast.stmt s) -> result {
bcx = trans_ret(cx, e).bcx;
}
+ case (ast.stmt_be(?e)) {
+ bcx = trans_be(cx, e).bcx;
+ }
+
case (ast.stmt_expr(?e)) {
bcx = trans_expr(cx, e).bcx;
}
diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs
index 5b14eea4..7a2b0616 100644
--- a/src/comp/middle/typeck.rs
+++ b/src/comp/middle/typeck.rs
@@ -1719,6 +1719,21 @@ fn check_stmt(&@fn_ctxt fcx, &@ast.stmt stmt) -> @ast.stmt {
}
}
+ case (ast.stmt_be(?expr)) {
+ alt (expr.node) {
+ case (ast.expr_call(_, _, _)) {
+ auto expr_0 = check_expr(fcx, expr);
+ auto expr_1 = demand_expr(fcx, fcx.ret_ty, expr_0);
+ ret @fold.respan[ast.stmt_](stmt.span,
+ ast.stmt_be(expr_1));
+ }
+ case (_) {
+ fcx.ccx.sess.err("Non-call expression in tail call");
+ fail;
+ }
+ }
+ }
+
case (ast.stmt_log(?expr)) {
auto expr_t = check_expr(fcx, expr);
ret @fold.respan[ast.stmt_](stmt.span, ast.stmt_log(expr_t));