diff options
| author | Graydon Hoare <[email protected]> | 2011-01-05 16:06:01 -0800 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2011-01-05 16:06:01 -0800 |
| commit | f3f63da7c8ac7c89b95a85f1e7c1d4ec300dea0d (patch) | |
| tree | 33de77deb2d0d833d4fece5db3c76e5336d05c18 | |
| parent | Use uniform pair representation of functions everywhere, including static fun... (diff) | |
| download | rust-f3f63da7c8ac7c89b95a85f1e7c1d4ec300dea0d.tar.xz rust-f3f63da7c8ac7c89b95a85f1e7c1d4ec300dea0d.zip | |
Translate trivial bindings. Un-XFAIL bind-trivial.rs.
| -rw-r--r-- | src/Makefile | 1 | ||||
| -rw-r--r-- | src/comp/middle/trans.rs | 28 |
2 files changed, 21 insertions, 8 deletions
diff --git a/src/Makefile b/src/Makefile index bd13abdb..c407403c 100644 --- a/src/Makefile +++ b/src/Makefile @@ -418,6 +418,7 @@ TEST_XFAILS_RUSTC := $(filter-out \ arith-0.rs \ arith-1.rs \ arith-2.rs \ + bind-trivial.rs \ bitwise.rs \ bool-not.rs \ box.rs \ diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 75a75b3f..992100f8 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -1952,18 +1952,30 @@ impure fn trans_bind(@block_ctxt cx, @ast.expr f, vec[option.t[@ast.expr]] args, &ast.ann ann) -> result { auto f_res = trans_lval(cx, f); - auto bcx = f_res.res.bcx; - auto pair_t = node_type(cx.fcx.ccx, ann); - auto pair_v = bcx.build.Alloca(pair_t); if (f_res.is_mem) { cx.fcx.ccx.sess.unimpl("re-binding existing function"); } else { - auto code_cell = - bcx.build.GEP(pair_v, vec(C_int(0), - C_int(abi.fn_field_code))); - bcx.build.Store(f_res.res.val, code_cell); + let vec[@ty.t] bound = vec(); + for (option.t[@ast.expr] argopt in args) { + alt (argopt) { + case (none[@ast.expr]) { + } + case (some[@ast.expr](?e)) { + append[@ty.t](bound, ty.expr_ty(e)); + } + } + } + if (_vec.len[@ty.t](bound) == 0u) { + // Trivial 'binding': just return the static pair-ptr. + ret f_res.res; + } else { + auto bcx = f_res.res.bcx; + auto pair_t = node_type(cx.fcx.ccx, ann); + auto pair_v = bcx.build.Alloca(pair_t); + cx.fcx.ccx.sess.unimpl("nontrivial binding"); + ret res(bcx, pair_v); + } } - ret res(bcx, pair_v); } impure fn trans_call(@block_ctxt cx, @ast.expr f, |