aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-11-05 18:31:02 -0700
committerGraydon Hoare <[email protected]>2010-11-05 18:31:24 -0700
commit216082d0405c36e63f602462bb119a3c3b4a488d (patch)
treeabf6a632c69178ddad0dfd8049b970ec48e86dfd
parentMove symbol prefix logic into separate function, add underscore prefix for wi... (diff)
downloadrust-216082d0405c36e63f602462bb119a3c3b4a488d.tar.xz
rust-216082d0405c36e63f602462bb119a3c3b4a488d.zip
Translate ast.box unary expressions and support extraction of TypeRefs from AST annotations.
-rw-r--r--src/comp/middle/trans.rs28
1 files changed, 25 insertions, 3 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index f0b85563..79ffc3e0 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -451,7 +451,20 @@ impure fn trans_lit(@block_ctxt cx, &ast.lit lit) -> result {
}
}
-impure fn trans_unary(@block_ctxt cx, ast.unop op, &ast.expr e) -> result {
+fn node_type(@trans_ctxt cx, &ast.ann a) -> TypeRef {
+ alt (a) {
+ case (ast.ann_none) {
+ log "missing type annotation";
+ fail;
+ }
+ case (ast.ann_type(?t)) {
+ ret type_of(cx, t);
+ }
+ }
+}
+
+impure fn trans_unary(@block_ctxt cx, ast.unop op,
+ &ast.expr e, &ast.ann a) -> result {
auto sub = trans_expr(cx, e);
@@ -469,6 +482,15 @@ impure fn trans_unary(@block_ctxt cx, ast.unop op, &ast.expr e) -> result {
sub.val = cx.build.Neg(sub.val);
ret sub;
}
+ case (ast.box) {
+ auto e_ty = node_type(cx.fcx.tcx, a);
+ auto box_ty = T_box(e_ty);
+ sub.val = cx.build.Malloc(box_ty);
+ auto rc = sub.bcx.build.GEP(sub.val,
+ vec(C_int(0),
+ C_int(abi.box_rc_field_refcnt)));
+ ret res(sub.bcx, cx.build.Store(C_int(1), rc));
+ }
}
cx.fcx.tcx.sess.unimpl("expr variant in trans_unary");
fail;
@@ -759,8 +781,8 @@ impure fn trans_expr(@block_ctxt cx, &ast.expr e) -> result {
ret trans_lit(cx, *lit);
}
- case (ast.expr_unary(?op, ?x, _)) {
- ret trans_unary(cx, op, *x);
+ case (ast.expr_unary(?op, ?x, ?ann)) {
+ ret trans_unary(cx, op, *x, ann);
}
case (ast.expr_binary(?op, ?x, ?y, _)) {