From f3f63da7c8ac7c89b95a85f1e7c1d4ec300dea0d Mon Sep 17 00:00:00 2001 From: Graydon Hoare Date: Wed, 5 Jan 2011 16:06:01 -0800 Subject: [PATCH] Translate trivial bindings. Un-XFAIL bind-trivial.rs. --- src/Makefile | 1 + src/comp/middle/trans.rs | 28 ++++++++++++++++++++-------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/Makefile b/src/Makefile index bd13abdb1a8..c407403c8fc 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 75a75b3fe6b..992100f8b88 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,