From f19e16881e474e7f854ad04872e84755a8ad182b Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Thu, 24 Jan 2013 16:45:20 -0800 Subject: [PATCH] syntax/rustc: Less copy --- src/librustc/middle/astencode.rs | 25 +++++++++++++------------ src/libstd/serialize.rs | 4 ++-- src/libsyntax/ast_map.rs | 6 +++--- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/librustc/middle/astencode.rs b/src/librustc/middle/astencode.rs index 5928723f5c4..f39bd552c3b 100644 --- a/src/librustc/middle/astencode.rs +++ b/src/librustc/middle/astencode.rs @@ -133,14 +133,13 @@ fn decode_inlined_item(cdata: cstore::crate_metadata, to_id_range: to_id_range}); let raw_ii = decode_ast(ast_doc); let ii = renumber_ast(xcx, raw_ii); - // XXX: Bad copy of `path`. - ast_map::map_decoded_item(tcx.sess.diagnostic(), - dcx.tcx.items, copy path, ii); debug!("Fn named: %s", tcx.sess.str_of(ii.ident())); - decode_side_tables(xcx, ast_doc); debug!("< Decoded inlined fn: %s::%s", ast_map::path_to_str(path, tcx.sess.parse_sess.interner), tcx.sess.str_of(ii.ident())); + ast_map::map_decoded_item(tcx.sess.diagnostic(), + dcx.tcx.items, path, ii); + decode_side_tables(xcx, ast_doc); match ii { ast::ii_item(i) => { debug!(">>> DECODED ITEM >>>\n%s\n<<< DECODED ITEM <<<", @@ -309,10 +308,13 @@ fn simplify_ast(ii: ast::inlined_item) -> ast::inlined_item { ast::stmt_mac(*) => fail ~"unexpanded macro in astencode" } }; - // XXX: Bad copy. let blk_sans_items = ast::blk_ { + view_items: ~[], // I don't know if we need the view_items here, + // but it doesn't break tests! stmts: stmts_sans_items, - .. copy blk + expr: blk.expr, + id: blk.id, + rules: blk.rules }; fold::noop_fold_block(blk_sans_items, fld) } @@ -592,7 +594,7 @@ fn encode_vtable_res(ecx: @e::encode_ctxt, // ty::t doesn't work, and there is no way (atm) to have // hand-written encoding routines combine with auto-generated // ones. perhaps we should fix this. - do ebml_w.emit_from_vec(/*bad*/copy *dr) |vtable_origin| { + do ebml_w.emit_from_vec(*dr) |vtable_origin| { encode_vtable_origin(ecx, ebml_w, *vtable_origin) } } @@ -742,8 +744,7 @@ impl writer::Encoder: ebml_writer_helpers { } fn emit_tys(ecx: @e::encode_ctxt, tys: ~[ty::t]) { - // XXX: Bad copy. - do self.emit_from_vec(copy tys) |ty| { + do self.emit_from_vec(tys) |ty| { self.emit_ty(ecx, *ty) } } @@ -756,8 +757,8 @@ impl writer::Encoder: ebml_writer_helpers { fn emit_tpbt(ecx: @e::encode_ctxt, tpbt: ty::ty_param_bounds_and_ty) { do self.emit_rec { - do self.emit_field(~"bounds", 0u) { - do self.emit_from_vec(/*bad*/copy *tpbt.bounds) |bs| { + do self.emit_field(~"bounds", 0) { + do self.emit_from_vec(*tpbt.bounds) |bs| { self.emit_bounds(ecx, *bs); } } @@ -840,7 +841,7 @@ fn encode_side_tables_for_id(ecx: @e::encode_ctxt, do ebml_w.tag(c::tag_table_freevars) { ebml_w.id(id); do ebml_w.tag(c::tag_table_val) { - do ebml_w.emit_from_vec(/*bad*/copy **fv) |fv_entry| { + do ebml_w.emit_from_vec(**fv) |fv_entry| { encode_freevar_entry(ebml_w, *fv_entry) } } diff --git a/src/libstd/serialize.rs b/src/libstd/serialize.rs index da9bba1020c..00fa235a742 100644 --- a/src/libstd/serialize.rs +++ b/src/libstd/serialize.rs @@ -566,11 +566,11 @@ pub impl< // In some cases, these should eventually be coded as traits. pub trait EncoderHelpers { - fn emit_from_vec(&self, v: ~[T], f: fn(v: &T)); + fn emit_from_vec(&self, v: &[T], f: fn(v: &T)); } pub impl S: EncoderHelpers { - fn emit_from_vec(&self, v: ~[T], f: fn(v: &T)) { + fn emit_from_vec(&self, v: &[T], f: fn(v: &T)) { do self.emit_owned_vec(v.len()) { for v.eachi |i, e| { do self.emit_vec_elt(i) { diff --git a/src/libsyntax/ast_map.rs b/src/libsyntax/ast_map.rs index 804de5656ee..ddd0f846f9d 100644 --- a/src/libsyntax/ast_map.rs +++ b/src/libsyntax/ast_map.rs @@ -149,7 +149,7 @@ fn map_crate(diag: span_handler, c: crate) -> map { // crate. The `path` should be the path to the item but should not include // the item itself. fn map_decoded_item(diag: span_handler, - map: map, +path: path, ii: inlined_item) { + map: map, path: path, ii: inlined_item) { // I believe it is ok for the local IDs of inlined items from other crates // to overlap with the local ids from this crate, so just generate the ids // starting from 0. (In particular, I think these ids are only used in @@ -158,8 +158,8 @@ fn map_decoded_item(diag: span_handler, // variables that are simultaneously in scope). let cx = ctx { map: map, - mut path: /* FIXME (#2543) */ copy path, - mut local_id: 0u, + mut path: path, + mut local_id: 0, diag: diag, }; let v = mk_ast_map_visitor();