diff options
| author | Tim Chevalier <chevalier@alum.wellesley.edu> | 2013-01-22 11:57:39 -0800 |
|---|---|---|
| committer | Tim Chevalier <chevalier@alum.wellesley.edu> | 2013-01-22 11:58:08 -0800 |
| commit | a8d076d2de662cb1a13cc1efa092e7202b129eae (patch) | |
| tree | 03992d0115aa2063fdfbd5e991dc9baee0ec04a1 /src/librustc/metadata | |
| parent | 8869e723869fe95af0cd022d84c134f7a84fd4a0 (diff) | |
| download | rust-a8d076d2de662cb1a13cc1efa092e7202b129eae.tar.gz rust-a8d076d2de662cb1a13cc1efa092e7202b129eae.zip | |
syntax/rustc: Make some metadata-related functions take slices, kill bad copies
Too small to review.
Diffstat (limited to 'src/librustc/metadata')
| -rw-r--r-- | src/librustc/metadata/encoder.rs | 120 |
1 files changed, 59 insertions, 61 deletions
diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs index b7934f7eae0..0633ce4f2e3 100644 --- a/src/librustc/metadata/encoder.rs +++ b/src/librustc/metadata/encoder.rs @@ -68,7 +68,7 @@ type abbrev_map = map::HashMap<ty::t, tyencode::ty_abbrev>; pub type encode_inlined_item = fn@(ecx: @encode_ctxt, ebml_w: writer::Encoder, - path: ast_map::path, + path: &[ast_map::path_elt], ii: ast::inlined_item); type encode_parms = { @@ -194,7 +194,7 @@ fn encode_ty_type_param_bounds(ebml_w: writer::Encoder, ecx: @encode_ctxt, } fn encode_type_param_bounds(ebml_w: writer::Encoder, ecx: @encode_ctxt, - params: ~[ty_param]) { + params: &[ty_param]) { let ty_param_bounds = @params.map(|param| ecx.tcx.ty_param_bounds.get(param.id)); encode_ty_type_param_bounds(ebml_w, ecx, ty_param_bounds); @@ -268,9 +268,10 @@ fn encode_parent_item(ebml_w: writer::Encoder, id: def_id) { } fn encode_enum_variant_info(ecx: @encode_ctxt, ebml_w: writer::Encoder, - id: node_id, variants: ~[variant], - path: ast_map::path, index: @mut ~[entry<int>], - ty_params: ~[ty_param]) { + id: node_id, variants: &[variant], + path: &[ast_map::path_elt], + index: @mut ~[entry<int>], + ty_params: &[ty_param]) { let mut disr_val = 0; let mut i = 0; let vi = ty::enum_variants(ecx.tcx, @@ -297,8 +298,8 @@ fn encode_enum_variant_info(ecx: @encode_ctxt, ebml_w: writer::Encoder, encode_disr_val(ecx, ebml_w, vi[i].disr_val); disr_val = vi[i].disr_val; } - encode_type_param_bounds(ebml_w, ecx, /*bad*/copy ty_params); - encode_path(ecx, ebml_w, &path, + encode_type_param_bounds(ebml_w, ecx, ty_params); + encode_path(ecx, ebml_w, path, ast_map::path_name(variant.node.name)); ebml_w.end_tag(); disr_val += 1; @@ -307,7 +308,7 @@ fn encode_enum_variant_info(ecx: @encode_ctxt, ebml_w: writer::Encoder, } fn encode_path(ecx: @encode_ctxt, ebml_w: writer::Encoder, - path: &ast_map::path, name: ast_map::path_elt) { + path: &[ast_map::path_elt], name: ast_map::path_elt) { fn encode_path_elt(ecx: @encode_ctxt, ebml_w: writer::Encoder, elt: ast_map::path_elt) { let (tag, name) = match elt { @@ -328,7 +329,7 @@ fn encode_path(ecx: @encode_ctxt, ebml_w: writer::Encoder, } fn encode_info_for_mod(ecx: @encode_ctxt, ebml_w: writer::Encoder, - md: _mod, id: node_id, +path: ast_map::path, + md: _mod, id: node_id, path: &[ast_map::path_elt], name: ident) { ebml_w.start_tag(tag_items_data_item); encode_def_id(ebml_w, local_def(id)); @@ -357,7 +358,7 @@ fn encode_info_for_mod(ecx: @encode_ctxt, ebml_w: writer::Encoder, } } - encode_path(ecx, ebml_w, &path, ast_map::path_mod(name)); + encode_path(ecx, ebml_w, path, ast_map::path_mod(name)); // Encode the reexports of this module. debug!("(encoding info for module) encoding reexports for %d", id); @@ -434,8 +435,8 @@ fn encode_method_sort(ebml_w: writer::Encoder, sort: char) { /* Returns an index of items in this class */ fn encode_info_for_struct(ecx: @encode_ctxt, ebml_w: writer::Encoder, - path: ast_map::path, - fields: ~[@struct_field], + path: &[ast_map::path_elt], + fields: &[@struct_field], global_index: @mut~[entry<int>]) -> ~[entry<int>] { /* Each class has its own index, since different classes may have fields with the same name */ @@ -455,7 +456,7 @@ fn encode_info_for_struct(ecx: @encode_ctxt, ebml_w: writer::Encoder, tcx.sess.str_of(nm), id); encode_visibility(ebml_w, vis); encode_name(ecx, ebml_w, nm); - encode_path(ecx, ebml_w, &path, ast_map::path_name(nm)); + encode_path(ecx, ebml_w, path, ast_map::path_name(nm)); encode_type(ecx, ebml_w, node_id_to_type(tcx, id)); encode_mutability(ebml_w, mt); encode_def_id(ebml_w, local_def(id)); @@ -469,8 +470,8 @@ fn encode_info_for_struct(ecx: @encode_ctxt, ebml_w: writer::Encoder, // This is for encoding info for ctors and dtors fn encode_info_for_ctor(ecx: @encode_ctxt, ebml_w: writer::Encoder, - id: node_id, ident: ident, +path: ast_map::path, - item: Option<inlined_item>, +tps: ~[ty_param]) { + id: node_id, ident: ident, path: &[ast_map::path_elt], + item: Option<inlined_item>, tps: &[ty_param]) { ebml_w.start_tag(tag_items_data_item); encode_name(ecx, ebml_w, ident); encode_def_id(ebml_w, local_def(id)); @@ -481,7 +482,7 @@ fn encode_info_for_ctor(ecx: @encode_ctxt, ebml_w: writer::Encoder, ecx.tcx.sess.str_of(ident), ty_to_str(ecx.tcx, its_ty), id); encode_type(ecx, ebml_w, its_ty); - encode_path(ecx, ebml_w, &path, ast_map::path_name(ident)); + encode_path(ecx, ebml_w, path, ast_map::path_name(ident)); match item { Some(ref it) => { (ecx.encode_inlined_item)(ecx, ebml_w, path, (*it)); @@ -495,7 +496,7 @@ fn encode_info_for_ctor(ecx: @encode_ctxt, ebml_w: writer::Encoder, fn encode_info_for_method(ecx: @encode_ctxt, ebml_w: writer::Encoder, - +impl_path: ast_map::path, + impl_path: &[ast_map::path_elt], should_inline: bool, parent_id: node_id, m: @method, @@ -514,7 +515,7 @@ fn encode_info_for_method(ecx: @encode_ctxt, encode_type_param_bounds(ebml_w, ecx, all_tps); encode_type(ecx, ebml_w, node_id_to_type(ecx.tcx, m.id)); encode_name(ecx, ebml_w, m.ident); - encode_path(ecx, ebml_w, &impl_path, ast_map::path_name(m.ident)); + encode_path(ecx, ebml_w, impl_path, ast_map::path_name(m.ident)); encode_self_type(ebml_w, m.self_ty.node); if len > 0u || should_inline { (ecx.encode_inlined_item)( @@ -544,7 +545,7 @@ fn purity_static_method_family(p: purity) -> char { } -fn should_inline(attrs: ~[attribute]) -> bool { +fn should_inline(attrs: &[attribute]) -> bool { match attr::find_inline_attr(attrs) { attr::ia_none | attr::ia_never => false, attr::ia_hint | attr::ia_always => true @@ -554,7 +555,7 @@ fn should_inline(attrs: ~[attribute]) -> bool { fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: writer::Encoder, item: @item, index: @mut ~[entry<int>], - +path: ast_map::path) { + path: &[ast_map::path_elt]) { let tcx = ecx.tcx; let must_write = @@ -582,7 +583,7 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: writer::Encoder, encode_family(ebml_w, 'c'); encode_type(ecx, ebml_w, node_id_to_type(tcx, item.id)); encode_symbol(ecx, ebml_w, item.id); - encode_path(ecx, ebml_w, &path, ast_map::path_name(item.ident)); + encode_path(ecx, ebml_w, path, ast_map::path_name(item.ident)); ebml_w.end_tag(); } item_fn(_, purity, tps, _) => { @@ -593,8 +594,8 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: writer::Encoder, let tps_len = tps.len(); encode_type_param_bounds(ebml_w, ecx, tps); encode_type(ecx, ebml_w, node_id_to_type(tcx, item.id)); - encode_path(ecx, ebml_w, &path, ast_map::path_name(item.ident)); - encode_attributes(ebml_w, /*bad*/copy item.attrs); + encode_path(ecx, ebml_w, path, ast_map::path_name(item.ident)); + encode_attributes(ebml_w, item.attrs); if tps_len > 0u || should_inline(item.attrs) { (ecx.encode_inlined_item)(ecx, ebml_w, path, ii_item(item)); } else { @@ -612,7 +613,7 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: writer::Encoder, encode_def_id(ebml_w, local_def(item.id)); encode_family(ebml_w, 'n'); encode_name(ecx, ebml_w, item.ident); - encode_path(ecx, ebml_w, &path, ast_map::path_name(item.ident)); + encode_path(ecx, ebml_w, path, ast_map::path_name(item.ident)); ebml_w.end_tag(); } item_ty(_, tps) => { @@ -623,7 +624,7 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: writer::Encoder, encode_type_param_bounds(ebml_w, ecx, tps); encode_type(ecx, ebml_w, node_id_to_type(tcx, item.id)); encode_name(ecx, ebml_w, item.ident); - encode_path(ecx, ebml_w, &path, ast_map::path_name(item.ident)); + encode_path(ecx, ebml_w, path, ast_map::path_name(item.ident)); encode_region_param(ecx, ebml_w, item); ebml_w.end_tag(); } @@ -632,33 +633,31 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: writer::Encoder, do ebml_w.wr_tag(tag_items_data_item) { encode_def_id(ebml_w, local_def(item.id)); encode_family(ebml_w, 't'); - encode_type_param_bounds(ebml_w, ecx, /*bad*/copy *tps); + encode_type_param_bounds(ebml_w, ecx, *tps); encode_type(ecx, ebml_w, node_id_to_type(tcx, item.id)); encode_name(ecx, ebml_w, item.ident); for (*enum_definition).variants.each |v| { encode_variant_id(ebml_w, local_def(v.node.id)); } - (ecx.encode_inlined_item)(ecx, ebml_w, /*bad*/copy path, - ii_item(item)); - encode_path(ecx, ebml_w, &path, ast_map::path_name(item.ident)); + (ecx.encode_inlined_item)(ecx, ebml_w, path, ii_item(item)); + encode_path(ecx, ebml_w, path, ast_map::path_name(item.ident)); encode_region_param(ecx, ebml_w, item); } encode_enum_variant_info(ecx, ebml_w, item.id, - /*bad*/copy (*enum_definition).variants, + (*enum_definition).variants, path, index, - /*bad*/copy *tps); + *tps); } item_struct(struct_def, tps) => { /* First, encode the fields These come first because we need to write them to make the index, and the index needs to be in the item for the class itself */ - // XXX: Bad copy of `path`. - let idx = encode_info_for_struct(ecx, ebml_w, copy path, - /*bad*/copy struct_def.fields, index); + let idx = encode_info_for_struct(ecx, ebml_w, path, + struct_def.fields, index); /* Encode the dtor */ do struct_def.dtor.iter |dtor| { index.push({val: dtor.node.id, pos: ebml_w.writer.tell()}); @@ -666,10 +665,10 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: writer::Encoder, ecx.tcx.sess.ident_of( ecx.tcx.sess.str_of(item.ident) + ~"_dtor"), - /*bad*/copy path, if tps.len() > 0u { + path, if tps.len() > 0u { Some(ii_dtor(*dtor, item.ident, tps, local_def(item.id))) } - else { None }, /*bad*/copy tps); + else { None }, tps); } /* Index the class*/ @@ -681,7 +680,7 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: writer::Encoder, encode_type_param_bounds(ebml_w, ecx, tps); encode_type(ecx, ebml_w, node_id_to_type(tcx, item.id)); encode_name(ecx, ebml_w, item.ident); - encode_path(ecx, ebml_w, &path, ast_map::path_name(item.ident)); + encode_path(ecx, ebml_w, path, ast_map::path_name(item.ident)); encode_region_param(ecx, ebml_w, item); /* Encode the dtor */ /* Encode id for dtor */ @@ -718,11 +717,10 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: writer::Encoder, encode_def_id(ebml_w, local_def(item.id)); encode_family(ebml_w, 'i'); encode_region_param(ecx, ebml_w, item); - // XXX: Bad copy. - encode_type_param_bounds(ebml_w, ecx, copy tps); + encode_type_param_bounds(ebml_w, ecx, tps); encode_type(ecx, ebml_w, node_id_to_type(tcx, item.id)); encode_name(ecx, ebml_w, item.ident); - encode_attributes(ebml_w, /*bad*/copy item.attrs); + encode_attributes(ebml_w, item.attrs); match ty.node { ast::ty_path(path, _) if path.idents.len() == 1 => { encode_impl_type_basename(ecx, ebml_w, @@ -739,15 +737,17 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: writer::Encoder, do opt_trait.iter() |associated_trait| { encode_trait_ref(ebml_w, ecx, *associated_trait); } - encode_path(ecx, ebml_w, &path, ast_map::path_name(item.ident)); + encode_path(ecx, ebml_w, path, ast_map::path_name(item.ident)); ebml_w.end_tag(); - let impl_path = vec::append_one(path, - ast_map::path_name(item.ident)); + // >:-< + let mut impl_path = vec::append(~[], path); + impl_path += ~[ast_map::path_name(item.ident)]; + for methods.each |m| { index.push({val: m.id, pos: ebml_w.writer.tell()}); - encode_info_for_method(ecx, ebml_w, /*bad*/copy impl_path, - should_inline(/*bad*/copy m.attrs), + encode_info_for_method(ecx, ebml_w, impl_path, + should_inline(m.attrs), item.id, *m, vec::append(/*bad*/copy tps, m.tps)); } @@ -760,10 +760,10 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: writer::Encoder, encode_def_id(ebml_w, local_def(item.id)); encode_family(ebml_w, 'I'); encode_region_param(ecx, ebml_w, item); - encode_type_param_bounds(ebml_w, ecx, /*bad*/copy *tps); + encode_type_param_bounds(ebml_w, ecx, *tps); encode_type(ecx, ebml_w, node_id_to_type(tcx, item.id)); encode_name(ecx, ebml_w, item.ident); - encode_attributes(ebml_w, /*bad*/copy item.attrs); + encode_attributes(ebml_w, item.attrs); let mut i = 0u; for vec::each(*ty::trait_methods(tcx, local_def(item.id))) |mty| { match (*ms)[i] { @@ -772,7 +772,7 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: writer::Encoder, encode_def_id(ebml_w, local_def((*ty_m).id)); encode_name(ecx, ebml_w, mty.ident); encode_type_param_bounds(ebml_w, ecx, - /*bad*/copy (*ty_m).tps); + (*ty_m).tps); encode_type(ecx, ebml_w, ty::mk_fn(tcx, /*bad*/copy mty.fty)); encode_family(ebml_w, purity_fn_family(mty.fty.meta.purity)); encode_self_type(ebml_w, mty.self_ty); @@ -785,7 +785,7 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: writer::Encoder, ebml_w.start_tag(tag_item_trait_method); encode_def_id(ebml_w, local_def(m.id)); encode_name(ecx, ebml_w, mty.ident); - encode_type_param_bounds(ebml_w, ecx, /*bad*/copy m.tps); + encode_type_param_bounds(ebml_w, ecx, m.tps); encode_type(ecx, ebml_w, ty::mk_fn(tcx, /*bad*/copy mty.fty)); encode_family(ebml_w, purity_fn_family(mty.fty.meta.purity)); encode_self_type(ebml_w, mty.self_ty); @@ -793,9 +793,9 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: writer::Encoder, ebml_w.end_tag(); } } - i += 1u; + i += 1; } - encode_path(ecx, ebml_w, &path, ast_map::path_name(item.ident)); + encode_path(ecx, ebml_w, path, ast_map::path_name(item.ident)); for traits.each |associated_trait| { encode_trait_ref(ebml_w, ecx, *associated_trait) } @@ -821,9 +821,9 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: writer::Encoder, let polyty = ecx.tcx.tcache.get(local_def(ty_m.id)); encode_ty_type_param_bounds(ebml_w, ecx, polyty.bounds); encode_type(ecx, ebml_w, polyty.ty); - let m_path = vec::append_one(/*bad*/copy path, - ast_map::path_name(item.ident)); - encode_path(ecx, ebml_w, &m_path, ast_map::path_name(ty_m.ident)); + let mut m_path = vec::append(~[], path); // :-( + m_path += [ast_map::path_name(item.ident)]; + encode_path(ecx, ebml_w, m_path, ast_map::path_name(ty_m.ident)); ebml_w.end_tag(); } @@ -855,20 +855,18 @@ fn encode_info_for_foreign_item(ecx: @encode_ctxt, encode_type_param_bounds(ebml_w, ecx, tps); encode_type(ecx, ebml_w, node_id_to_type(ecx.tcx, nitem.id)); if abi == foreign_abi_rust_intrinsic { - // XXX: Bad copy of `path`. - (ecx.encode_inlined_item)(ecx, ebml_w, copy path, - ii_foreign(nitem)); + (ecx.encode_inlined_item)(ecx, ebml_w, path, ii_foreign(nitem)); } else { encode_symbol(ecx, ebml_w, nitem.id); } - encode_path(ecx, ebml_w, &path, ast_map::path_name(nitem.ident)); + encode_path(ecx, ebml_w, path, ast_map::path_name(nitem.ident)); } foreign_item_const(*) => { encode_def_id(ebml_w, local_def(nitem.id)); encode_family(ebml_w, 'c'); encode_type(ecx, ebml_w, node_id_to_type(ecx.tcx, nitem.id)); encode_symbol(ecx, ebml_w, nitem.id); - encode_path(ecx, ebml_w, &path, ast_map::path_name(nitem.ident)); + encode_path(ecx, ebml_w, path, ast_map::path_name(nitem.ident)); } } ebml_w.end_tag(); @@ -888,7 +886,7 @@ fn encode_info_for_items(ecx: @encode_ctxt, ebml_w: writer::Encoder, visit::visit_item(i, cx, v); match ecx.tcx.items.get(i.id) { ast_map::node_item(_, pt) => { - encode_info_for_item(ecx, ebml_w, i, index, /*bad*/copy *pt); + encode_info_for_item(ecx, ebml_w, i, index, *pt); } _ => fail ~"bad item" } @@ -1001,7 +999,7 @@ fn encode_meta_item(ebml_w: writer::Encoder, mi: meta_item) { } } -fn encode_attributes(ebml_w: writer::Encoder, attrs: ~[attribute]) { +fn encode_attributes(ebml_w: writer::Encoder, attrs: &[attribute]) { ebml_w.start_tag(tag_attributes); for attrs.each |attr| { ebml_w.start_tag(tag_attribute); |
