Skip to content

Commit 1a3dcde

Browse files
committed
---
yaml --- r: 137198 b: refs/heads/release-prep c: 0262066 h: refs/heads/master v: v3
1 parent d8f2c8c commit 1a3dcde

File tree

8 files changed

+132
-36
lines changed

8 files changed

+132
-36
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,4 @@ refs/tags/0.9: 36870b185fc5f5486636d4515f0e22677493f225
2929
refs/tags/0.10: ac33f2b15782272ae348dbd7b14b8257b2148b5a
3030
refs/heads/libuv-update-temp-branch: 6ed22c618766f1f2a2e108eef8ce3f51be0f70b7
3131
refs/tags/0.11.0: e1247cb1d0d681be034adb4b558b5a0c0d5720f9
32-
refs/heads/release-prep: fe8f43030a710eeee1043061145abf2b47c5e601
32+
refs/heads/release-prep: 026206695af8355d0b52000ca0f491a1ab5b051d

branches/release-prep/src/libcollections/str.rs

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -778,13 +778,11 @@ pub trait StrAllocating: Str {
778778
/// Returns the Levenshtein Distance between two strings.
779779
fn lev_distance(&self, t: &str) -> uint {
780780
let me = self.as_slice();
781-
let slen = me.len();
782-
let tlen = t.len();
781+
if me.is_empty() { return t.char_len(); }
782+
if t.is_empty() { return me.char_len(); }
783783

784-
if slen == 0 { return tlen; }
785-
if tlen == 0 { return slen; }
786-
787-
let mut dcol = Vec::from_fn(tlen + 1, |x| x);
784+
let mut dcol = Vec::from_fn(t.len() + 1, |x| x);
785+
let mut t_last = 0;
788786

789787
for (i, sc) in me.chars().enumerate() {
790788

@@ -799,15 +797,15 @@ pub trait StrAllocating: Str {
799797
*dcol.get_mut(j + 1) = current;
800798
} else {
801799
*dcol.get_mut(j + 1) = cmp::min(current, next);
802-
*dcol.get_mut(j + 1) = cmp::min(dcol[j + 1],
803-
dcol[j]) + 1;
800+
*dcol.get_mut(j + 1) = cmp::min(dcol[j + 1], dcol[j]) + 1;
804801
}
805802

806803
current = next;
804+
t_last = j;
807805
}
808806
}
809807

810-
return dcol[tlen];
808+
dcol[t_last + 1]
811809
}
812810

813811
/// Returns an iterator over the string in Unicode Normalization Form D
@@ -1878,6 +1876,27 @@ mod tests {
18781876
assert_eq!(words, vec!["Märy", "häd", "ä", "little", "lämb", "Little", "lämb"])
18791877
}
18801878

