Skip to content

Commit 823c7ee

Browse files
committed
Fix other bugs with new closure borrowing
This fixes various issues throughout the standard distribution and tests.
1 parent b4ecbe9 commit 823c7ee

29 files changed

+147
-100
lines changed

src/libnum/bigint.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,7 @@ impl ToStrRadix for BigUint {
672672
s.push_str("0".repeat(l - ss.len()));
673673
s.push_str(ss);
674674
}
675-
s.as_slice().trim_left_chars(&'0').to_owned()
675+
s.as_slice().trim_left_chars('0').to_owned()
676676
}
677677
}
678678
}

src/librustc/front/config.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ pub fn strip_items(krate: ast::Crate,
4747
ctxt.fold_crate(krate)
4848
}
4949

50-
fn filter_view_item<'r>(cx: &Context, view_item: &'r ast::ViewItem)
50+
fn filter_view_item<'r>(cx: &mut Context, view_item: &'r ast::ViewItem)
5151
-> Option<&'r ast::ViewItem> {
5252
if view_item_in_cfg(cx, view_item) {
5353
Some(view_item)
@@ -72,7 +72,7 @@ fn fold_mod(cx: &mut Context, m: &ast::Mod) -> ast::Mod {
7272
}
7373
}
7474

75-
fn filter_foreign_item(cx: &Context, item: @ast::ForeignItem)
75+
fn filter_foreign_item(cx: &mut Context, item: @ast::ForeignItem)
7676
-> Option<@ast::ForeignItem> {
7777
if foreign_item_in_cfg(cx, item) {
7878
Some(item)
@@ -144,7 +144,7 @@ fn fold_item_underscore(cx: &mut Context, item: &ast::Item_) -> ast::Item_ {
144144
fold::noop_fold_item_underscore(&item, cx)
145145
}
146146

147-
fn fold_struct(cx: &Context, def: &ast::StructDef) -> @ast::StructDef {
147+
fn fold_struct(cx: &mut Context, def: &ast::StructDef) -> @ast::StructDef {
148148
let mut fields = def.fields.iter().map(|c| c.clone()).filter(|m| {
149149
(cx.in_cfg)(m.node.attrs.as_slice())
150150
});
@@ -156,7 +156,7 @@ fn fold_struct(cx: &Context, def: &ast::StructDef) -> @ast::StructDef {
156156
}
157157
}
158158

159-
fn retain_stmt(cx: &Context, stmt: @ast::Stmt) -> bool {
159+
fn retain_stmt(cx: &mut Context, stmt: @ast::Stmt) -> bool {
160160
match stmt.node {
161161
ast::StmtDecl(decl, _) => {
162162
match decl.node {
@@ -189,23 +189,23 @@ fn fold_block(cx: &mut Context, b: ast::P<ast::Block>) -> ast::P<ast::Block> {
189189
})
190190
}
191191

192-
fn item_in_cfg(cx: &Context, item: &ast::Item) -> bool {
192+
fn item_in_cfg(cx: &mut Context, item: &ast::Item) -> bool {
193193
return (cx.in_cfg)(item.attrs.as_slice());
194194
}
195195

196-
fn foreign_item_in_cfg(cx: &Context, item: &ast::ForeignItem) -> bool {
196+
fn foreign_item_in_cfg(cx: &mut Context, item: &ast::ForeignItem) -> bool {
197197
return (cx.in_cfg)(item.attrs.as_slice());
198198
}
199199

200-
fn view_item_in_cfg(cx: &Context, item: &ast::ViewItem) -> bool {
200+
fn view_item_in_cfg(cx: &mut Context, item: &ast::ViewItem) -> bool {
201201
return (cx.in_cfg)(item.attrs.as_slice());
202202
}
203203

204-
fn method_in_cfg(cx: &Context, meth: &ast::Method) -> bool {
204+
fn method_in_cfg(cx: &mut Context, meth: &ast::Method) -> bool {
205205
return (cx.in_cfg)(meth.attrs.as_slice());
206206
}
207207

208-
fn trait_method_in_cfg(cx: &Context, meth: &ast::TraitMethod) -> bool {
208+
fn trait_method_in_cfg(cx: &mut Context, meth: &ast::TraitMethod) -> bool {
209209
match *meth {
210210
ast::Required(ref meth) => (cx.in_cfg)(meth.attrs.as_slice()),
211211
ast::Provided(meth) => (cx.in_cfg)(meth.attrs.as_slice())

src/librustc/metadata/encoder.rs

+33-25
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ pub struct EncodeContext<'a> {
8484
pub non_inlineable_statics: &'a RefCell<NodeSet>,
8585
pub link_meta: &'a LinkMeta,
8686
pub cstore: &'a cstore::CStore,
87-
pub encode_inlined_item: EncodeInlinedItem<'a>,
87+
pub encode_inlined_item: RefCell<EncodeInlinedItem<'a>>,
8888
pub type_abbrevs: tyencode::abbrev_map,
8989
}
9090

@@ -765,8 +765,8 @@ fn encode_info_for_method(ecx: &EncodeContext,
765765
if num_params > 0u ||
766766
is_default_impl ||
767767
should_inline(ast_method.attrs.as_slice()) {
768-
(ecx.encode_inlined_item)(
769-
ecx, ebml_w, IIMethodRef(local_def(parent_id), false, ast_method));
768+
encode_inlined_item(ecx, ebml_w,
769+
IIMethodRef(local_def(parent_id), false, ast_method));
770770
} else {
771771
encode_symbol(ecx, ebml_w, m.def_id.node);
772772
}
@@ -775,6 +775,14 @@ fn encode_info_for_method(ecx: &EncodeContext,
775775
ebml_w.end_tag();
776776
}
777777

778+
fn encode_inlined_item(ecx: &EncodeContext,
779+
ebml_w: &mut Encoder,
780+
ii: InlinedItemRef) {
781+
let mut eii = ecx.encode_inlined_item.borrow_mut();
782+
let eii: &mut EncodeInlinedItem = &mut *eii;
783+
(*eii)(ecx, ebml_w, ii)
784+
}
785+
778786
fn style_fn_family(s: FnStyle) -> char {
779787
match s {
780788
UnsafeFn => 'u',
@@ -870,7 +878,7 @@ fn encode_info_for_item(ecx: &EncodeContext,
870878
let inlineable = !ecx.non_inlineable_statics.borrow().contains(&item.id);
871879

872880
if inlineable {
873-
(ecx.encode_inlined_item)(ecx, ebml_w, IIItemRef(item));
881+
encode_inlined_item(ecx, ebml_w, IIItemRef(item));
874882
}
875883
encode_visibility(ebml_w, vis);
876884
ebml_w.end_tag();
@@ -886,7 +894,7 @@ fn encode_info_for_item(ecx: &EncodeContext,
886894
encode_path(ebml_w, path);
887895
encode_attributes(ebml_w, item.attrs.as_slice());
888896
if tps_len > 0u || should_inline(item.attrs.as_slice()) {
889-
(ecx.encode_inlined_item)(ecx, ebml_w, IIItemRef(item));
897+
encode_inlined_item(ecx, ebml_w, IIItemRef(item));
890898
} else {
891899
encode_symbol(ecx, ebml_w, item.id);
892900
}
@@ -944,7 +952,7 @@ fn encode_info_for_item(ecx: &EncodeContext,
944952
for v in (*enum_definition).variants.iter() {
945953
encode_variant_id(ebml_w, local_def(v.node.id));
946954
}
947-
(ecx.encode_inlined_item)(ecx, ebml_w, IIItemRef(item));
955+
encode_inlined_item(ecx, ebml_w, IIItemRef(item));
948956
encode_path(ebml_w, path);
949957

950958
// Encode inherent implementations for this enumeration.
@@ -992,7 +1000,7 @@ fn encode_info_for_item(ecx: &EncodeContext,
9921000
needs to know*/
9931001
encode_struct_fields(ebml_w, fields.as_slice(), def_id);
9941002

995-
(ecx.encode_inlined_item)(ecx, ebml_w, IIItemRef(item));
1003+
encode_inlined_item(ecx, ebml_w, IIItemRef(item));
9961004

9971005
// Encode inherent implementations for this structure.
9981006
encode_inherent_implementations(ecx, ebml_w, def_id);
@@ -1162,8 +1170,8 @@ fn encode_info_for_item(ecx: &EncodeContext,
11621170
encode_bounds_and_type(ebml_w, ecx, &tpt);
11631171
}
11641172
encode_method_sort(ebml_w, 'p');
1165-
(ecx.encode_inlined_item)(
1166-
ecx, ebml_w, IIMethodRef(def_id, true, m));
1173+
encode_inlined_item(ecx, ebml_w,
1174+
IIMethodRef(def_id, true, m));
11671175
}
11681176
}
11691177

@@ -1199,7 +1207,7 @@ fn encode_info_for_foreign_item(ecx: &EncodeContext,
11991207
&lookup_item_type(ecx.tcx,local_def(nitem.id)));
12001208
encode_name(ebml_w, nitem.ident.name);
12011209
if abi == abi::RustIntrinsic {
1202-
(ecx.encode_inlined_item)(ecx, ebml_w, IIForeignRef(nitem));
1210+
encode_inlined_item(ecx, ebml_w, IIForeignRef(nitem));
12031211
} else {
12041212
encode_symbol(ecx, ebml_w, nitem.id);
12051213
}
@@ -1531,12 +1539,12 @@ fn encode_macro_registrar_fn(ecx: &EncodeContext, ebml_w: &mut Encoder) {
15311539
}
15321540
}
15331541

1534-
struct MacroDefVisitor<'a, 'b> {
1535-
ecx: &'a EncodeContext<'a>,
1536-
ebml_w: &'a mut Encoder<'b>
1542+
struct MacroDefVisitor<'a, 'b, 'c> {
1543+
ecx: &'a EncodeContext<'b>,
1544+
ebml_w: &'a mut Encoder<'c>
15371545
}
15381546

1539-
impl<'a, 'b> Visitor<()> for MacroDefVisitor<'a, 'b> {
1547+
impl<'a, 'b, 'c> Visitor<()> for MacroDefVisitor<'a, 'b, 'c> {
15401548
fn visit_item(&mut self, item: &Item, _: ()) {
15411549
match item.node {
15421550
ItemMac(..) => {
@@ -1552,9 +1560,9 @@ impl<'a, 'b> Visitor<()> for MacroDefVisitor<'a, 'b> {
15521560
}
15531561
}
15541562

1555-
fn encode_macro_defs(ecx: &EncodeContext,
1556-
krate: &Crate,
1557-
ebml_w: &mut Encoder) {
1563+
fn encode_macro_defs<'a>(ecx: &'a EncodeContext,
1564+
krate: &Crate,
1565+
ebml_w: &'a mut Encoder) {
15581566
ebml_w.start_tag(tag_exported_macros);
15591567
{
15601568
let mut visitor = MacroDefVisitor {
@@ -1566,12 +1574,12 @@ fn encode_macro_defs(ecx: &EncodeContext,
15661574
ebml_w.end_tag();
15671575
}
15681576

1569-
struct ImplVisitor<'a,'b> {
1570-
ecx: &'a EncodeContext<'a>,
1571-
ebml_w: &'a mut Encoder<'b>,
1577+
struct ImplVisitor<'a,'b,'c> {
1578+
ecx: &'a EncodeContext<'b>,
1579+
ebml_w: &'a mut Encoder<'c>,
15721580
}
15731581

1574-
impl<'a,'b> Visitor<()> for ImplVisitor<'a,'b> {
1582+
impl<'a,'b,'c> Visitor<()> for ImplVisitor<'a,'b,'c> {
15751583
fn visit_item(&mut self, item: &Item, _: ()) {
15761584
match item.node {
15771585
ItemImpl(_, Some(ref trait_ref), _, _) => {
@@ -1604,9 +1612,9 @@ impl<'a,'b> Visitor<()> for ImplVisitor<'a,'b> {
16041612
/// * Destructors (implementations of the Drop trait).
16051613
///
16061614
/// * Implementations of traits not defined in this crate.
1607-
fn encode_impls(ecx: &EncodeContext,
1608-
krate: &Crate,
1609-
ebml_w: &mut Encoder) {
1615+
fn encode_impls<'a>(ecx: &'a EncodeContext,
1616+
krate: &Crate,
1617+
ebml_w: &'a mut Encoder) {
16101618
ebml_w.start_tag(tag_impls);
16111619

16121620
{
@@ -1731,7 +1739,7 @@ fn encode_metadata_inner(wr: &mut MemWriter, parms: EncodeParams, krate: &Crate)
17311739
non_inlineable_statics: non_inlineable_statics,
17321740
link_meta: link_meta,
17331741
cstore: cstore,
1734-
encode_inlined_item: encode_inlined_item,
1742+
encode_inlined_item: RefCell::new(encode_inlined_item),
17351743
type_abbrevs: RefCell::new(HashMap::new()),
17361744
};
17371745

src/librustc/metadata/filesearch.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,9 @@ impl<'a> FileSearch<'a> {
9292
match fs::readdir(lib_search_path) {
9393
Ok(files) => {
9494
let mut rslt = FileDoesntMatch;
95-
let is_rlib = |p: & &Path| {
95+
fn is_rlib(p: & &Path) -> bool {
9696
p.extension_str() == Some("rlib")
97-
};
97+
}
9898
// Reading metadata out of rlibs is faster, and if we find both
9999
// an rlib and a dylib we only read one of the files of
100100
// metadata, so in the name of speed, bring all rlib files to

src/librustc/middle/lint.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1164,7 +1164,7 @@ fn check_item_non_camel_case_types(cx: &Context, it: &ast::Item) {
11641164
fn is_camel_case(ident: ast::Ident) -> bool {
11651165
let ident = token::get_ident(ident);
11661166
assert!(!ident.get().is_empty());
1167-
let ident = ident.get().trim_chars(&'_');
1167+
let ident = ident.get().trim_chars('_');
11681168

11691169
// start with a non-lowercase letter rather than non-uppercase
11701170
// ones (some scripts don't have a concept of upper/lowercase)

src/librustc/middle/privacy.rs

+9-8
Original file line numberDiff line numberDiff line change
@@ -1104,34 +1104,34 @@ impl<'a> SanePrivacyVisitor<'a> {
11041104
/// control over anything so this forbids any mention of any visibility
11051105
fn check_all_inherited(&self, item: &ast::Item) {
11061106
let tcx = self.tcx;
1107-
let check_inherited = |sp: Span, vis: ast::Visibility| {
1107+
fn check_inherited(tcx: &ty::ctxt, sp: Span, vis: ast::Visibility) {
11081108
if vis != ast::Inherited {
11091109
tcx.sess.span_err(sp, "visibility has no effect inside functions");
11101110
}
1111-
};
1111+
}
11121112
let check_struct = |def: &@ast::StructDef| {
11131113
for f in def.fields.iter() {
11141114
match f.node.kind {
1115-
ast::NamedField(_, p) => check_inherited(f.span, p),
1115+
ast::NamedField(_, p) => check_inherited(tcx, f.span, p),
11161116
ast::UnnamedField(..) => {}
11171117
}
11181118
}
11191119
};
1120-
check_inherited(item.span, item.vis);
1120+
check_inherited(tcx, item.span, item.vis);
11211121
match item.node {
11221122
ast::ItemImpl(_, _, _, ref methods) => {
11231123
for m in methods.iter() {
1124-
check_inherited(m.span, m.vis);
1124+
check_inherited(tcx, m.span, m.vis);
11251125
}
11261126
}
11271127
ast::ItemForeignMod(ref fm) => {
11281128
for i in fm.items.iter() {
1129-
check_inherited(i.span, i.vis);
1129+
check_inherited(tcx, i.span, i.vis);
11301130
}
11311131
}
11321132
ast::ItemEnum(ref def, _) => {
11331133
for v in def.variants.iter() {
1134-
check_inherited(v.span, v.node.vis);
1134+
check_inherited(tcx, v.span, v.node.vis);
11351135

11361136
match v.node.kind {
11371137
ast::StructVariantKind(ref s) => check_struct(s),
@@ -1146,7 +1146,8 @@ impl<'a> SanePrivacyVisitor<'a> {
11461146
for m in methods.iter() {
11471147
match *m {
11481148
ast::Required(..) => {}
1149-
ast::Provided(ref m) => check_inherited(m.span, m.vis),
1149+
ast::Provided(ref m) => check_inherited(tcx, m.span,
1150+
m.vis),
11501151
}
11511152
}
11521153
}

src/libstd/io/net/ip.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,9 @@ impl<'a> Parser<'a> {
107107
}
108108

109109
// Return result of first successful parser
110-
fn read_or<T>(&mut self, parsers: &[|&mut Parser| -> Option<T>])
110+
fn read_or<T>(&mut self, parsers: &mut [|&mut Parser| -> Option<T>])
111111
-> Option<T> {
112-
for pf in parsers.iter() {
112+
for pf in parsers.mut_iter() {
113113
match self.read_atomically(|p: &mut Parser| (*pf)(p)) {
114114
Some(r) => return Some(r),
115115
None => {}
@@ -305,7 +305,7 @@ impl<'a> Parser<'a> {
305305
fn read_ip_addr(&mut self) -> Option<IpAddr> {
306306
let ipv4_addr = |p: &mut Parser| p.read_ipv4_addr();
307307
let ipv6_addr = |p: &mut Parser| p.read_ipv6_addr();
308-
self.read_or([ipv4_addr, ipv6_addr])
308+
self.read_or(&mut [ipv4_addr, ipv6_addr])
309309
}
310310

311311
fn read_socket_addr(&mut self) -> Option<SocketAddr> {
@@ -318,7 +318,7 @@ impl<'a> Parser<'a> {
318318
p.read_seq_3::<char, IpAddr, char>(open_br, ip_addr, clos_br)
319319
.map(|t| match t { (_, ip, _) => ip })
320320
};
321-
p.read_or([ipv4_p, ipv6_p])
321+
p.read_or(&mut [ipv4_p, ipv6_p])
322322
};
323323
let colon = |p: &mut Parser| p.read_given_char(':');
324324
let port = |p: &mut Parser| p.read_number(10, 5, 0x10000).map(|n| n as u16);

src/libstd/iter.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1241,7 +1241,7 @@ pub struct Map<'a, A, B, T> {
12411241

12421242
impl<'a, A, B, T> Map<'a, A, B, T> {
12431243
#[inline]
1244-
fn do_map(&self, elt: Option<A>) -> Option<B> {
1244+
fn do_map(&mut self, elt: Option<A>) -> Option<B> {
12451245
match elt {
12461246
Some(a) => Some((self.f)(a)),
12471247
_ => None
@@ -1824,7 +1824,7 @@ pub struct Inspect<'a, A, T> {
18241824

18251825
impl<'a, A, T> Inspect<'a, A, T> {
18261826
#[inline]
1827-
fn do_inspect(&self, elt: Option<A>) -> Option<A> {
1827+
fn do_inspect(&mut self, elt: Option<A>) -> Option<A> {
18281828
match elt {
18291829
Some(ref a) => (self.f)(a),
18301830
None => ()
@@ -2910,7 +2910,7 @@ mod tests {
29102910
let xs = [1, 2, 3, 4, 5];
29112911

29122912
// test .map and .inspect that don't implement Clone
2913-
let it = xs.iter().inspect(|_| {});
2913+
let mut it = xs.iter().inspect(|_| {});
29142914
assert_eq!(xs.len(), it.indexable());
29152915
for (i, elt) in xs.iter().enumerate() {
29162916
assert_eq!(Some(elt), it.idx(i));
@@ -2922,7 +2922,7 @@ mod tests {
29222922
fn test_random_access_map() {
29232923
let xs = [1, 2, 3, 4, 5];
29242924

2925-
let it = xs.iter().map(|x| *x);
2925+
let mut it = xs.iter().map(|x| *x);
29262926
assert_eq!(xs.len(), it.indexable());
29272927
for (i, elt) in xs.iter().enumerate() {
29282928
assert_eq!(Some(*elt), it.idx(i));

src/libstd/option.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -873,9 +873,9 @@ mod tests {
873873
assert_eq!(v, None);
874874

875875
// test that it does not take more elements than it needs
876-
let functions = [|| Some(()), || None, || fail!()];
876+
let mut functions = [|| Some(()), || None, || fail!()];
877877

878-
let v: Option<~[()]> = collect(functions.iter().map(|f| (*f)()));
878+
let v: Option<~[()]> = collect(functions.mut_iter().map(|f| (*f)()));
879879

880880
assert_eq!(v, None);
881881
}

0 commit comments

Comments
 (0)