Skip to content

Commit 31c5cec

Browse files
committed
Purge placement new; Make borrowck know about unary move.
cc #3071
1 parent c2bb2f0 commit 31c5cec

26 files changed

+75
-286
lines changed

src/libcore/pipes.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -887,7 +887,7 @@ struct port_set<T: send> : recv<T> {
887887
while result == none && ports.len() > 0 {
888888
let i = wait_many(ports.map(|p| p.header()));
889889
alt move ports[i].try_recv() {
890-
some(m) {
890+
some(copy m) {
891891
result = some(move m);
892892
}
893893
none {
@@ -907,7 +907,7 @@ struct port_set<T: send> : recv<T> {
907907

908908
fn recv() -> T {
909909
match move self.try_recv() {
910-
some(x) { move x }
910+
some(copy x) { move x }
911911
none { fail ~"port_set: endpoints closed" }
912912
}
913913
}

src/libstd/arena.rs

+13-4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export arena, arena_with_size;
44

55
import list;
66
import list::{list, cons, nil};
7+
import unsafe::reinterpret_cast;
78

89
type chunk = {data: ~[u8], mut fill: uint};
910

@@ -27,7 +28,12 @@ fn arena() -> arena {
2728
arena_with_size(32u)
2829
}
2930

30-
impl arena for arena {
31+
#[abi = "rust-intrinsic"]
32+
extern mod rusti {
33+
fn move_val_init<T>(&dst: T, -src: T);
34+
}
35+
36+
impl &arena {
3137
fn alloc_grow(n_bytes: uint, align: uint) -> *() {
3238
// Allocate a new chunk.
3339
let mut head = list::head(self.chunks);
@@ -59,10 +65,13 @@ impl arena for arena {
5965
}
6066

6167
#[inline(always)]
62-
fn alloc(tydesc: *()) -> *() {
68+
fn alloc<T>(op: fn() -> T) -> &self/T {
6369
unsafe {
64-
let tydesc = tydesc as *sys::type_desc;
65-
self.alloc_inner((*tydesc).size, (*tydesc).align)
70+
let tydesc = sys::get_type_desc::<T>();
71+
let ptr = self.alloc_inner((*tydesc).size, (*tydesc).align);
72+
let ptr: *mut T = reinterpret_cast(ptr);
73+
rusti::move_val_init(*ptr, op());
74+
return reinterpret_cast(ptr);
6675
}
6776
}
6877
}

src/libsyntax/ast.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ enum def {
8181
def_ty(def_id),
8282
def_prim_ty(prim_ty),
8383
def_ty_param(def_id, uint),
84-
def_binding(node_id),
84+
def_binding(node_id, binding_mode),
8585
def_use(def_id),
8686
def_upvar(node_id /* local id of closed over var */,
8787
@def /* closed over def */,
@@ -342,10 +342,6 @@ enum expr_ {
342342
expr_ret(option<@expr>),
343343
expr_log(int, @expr, @expr),
344344

345-
expr_new(/* arena */ @expr,
346-
/* id for the alloc() call */ node_id,
347-
/* value */ @expr),
348-
349345
/* just an assert */
350346
expr_assert(@expr),
351347

src/libsyntax/ast_util.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ pure fn def_id_of_def(d: def) -> def_id {
5555
def_variant(_, id) | def_ty(id) | def_ty_param(id, _) |
5656
def_use(id) | def_class(id, _) { id }
5757
def_arg(id, _) | def_local(id, _) | def_self(id) |
58-
def_upvar(id, _, _) | def_binding(id) | def_region(id)
58+
def_upvar(id, _, _) | def_binding(id, _) | def_region(id)
5959
| def_typaram_binder(id) {
6060
local_def(id)
6161
}

src/libsyntax/fold.rs

-5
Original file line numberDiff line numberDiff line change
@@ -395,11 +395,6 @@ fn noop_fold_expr(e: expr_, fld: ast_fold) -> expr_ {
395395
let fold_mac = |x| fold_mac_(x, fld);
396396

397397
return alt e {
398-
expr_new(p, i, v) {
399-
expr_new(fld.fold_expr(p),
400-
fld.new_id(i),
401-
fld.fold_expr(v))
402-
}
403398
expr_vstore(e, v) {
404399
expr_vstore(fld.fold_expr(e), v)
405400
}

src/libsyntax/parse/parser.rs

+1-8
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import ast::{_mod, add, alt_check, alt_exhaustive, arg, arm, attribute,
2727
expr_call, expr_cast, expr_copy, expr_do_body,
2828
expr_fail, expr_field, expr_fn, expr_fn_block, expr_if,
2929
expr_index, expr_lit, expr_log, expr_loop,
30-
expr_loop_body, expr_mac, expr_move, expr_new, expr_path,
30+
expr_loop_body, expr_mac, expr_move, expr_path,
3131
expr_rec, expr_ret, expr_swap, expr_struct, expr_tup, expr_unary,
3232
expr_unary_move, expr_vec, expr_vstore, expr_while, extern_fn,
3333
field, fn_decl, foreign_item, foreign_item_fn, foreign_mod,
@@ -783,13 +783,6 @@ class parser {
783783
}
784784
} else if token::is_bar(self.token) {
785785
return pexpr(self.parse_lambda_expr());
786-
} else if self.eat_keyword(~"new") {
787-
self.expect(token::LPAREN);
788-
let r = self.parse_expr();
789-
self.expect(token::RPAREN);
790-
let v = self.parse_expr();
791-
return self.mk_pexpr(lo, self.span.hi,
792-
expr_new(r, self.get_id(), v));
793786
} else if self.eat_keyword(~"if") {
794787
return pexpr(self.parse_if_expr());
795788
} else if self.eat_keyword(~"for") {

src/libsyntax/print/pprust.rs

-7
Original file line numberDiff line numberDiff line change
@@ -1190,13 +1190,6 @@ fn print_expr(s: ps, &&expr: @ast::expr) {
11901190
word_nbsp(s, ~"assert");
11911191
print_expr(s, expr);
11921192
}
1193-
ast::expr_new(p, _, v) {
1194-
word_nbsp(s, ~"new");
1195-
popen(s);
1196-
print_expr(s, p);
1197-
pclose(s);
1198-
print_expr(s, v);
1199-
}
12001193
ast::expr_mac(m) { print_mac(s, m); }
12011194
}
12021195
s.ann.post(ann_node);

src/libsyntax/visit.rs

-4
Original file line numberDiff line numberDiff line change
@@ -361,10 +361,6 @@ fn visit_mac<E>(m: mac, e: E, v: vt<E>) {
361361

362362
fn visit_expr<E>(ex: @expr, e: E, v: vt<E>) {
363363
alt ex.node {
364-
expr_new(pool, _, val) {
365-
v.visit_expr(pool, e, v);
366-
v.visit_expr(val, e, v);
367-
}
368364
expr_vstore(x, _) { v.visit_expr(x, e, v); }
369365
expr_vec(es, _) { visit_exprs(es, e, v); }
370366
expr_rec(flds, base) {

src/rustc/middle/astencode.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ impl of tr for ast::def {
366366
ast::def_ty(did) { ast::def_ty(did.tr(xcx)) }
367367
ast::def_prim_ty(p) { ast::def_prim_ty(p) }
368368
ast::def_ty_param(did, v) { ast::def_ty_param(did.tr(xcx), v) }
369-
ast::def_binding(nid) { ast::def_binding(xcx.tr_id(nid)) }
369+
ast::def_binding(nid, bm) { ast::def_binding(xcx.tr_id(nid), bm) }
370370
ast::def_use(did) { ast::def_use(did.tr(xcx)) }
371371
ast::def_upvar(nid1, def, nid2) {
372372
ast::def_upvar(xcx.tr_id(nid1), @(*def).tr(xcx), xcx.tr_id(nid2))

src/rustc/middle/borrowck/categorization.rs

+9-2
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ impl public_methods for borrowck_ctxt {
178178
ast::expr_copy(*) | ast::expr_cast(*) | ast::expr_fail(*) |
179179
ast::expr_vstore(*) | ast::expr_vec(*) | ast::expr_tup(*) |
180180
ast::expr_if(*) | ast::expr_log(*) |
181-
ast::expr_new(*) | ast::expr_binary(*) | ast::expr_while(*) |
181+
ast::expr_binary(*) | ast::expr_while(*) |
182182
ast::expr_block(*) | ast::expr_loop(*) | ast::expr_alt(*) |
183183
ast::expr_lit(*) | ast::expr_break | ast::expr_mac(*) |
184184
ast::expr_again | ast::expr_rec(*) | ast::expr_struct(*) |
@@ -266,7 +266,14 @@ impl public_methods for borrowck_ctxt {
266266
mutbl:m, ty:expr_ty}
267267
}
268268

269-
ast::def_binding(pid) {
269+
ast::def_binding(vid, ast::bind_by_value) {
270+
// by-value bindings are basically local variables
271+
@{id:id, span:span,
272+
cat:cat_local(vid), lp:some(@lp_local(vid)),
273+
mutbl:m_imm, ty:expr_ty}
274+
}
275+
276+
ast::def_binding(pid, ast::bind_by_ref) {
270277
// bindings are "special" since they are implicit pointers.
271278

272279
// lookup the mutability for this binding that we found in

src/rustc/middle/borrowck/check_loans.rs

+3
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,9 @@ fn check_loans_in_expr(expr: @ast::expr,
579579
self.check_assignment(at_straight_up, dest);
580580
self.check_move_out(src);
581581
}
582+
ast::expr_unary_move(src) {
583+
self.check_move_out(src);
584+
}
582585
ast::expr_assign(dest, _) |
583586
ast::expr_assign_op(_, dest, _) {
584587
self.check_assignment(at_straight_up, dest);

src/rustc/middle/liveness.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ fn visit_expr(expr: @expr, &&self: @ir_maps, vt: vt<@ir_maps>) {
465465
// otherwise, live nodes are not required:
466466
expr_index(*) | expr_field(*) | expr_vstore(*) |
467467
expr_vec(*) | expr_rec(*) | expr_call(*) | expr_tup(*) |
468-
expr_new(*) | expr_log(*) | expr_binary(*) |
468+
expr_log(*) | expr_binary(*) |
469469
expr_assert(*) | expr_addr_of(*) | expr_copy(*) |
470470
expr_loop_body(*) | expr_do_body(*) | expr_cast(*) |
471471
expr_unary(*) | expr_fail(*) |
@@ -1094,7 +1094,6 @@ class liveness {
10941094
self.propagate_through_expr(l, ln)
10951095
}
10961096

1097-
expr_new(l, _, r) |
10981097
expr_log(_, l, r) |
10991098
expr_index(l, r) |
11001099
expr_binary(_, l, r) {
@@ -1463,7 +1462,7 @@ fn check_expr(expr: @expr, &&self: @liveness, vt: vt<@liveness>) {
14631462
expr_while(*) | expr_loop(*) |
14641463
expr_index(*) | expr_field(*) | expr_vstore(*) |
14651464
expr_vec(*) | expr_rec(*) | expr_tup(*) |
1466-
expr_new(*) | expr_log(*) | expr_binary(*) |
1465+
expr_log(*) | expr_binary(*) |
14671466
expr_assert(*) | expr_copy(*) |
14681467
expr_loop_body(*) | expr_do_body(*) |
14691468
expr_cast(*) | expr_unary(*) | expr_fail(*) |

src/rustc/middle/resolve3.rs

+4-8
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ import syntax::ast::{def_prim_ty, def_region, def_self, def_ty, def_ty_param,
1515
def_typaram_binder};
1616
import syntax::ast::{def_upvar, def_use, def_variant, expr, expr_assign_op};
1717
import syntax::ast::{expr_binary, expr_cast, expr_field, expr_fn};
18-
import syntax::ast::{expr_fn_block, expr_index, expr_new, expr_path};
18+
import syntax::ast::{expr_fn_block, expr_index, expr_path};
1919
import syntax::ast::{def_prim_ty, def_region, def_self, def_ty, def_ty_param};
2020
import syntax::ast::{def_upvar, def_use, def_variant, div, eq, expr};
2121
import syntax::ast::{expr_assign_op, expr_binary, expr_cast, expr_field};
22-
import syntax::ast::{expr_fn, expr_fn_block, expr_index, expr_new, expr_path};
22+
import syntax::ast::{expr_fn, expr_fn_block, expr_index, expr_path};
2323
import syntax::ast::{expr_struct, expr_unary, fn_decl, foreign_item};
2424
import syntax::ast::{foreign_item_fn, ge, gt, ident, trait_ref, impure_fn};
2525
import syntax::ast::{instance_var, item, item_class, item_const, item_enum};
@@ -3734,7 +3734,7 @@ class Resolver {
37343734
let pat_id = pattern.id;
37353735
do walk_pat(pattern) |pattern| {
37363736
alt pattern.node {
3737-
pat_ident(_, path, _)
3737+
pat_ident(binding_mode, path, _)
37383738
if !path.global && path.idents.len() == 1u => {
37393739

37403740
// The meaning of pat_ident with no type parameters
@@ -3781,7 +3781,7 @@ class Resolver {
37813781
// For pattern arms, we must use
37823782
// `def_binding` definitions.
37833783

3784-
def_binding(pattern.id)
3784+
def_binding(pattern.id, binding_mode)
37853785
}
37863786
IrrefutableMode {
37873787
// But for locals, we use `def_local`.
@@ -4315,10 +4315,6 @@ class Resolver {
43154315
self.impl_map.insert(expr.id,
43164316
self.current_module.impl_scopes);
43174317
}
4318-
expr_new(container, _, _) {
4319-
self.impl_map.insert(container.id,
4320-
self.current_module.impl_scopes);
4321-
}
43224318
_ {
43234319
// Nothing to do.
43244320
}

src/rustc/middle/trans/base.rs

+1-38
Original file line numberDiff line numberDiff line change
@@ -2411,7 +2411,7 @@ fn trans_local_var(cx: block, def: ast::def) -> local_var_result {
24112411
assert (cx.fcx.llargs.contains_key(nid));
24122412
return take_local(cx.fcx.llargs, nid);
24132413
}
2414-
ast::def_local(nid, _) | ast::def_binding(nid) {
2414+
ast::def_local(nid, _) | ast::def_binding(nid, _) {
24152415
assert (cx.fcx.lllocals.contains_key(nid));
24162416
return take_local(cx.fcx.lllocals, nid);
24172417
}
@@ -3771,43 +3771,6 @@ fn trans_expr(bcx: block, e: @ast::expr, dest: dest) -> block {
37713771
assert dest == ignore;
37723772
return trans_assign_op(bcx, e, op, dst, src);
37733773
}
3774-
ast::expr_new(pool, alloc_id, val) {
3775-
// First, call pool->alloc(tydesc) to get back a void*.
3776-
// Then, cast this memory to the required type and evaluate value
3777-
// into it.
3778-
let ccx = bcx.ccx();
3779-
3780-
// Allocate space for the ptr that will be returned from
3781-
// `pool.alloc()`:
3782-
let ptr_ty = expr_ty(bcx, e);
3783-
let ptr_ptr_val = alloc_ty(bcx, ptr_ty);
3784-
3785-
debug!{"ptr_ty = %s", ppaux::ty_to_str(tcx, ptr_ty)};
3786-
debug!{"ptr_ptr_val = %s", val_str(ccx.tn, ptr_ptr_val)};
3787-
3788-
let void_ty = ty::mk_nil_ptr(tcx);
3789-
let llvoid_ty = type_of(ccx, void_ty);
3790-
let voidval = PointerCast(bcx, ptr_ptr_val, T_ptr(llvoid_ty));
3791-
debug!{"voidval = %s", val_str(ccx.tn, voidval)};
3792-
3793-
let static_ti = get_tydesc(ccx, expr_ty(bcx, val));
3794-
lazily_emit_all_tydesc_glue(ccx, static_ti);
3795-
let lltydesc = PointerCast(bcx, static_ti.tydesc, llvoid_ty);
3796-
3797-
let origin = bcx.ccx().maps.method_map.get(alloc_id);
3798-
let bcx = trans_call_inner(
3799-
bcx, e.info(), node_id_type(bcx, alloc_id), void_ty,
3800-
|bcx| impl::trans_method_callee(bcx, alloc_id,
3801-
pool, origin),
3802-
arg_vals(~[lltydesc]),
3803-
save_in(voidval));
3804-
3805-
debug!{"dest = %s", dest_str(ccx, dest)};
3806-
let ptr_val = Load(bcx, ptr_ptr_val);
3807-
debug!{"ptr_val = %s", val_str(ccx.tn, ptr_val)};
3808-
let bcx = trans_expr(bcx, val, save_in(ptr_val));
3809-
store_in_dest(bcx, ptr_val, dest)
3810-
}
38113774
_ {
38123775
bcx.tcx().sess.span_bug(e.span, ~"trans_expr reached \
38133776
fall-through case");

src/rustc/middle/trans/type_use.rs

-3
Original file line numberDiff line numberDiff line change
@@ -228,9 +228,6 @@ fn mark_for_expr(cx: ctx, e: @expr) {
228228
expr_log(_, _, val) {
229229
node_type_needs(cx, use_tydesc, val.id);
230230
}
231-
expr_new(_, _, v) {
232-
node_type_needs(cx, use_repr, v.id);
233-
}
234231
expr_call(f, _, _) {
235232
vec::iter(ty::ty_fn_args(ty::node_id_to_type(cx.ccx.tcx, f.id)), |a| {
236233
alt a.mode {

src/rustc/middle/tstate/auxiliary.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ fn expr_to_constr_arg(tcx: ty::ctxt, e: @expr) -> @constr_arg_use {
525525
expr_path(p) {
526526
alt tcx.def_map.find(e.id) {
527527
some(def_local(nid, _)) | some(def_arg(nid, _)) |
528-
some(def_binding(nid)) | some(def_upvar(nid, _, _)) {
528+
some(def_binding(nid, _)) | some(def_upvar(nid, _, _)) {
529529
return @respan(p.span,
530530
carg_ident({ident: p.idents[0], node: nid}));
531531
}
@@ -762,7 +762,7 @@ fn local_node_id_to_def(fcx: fn_ctxt, i: node_id) -> option<def> {
762762
fn local_node_id_to_def_id(fcx: fn_ctxt, i: node_id) -> option<def_id> {
763763
alt local_node_id_to_def(fcx, i) {
764764
some(def_local(nid, _)) | some(def_arg(nid, _)) |
765-
some(def_binding(nid)) | some(def_upvar(nid, _, _)) {
765+
some(def_binding(nid, _)) | some(def_upvar(nid, _, _)) {
766766
some(local_def(nid))
767767
}
768768
_ { none }

0 commit comments

Comments
 (0)