Skip to content

Commit 814bf41

Browse files
committed
Add operator 'copy', translates as fall-through.
1 parent 9ca8df9 commit 814bf41

File tree

13 files changed

+51
-9
lines changed

13 files changed

+51
-9
lines changed

src/comp/middle/trans.rs

+4
Original file line numberDiff line numberDiff line change
@@ -5052,6 +5052,10 @@ fn trans_expr_out(cx: &@block_ctxt, e: &@ast::expr, output: out_method) ->
50525052
sub.bcx.build.Br(next_cx.llbb);
50535053
ret rslt(next_cx, sub.val);
50545054
}
5055+
ast::expr_copy(a) {
5056+
// FIXME: this has more-subtle semantics than just "fall through".
5057+
ret trans_expr_out(cx, a, output);
5058+
}
50555059
ast::expr_move(dst, src) {
50565060
let lhs_res = trans_lval(cx, dst);
50575061
assert (lhs_res.is_mem);

src/comp/middle/trans_alt.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -517,12 +517,13 @@ fn trans_alt(cx: &@block_ctxt, expr: &@ast::expr, arms: &[ast::arm],
517517

518518
// Not alt-related, but similar to the pattern-munging code above
519519
fn bind_irrefutable_pat(bcx: @block_ctxt, pat: &@ast::pat, val: ValueRef,
520-
table: hashmap[ast::node_id, ValueRef], copy: bool)
520+
table: hashmap[ast::node_id, ValueRef],
521+
make_copy: bool)
521522
-> @block_ctxt {
522523
let ccx = bcx.fcx.lcx.ccx;
523524
alt pat.node {
524525
ast::pat_bind(_) {
525-
if copy {
526+
if make_copy {
526527
let ty = ty::node_id_to_monotype(ccx.tcx, pat.id);
527528
let llty = trans::type_of(ccx, pat.span, ty);
528529
let alloc = trans::alloca(bcx, llty);
@@ -541,7 +542,8 @@ fn bind_irrefutable_pat(bcx: @block_ctxt, pat: &@ast::pat, val: ValueRef,
541542
let args = extract_variant_args(bcx, pat.id, vdefs, val);
542543
let i = 0;
543544
for argval: ValueRef in args.vals {
544-
bcx = bind_irrefutable_pat(bcx, sub.(i), argval, table, copy);
545+
bcx = bind_irrefutable_pat(bcx, sub.(i), argval, table,
546+
make_copy);
545547
i += 1;
546548
}
547549
}
@@ -553,15 +555,15 @@ fn bind_irrefutable_pat(bcx: @block_ctxt, pat: &@ast::pat, val: ValueRef,
553555
let ix: uint =
554556
ty::field_idx(ccx.sess, pat.span, f.ident, rec_fields);
555557
let r = trans::GEP_tup_like(bcx, rec_ty, val, ~[0, ix as int]);
556-
bcx = bind_irrefutable_pat(r.bcx, f.pat, r.val, table, copy);
558+
bcx = bind_irrefutable_pat(r.bcx, f.pat, r.val, table, make_copy);
557559
}
558560
}
559561
ast::pat_tup(elems) {
560562
let tup_ty = ty::node_id_to_monotype(ccx.tcx, pat.id);
561563
let i = 0u;
562564
for elem in elems {
563565
let r = trans::GEP_tup_like(bcx, tup_ty, val, ~[0, i as int]);
564-
bcx = bind_irrefutable_pat(r.bcx, elem, r.val, table, copy);
566+
bcx = bind_irrefutable_pat(r.bcx, elem, r.val, table, make_copy);
565567
i += 1u;
566568
}
567569
}

src/comp/middle/tstate/pre_post_conditions.rs

+4
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,10 @@ fn find_pre_post_expr(fcx: &fn_ctxt, e: @expr) {
406406
expr_tup(elts) {
407407
find_pre_post_exprs(fcx, elts, e.id);
408408
}
409+
expr_copy(a) {
410+
find_pre_post_expr(fcx, a);
411+
copy_pre_post(fcx.ccx, e.id, a);
412+
}
409413
expr_move(lhs, rhs) { handle_update(fcx, e, lhs, rhs, oper_move); }
410414
expr_swap(lhs, rhs) { handle_update(fcx, e, lhs, rhs, oper_swap); }
411415
expr_assign(lhs, rhs) { handle_update(fcx, e, lhs, rhs, oper_assign); }

src/comp/middle/tstate/states.rs

+3
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,9 @@ fn find_pre_post_state_expr(fcx: &fn_ctxt, pres: &prestate, e: @expr) ->
393393
ivec::len(elts)),
394394
elts, return);
395395
}
396+
expr_copy(a) {
397+
ret find_pre_post_state_sub(fcx, pres, a, e.id, none);
398+
}
396399
expr_move(lhs, rhs) {
397400
ret find_pre_post_state_two(fcx, pres, lhs, rhs, e.id, oper_move);
398401
}

src/comp/middle/tstate/tritv.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,8 @@ fn tritv_copy(target: &t, source: &t) -> bool {
204204
let changed =
205205
!bitv::equal(target.uncertain, source.uncertain) ||
206206
!bitv::equal(target.val, source.val);
207-
bitv::copy(target.uncertain, source.uncertain);
208-
bitv::copy(target.val, source.val);
207+
bitv::assign(target.uncertain, source.uncertain);
208+
bitv::assign(target.val, source.val);
209209
ret changed;
210210
}
211211

src/comp/middle/typeck.rs

+7
Original file line numberDiff line numberDiff line change
@@ -1942,6 +1942,13 @@ fn check_expr_with_unifier(fcx: &@fn_ctxt, expr: &@ast::expr,
19421942
bot = check_expr_with(fcx, e, ty::mk_bool(tcx));
19431943
write::nil_ty(tcx, id);
19441944
}
1945+
ast::expr_copy(a) {
1946+
bot = check_expr_with_unifier(fcx, a, unify, expected);
1947+
let tpot = ty::node_id_to_ty_param_substs_opt_and_ty(fcx.ccx.tcx,
1948+
a.id);
1949+
write::ty_fixup(fcx, id, tpot);
1950+
1951+
}
19451952
ast::expr_move(lhs, rhs) {
19461953
require_impure(tcx.sess, fcx.purity, expr.span);
19471954
bot = check_assignment(fcx, expr.span, lhs, rhs, id);

src/comp/syntax/ast.rs

+1
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ tag expr_ {
317317
* FIXME: many of these @exprs should be constrained with
318318
* is_lval once we have constrained types working.
319319
*/
320+
expr_copy(@expr);
320321
expr_move(@expr, @expr);
321322
expr_assign(@expr, @expr);
322323
expr_swap(@expr, @expr);

src/comp/syntax/fold.rs

+3
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,9 @@ fn noop_fold_expr(e: &expr_, fld: ast_fold) -> expr_ {
397397
expr_move(el, er) {
398398
expr_move(fld.fold_expr(el), fld.fold_expr(er))
399399
}
400+
expr_copy(e) {
401+
expr_copy(fld.fold_expr(e))
402+
}
400403
expr_assign(el, er) {
401404
expr_assign(fld.fold_expr(el), fld.fold_expr(er))
402405
}

src/comp/syntax/parse/parser.rs

+5
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ fn bad_expr_word_table() -> hashmap[str, ()] {
180180
words.insert("log_err", ());
181181
words.insert("tag", ());
182182
words.insert("obj", ());
183+
words.insert("copy", ());
183184
ret words;
184185
}
185186

@@ -999,6 +1000,10 @@ fn parse_bottom_expr(p: &parser) -> @ast::expr {
9991000
hi = e.span.hi;
10001001
expect(p, token::RPAREN);
10011002
ex = ast::expr_chan(e);
1003+
} else if (eat_word(p, "copy")) {
1004+
let e = parse_expr(p);
1005+
ex = ast::expr_copy(e);
1006+
hi = e.span.hi;
10021007
} else if (eat_word(p, "self")) {
10031008
log "parsing a self-call...";
10041009
expect(p, token::DOT);

src/comp/syntax/print/pprust.rs

+4
Original file line numberDiff line numberDiff line change
@@ -881,6 +881,10 @@ fn print_expr(s: &ps, expr: &@ast::expr) {
881881
ibox(s, 0u);
882882
print_block(s, blk);
883883
}
884+
ast::expr_copy(e) {
885+
word_space(s, "copy");
886+
print_expr(s, e);
887+
}
884888
ast::expr_move(lhs, rhs) {
885889
print_expr(s, lhs);
886890
space(s.s);

src/comp/syntax/visit.rs

+1
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ fn visit_expr[E](ex: &@expr, e: &E, v: &vt[E]) {
299299
expr_fn(f) { v.visit_fn(f, ~[], ex.span, none, ex.id, e, v); }
300300
expr_block(b) { v.visit_block(b, e, v); }
301301
expr_assign(a, b) { v.visit_expr(b, e, v); v.visit_expr(a, e, v); }
302+
expr_copy(a) { v.visit_expr(a, e, v); }
302303
expr_move(a, b) { v.visit_expr(b, e, v); v.visit_expr(a, e, v); }
303304
expr_swap(a, b) { v.visit_expr(a, e, v); v.visit_expr(b, e, v); }
304305
expr_assign_op(_, a, b) {

src/lib/bitv.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ export t;
33
export create;
44
export union;
55
export intersect;
6-
export copy;
6+
export assign;
77
export clone;
88
export get;
99
export equal;
@@ -63,7 +63,10 @@ fn intersect(v0: &t, v1: &t) -> bool {
6363

6464
fn right(w0: uint, w1: uint) -> uint { ret w1; }
6565

66-
fn copy(v0: &t, v1: t) -> bool { let sub = right; ret process(sub, v0, v1); }
66+
fn assign(v0: &t, v1: t) -> bool {
67+
let sub = right;
68+
ret process(sub, v0, v1);
69+
}
6770

6871
fn clone(v: t) -> t {
6972
let storage = ivec::init_elt_mut[uint](0u, v.nbits / uint_bits() + 1u);

src/test/run-pass/expr-copy.rs

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
fn main() {
2+
let x = 10;
3+
let y = copy x;
4+
log y;
5+
}

0 commit comments

Comments
 (0)