1879+
#[test]
1880+
fn test_lev_distance() {
1881+
use std::char::{ from_u32, MAX };
1882+
// Test bytelength agnosticity
1883+
for c in range(0u32, MAX as u32)
1884+
.filter_map(|i| from_u32(i))
1885+
.map(|i| String::from_char(1, i)) {
1886+
assert_eq!(c[].lev_distance(c[]), 0);
1887+
}
1888+
1889+
let a = "\nMäry häd ä little lämb\n\nLittle lämb\n";
1890+
let b = "\nMary häd ä little lämb\n\nLittle lämb\n";
1891+
let c = "Mary häd ä little lämb\n\nLittle lämb\n";
1892+
assert_eq!(a.lev_distance(b), 1);
1893+
assert_eq!(b.lev_distance(a), 1);
1894+
assert_eq!(a.lev_distance(c), 2);
1895+
assert_eq!(c.lev_distance(a), 2);
1896+
assert_eq!(b.lev_distance(c), 1);
1897+
assert_eq!(c.lev_distance(b), 1);
1898+
}
1899+
18811900
#[test]
18821901
fn test_nfd_chars() {
18831902
macro_rules! t {

branches/release-prep/src/libcore/atomic.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -382,9 +382,9 @@ impl AtomicInt {
382382
/// # Examples
383383
///
384384
/// ```
385-
/// use std::sync::atomic::{AtomicUint, SeqCst};
385+
/// use std::sync::atomic::{AtomicInt, SeqCst};
386386
///
387-
/// let foo = AtomicUint::new(0b101101);
387+
/// let foo = AtomicInt::new(0b101101);
388388
/// assert_eq!(0b101101, foo.fetch_and(0b110011, SeqCst));
389389
/// assert_eq!(0b100001, foo.load(SeqCst));
390390
#[inline]
@@ -397,9 +397,9 @@ impl AtomicInt {
397397
/// # Examples
398398
///
399399
/// ```
400-
/// use std::sync::atomic::{AtomicUint, SeqCst};
400+
/// use std::sync::atomic::{AtomicInt, SeqCst};
401401
///
402-
/// let foo = AtomicUint::new(0b101101);
402+
/// let foo = AtomicInt::new(0b101101);
403403
/// assert_eq!(0b101101, foo.fetch_or(0b110011, SeqCst));
404404
/// assert_eq!(0b111111, foo.load(SeqCst));
405405
#[inline]
@@ -412,9 +412,9 @@ impl AtomicInt {
412412
/// # Examples
413413
///
414414
/// ```
415-
/// use std::sync::atomic::{AtomicUint, SeqCst};
415+
/// use std::sync::atomic::{AtomicInt, SeqCst};
416416
///
417-
/// let foo = AtomicUint::new(0b101101);
417+
/// let foo = AtomicInt::new(0b101101);
418418
/// assert_eq!(0b101101, foo.fetch_xor(0b110011, SeqCst));
419419
/// assert_eq!(0b011110, foo.load(SeqCst));
420420
#[inline]

branches/release-prep/src/librustc/middle/trans/reflect.rs

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,22 @@ impl<'a, 'blk, 'tcx> Reflector<'a, 'blk, 'tcx> {
127127
self.visit(name, []);
128128
}
129129

130+
fn visit_closure_ty(&mut self, fty: &ty::ClosureTy, is_unboxed: bool) {
131+
let pureval = ast_fn_style_constant(fty.fn_style);
132+
let sigilval = match fty.store {
133+
ty::UniqTraitStore => 2u,
134+
ty::RegionTraitStore(..) => 4u,
135+
};
136+
let retval = if ty::type_is_bot(fty.sig.output) {0u} else {1u};
137+
let extra = vec!(self.c_uint(pureval),
138+
self.c_uint(sigilval),
139+
self.c_uint(fty.sig.inputs.len()),
140+
self.c_uint(retval));
141+
self.visit("enter_fn", extra.as_slice());
142+
self.visit_sig(retval, &fty.sig, is_unboxed);
143+
self.visit("leave_fn", extra.as_slice());
144+
}
145+
130146
// Entrypoint
131147
pub fn visit_ty(&mut self, t: ty::t) {
132148
let bcx = self.bcx;
@@ -247,20 +263,8 @@ impl<'a, 'blk, 'tcx> Reflector<'a, 'blk, 'tcx> {
247263

248264
// FIXME (#2594): fetch constants out of intrinsic
249265
// FIXME (#4809): visitor should break out bare fns from other fns
250-
ty::ty_closure(ref fty) => {
251-
let pureval = ast_fn_style_constant(fty.fn_style);
252-
let sigilval = match fty.store {
253-
ty::UniqTraitStore => 2u,
254-
ty::RegionTraitStore(..) => 4u,
255-
};
256-
let retval = if ty::type_is_bot(fty.sig.output) {0u} else {1u};
257-
let extra = vec!(self.c_uint(pureval),
258-
self.c_uint(sigilval),
259-
self.c_uint(fty.sig.inputs.len()),
260-
self.c_uint(retval));
261-
self.visit("enter_fn", extra.as_slice());
262-
self.visit_sig(retval, &fty.sig);
263-
self.visit("leave_fn", extra.as_slice());
266+
ty::ty_closure(box ref fty) => {
267+
self.visit_closure_ty(fty, false);
264268
}
265269

266270
// FIXME (#2594): fetch constants out of intrinsic:: for the
@@ -274,7 +278,7 @@ impl<'a, 'blk, 'tcx> Reflector<'a, 'blk, 'tcx> {
274278
self.c_uint(fty.sig.inputs.len()),
275279
self.c_uint(retval));
276280
self.visit("enter_fn", extra.as_slice());
277-
self.visit_sig(retval, &fty.sig);
281+
self.visit_sig(retval, &fty.sig, false);
278282
self.visit("leave_fn", extra.as_slice());
279283
}
280284

@@ -388,16 +392,30 @@ impl<'a, 'blk, 'tcx> Reflector<'a, 'blk, 'tcx> {
388392
// Miscellaneous extra types
389393
ty::ty_infer(_) => self.leaf("infer"),
390394
ty::ty_err => self.leaf("err"),
391-
ty::ty_unboxed_closure(..) => self.leaf("err"),
395+
ty::ty_unboxed_closure(ref def_id, _) => {
396+
let closure_map = tcx.unboxed_closures.borrow();
397+
let fty = &closure_map.find(def_id).unwrap().closure_type;
398+
self.visit_closure_ty(fty, true);
399+
}
392400
ty::ty_param(ref p) => {
393401
let extra = vec!(self.c_uint(p.idx));
394402
self.visit("param", extra.as_slice())
395403
}
396404
}
397405
}
398406

399-
pub fn visit_sig(&mut self, retval: uint, sig: &ty::FnSig) {
400-
for (i, arg) in sig.inputs.iter().enumerate() {
407+
pub fn visit_sig(&mut self, retval: uint, sig: &ty::FnSig, is_unboxed: bool) {
408+
let args = if is_unboxed {
409+
match ty::get(sig.inputs[0]).sty {
410+
ty::ty_tup(ref contents) => contents.iter(),
411+
ty::ty_nil => [].iter(),
412+
_ => unreachable!()
413+
}
414+
} else {
415+
sig.inputs.iter()
416+
};
417+
418+
for (i, arg) in args.enumerate() {
401419
let modeval = 5u; // "by copy"
402420
let extra = vec!(self.c_uint(i),
403421
self.c_uint(modeval),

branches/release-prep/src/librustc/middle/typeck/infer/error_reporting.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -869,6 +869,19 @@ impl<'a, 'tcx> ErrorReporting for InferCtxt<'a, 'tcx> {
869869
ast::TypeImplItem(_) => None,
870870
}
871871
},
872+
ast_map::NodeTraitItem(ref item) => {
873+
match **item {
874+
ast::ProvidedMethod(ref m) => {
875+
Some((m.pe_fn_decl(),
876+
m.pe_generics(),
877+
m.pe_fn_style(),
878+
m.pe_ident(),
879+
Some(&m.pe_explicit_self().node),
880+
m.span))
881+
}
882+
_ => None
883+
}
884+
}
872885
_ => None
873886
},
874887
None => None

branches/release-prep/src/libstd/io/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1293,10 +1293,10 @@ impl<'a> Writer for Box<Writer+'a> {
12931293

12941294
impl<'a> Writer for &'a mut Writer+'a {
12951295
#[inline]
1296-
fn write(&mut self, buf: &[u8]) -> IoResult<()> { self.write(buf) }
1296+
fn write(&mut self, buf: &[u8]) -> IoResult<()> { (**self).write(buf) }
12971297

12981298
#[inline]
1299-
fn flush(&mut self) -> IoResult<()> { self.flush() }
1299+
fn flush(&mut self) -> IoResult<()> { (**self).flush() }
13001300
}
13011301

13021302
/// A `RefWriter` is a struct implementing `Writer` which contains a reference
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
// Test that regionck suggestions in a provided method of a trait
12+
// don't ICE
13+
14+
trait Foo<'a> {
15+
fn foo(&'a self);
16+
fn bar(&self) {
17+
self.foo();
18+
//~^ ERROR mismatched types: expected `&'a Self`, found `&Self` (lifetime mismatch)
19+
}
20+
}
21+
22+
fn main() {}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
#![feature(unboxed_closures)]
12+
13+
// Test generating type visitor glue for unboxed closures
14+
15+
extern crate debug;
16+
17+
fn main() {
18+
let expected = "fn(); fn(uint, uint) -> uint; fn() -> !";
19+
let result = format!("{:?}; {:?}; {:?}",
20+
|:| {},
21+
|&: x: uint, y: uint| { x + y },
22+
|&mut:| -> ! { fail!() });
23+
assert_eq!(expected, result.as_slice());
24+
}

0 commit comments

Comments
 (0)