aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2011-01-05 16:06:01 -0800
committerGraydon Hoare <[email protected]>2011-01-05 16:06:01 -0800
commitf3f63da7c8ac7c89b95a85f1e7c1d4ec300dea0d (patch)
tree33de77deb2d0d833d4fece5db3c76e5336d05c18 /src
parentUse uniform pair representation of functions everywhere, including static fun... (diff)
downloadrust-f3f63da7c8ac7c89b95a85f1e7c1d4ec300dea0d.tar.xz
rust-f3f63da7c8ac7c89b95a85f1e7c1d4ec300dea0d.zip
Translate trivial bindings. Un-XFAIL bind-trivial.rs.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile1
-rw-r--r--src/comp/middle/trans.rs28
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,