Skip to content

Commit 81c09f5

Browse files
committed
---
yaml --- r: 137010 b: refs/heads/dist-snap c: 07aeac8 h: refs/heads/master v: v3
1 parent 6d5012d commit 81c09f5

File tree

9 files changed

+119
-58
lines changed

9 files changed

+119
-58
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ refs/heads/try: 189b7332968972f34cdbbbd9b62d97ababf53059
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: 147ecfdd8221e4a4d4e090486829a06da1e0ca3c
9-
refs/heads/dist-snap: 6f6d13a7c7cb2faa12c0905b094024521a86c165
9+
refs/heads/dist-snap: 07aeac8ac80a9af809a022626773c903d2116bf7
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503
1212
refs/heads/try3: 9387340aab40a73e8424c48fd42f0c521a4875c0

branches/dist-snap/src/doc/guide.md

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -961,7 +961,7 @@ struct Point {
961961
}
962962

963963
fn main() {
964-
let origin = Point { x: 0i, y: 0i };
964+
let origin = Point { x: 0i, y: 0i };
965965

966966
println!("The origin is at ({}, {})", origin.x, origin.y);
967967
}
@@ -988,7 +988,7 @@ struct Point {
988988
}
989989
990990
fn main() {
991-
let mut point = Point { x: 0i, y: 0i };
991+
let mut point = Point { x: 0i, y: 0i };
992992
993993
point.x = 5;
994994
@@ -1140,13 +1140,13 @@ You can have any number of values in an enum:
11401140
```{rust}
11411141
enum OptionalColor {
11421142
Color(int, int, int),
1143-
Missing
1143+
Missing,
11441144
}
11451145
```
11461146

11471147
Enums with values are quite useful, but as I mentioned, they're even more
11481148
useful when they're generic across types. But before we get to generics, let's
1149-
talk about how to fix this big `if`/`else` statements we've been writing. We'll
1149+
talk about how to fix these big `if`/`else` statements we've been writing. We'll
11501150
do that with `match`.
11511151

11521152
# Match
@@ -1561,7 +1561,7 @@ println!("The second name is: {}", names[1]);
15611561

15621562
These subscripts start at zero, like in most programming languages, so the
15631563
first name is `names[0]` and the second name is `names[1]`. The above example
1564-
prints `The second name is Brian`.
1564+
prints `The second name is: Brian`.
15651565

15661566
There's a whole lot more to vectors, but that's enough to get started. We have
15671567
now learned all of the most basic Rust concepts. We're ready to start building
@@ -2084,7 +2084,7 @@ fn main() {
20842084
match cmp(input, secret_number) {
20852085
Less => println!("Too small!"),
20862086
Greater => println!("Too big!"),
2087-
Equal => { println!("You win!"); },
2087+
Equal => println!("You win!"),
20882088
}
20892089
}
20902090
@@ -2176,14 +2176,12 @@ fn main() {
21762176
.expect("Failed to read line");
21772177
let input_num: Option<uint> = from_str(input.as_slice());
21782178
2179-
2180-
21812179
println!("You guessed: {}", input_num);
21822180
21832181
match cmp(input_num, secret_number) {
21842182
Less => println!("Too small!"),
21852183
Greater => println!("Too big!"),
2186-
Equal => { println!("You win!"); },
2184+
Equal => println!("You win!"),
21872185
}
21882186
}
21892187
@@ -2241,7 +2239,7 @@ fn main() {
22412239
match cmp(num, secret_number) {
22422240
Less => println!("Too small!"),
22432241
Greater => println!("Too big!"),
2244-
Equal => { println!("You win!"); },
2242+
Equal => println!("You win!"),
22452243
}
22462244
}
22472245
@@ -2307,7 +2305,7 @@ fn main() {
23072305
match cmp(num, secret_number) {
23082306
Less => println!("Too small!"),
23092307
Greater => println!("Too big!"),
2310-
Equal => { println!("You win!"); },
2308+
Equal => println!("You win!"),
23112309
}
23122310
}
23132311
@@ -2382,7 +2380,7 @@ fn main() {
23822380
match cmp(num, secret_number) {
23832381
Less => println!("Too small!"),
23842382
Greater => println!("Too big!"),
2385-
Equal => { println!("You win!"); },
2383+
Equal => println!("You win!"),
23862384
}
23872385
}
23882386
}
@@ -2619,7 +2617,7 @@ Rust's more unique features.
26192617

26202618
Rust features a strong module system, but it works a bit differently than in
26212619
other programming languages. Rust's module system has two main components:
2622-
**crate**s, and **module**s.
2620+
**crate**s and **module**s.
26232621

26242622
A crate is Rust's unit of independent compilation. Rust always compiles one
26252623
crate at a time, producing either a library or an executable. However, executables
@@ -2640,6 +2638,7 @@ Enough talk, let's build something! Let's make a new project called `modules`.
26402638
```{bash,ignore}
26412639
$ cd ~/projects
26422640
$ cargo new modules --bin
2641+
$ cd modules
26432642
```
26442643

26452644
Let's double check our work by compiling:
@@ -3622,7 +3621,7 @@ let x = box 5i;
36223621
```
36233622

36243623
This allocates an integer `5` on the heap, and creates a binding `x` that
3625-
refers to it.. The great thing about boxed pointers is that we don't have to
3624+
refers to it. The great thing about boxed pointers is that we don't have to
36263625
manually free this allocation! If we write
36273626

36283627
```{rust}
@@ -3994,7 +3993,7 @@ Let's make a closure:
39943993
```{rust}
39953994
let add_one = |x| { 1i + x };
39963995
3997-
println!("The 5 plus 1 is {}.", add_one(5i));
3996+
println!("The sum of 5 plus 1 is {}.", add_one(5i));
39983997
```
39993998

40003999
We create a closure using the `|...| { ... }` syntax, and then we create a
@@ -4089,7 +4088,7 @@ fn main() {
40894088
}
40904089
```
40914090

4092-
Let's break example down, starting with `main`:
4091+
Let's break the example down, starting with `main`:
40934092

40944093
```{rust}
40954094
let square = |x: int| { x * x };
@@ -4210,7 +4209,7 @@ loop {
42104209
match range.next() {
42114210
Some(x) => {
42124211
println!("{}", x);
4213-
}
4212+
},
42144213
None => { break }
42154214
}
42164215
}

branches/dist-snap/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/dist-snap/src/librustc/middle/resolve.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5852,11 +5852,8 @@ impl<'a> Resolver<'a> {
58525852
visit::walk_expr(self, expr);
58535853
}
58545854

5855-
ExprFnBlock(_, ref fn_decl, ref block) => {
5856-
// NOTE(stage0): After snapshot, change to:
5857-
//
5858-
//self.capture_mode_map.insert(expr.id, capture_clause);
5859-
self.capture_mode_map.insert(expr.id, ast::CaptureByRef);
5855+
ExprFnBlock(capture_clause, ref fn_decl, ref block) => {
5856+
self.capture_mode_map.insert(expr.id, capture_clause);
58605857
self.resolve_function(ClosureRibKind(expr.id, ast::DUMMY_NODE_ID),
58615858
Some(&**fn_decl), NoTypeParameters,
58625859
&**block);

branches/dist-snap/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/dist-snap/src/libsyntax/codemap.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -291,10 +291,8 @@ impl FileMap {
291291

292292
/// get a line from the list of pre-computed line-beginnings
293293
///
294-
/// NOTE(stage0, pcwalton): Remove `#[allow(unused_mut)]` after snapshot.
295-
#[allow(unused_mut)]
296294
pub fn get_line(&self, line: int) -> String {
297-
let mut lines = self.lines.borrow_mut();
295+
let lines = self.lines.borrow();
298296
let begin: BytePos = *lines.get(line as uint) - self.start_pos;
299297
let begin = begin.to_uint();
300298
let slice = self.src.as_slice().slice_from(begin);
@@ -515,16 +513,14 @@ impl CodeMap {
515513
return a;
516514
}
517515

518-
// NOTE(stage0, pcwalton): Remove `#[allow(unused_mut)]` after snapshot.
519-
#[allow(unused_mut)]
520516
fn lookup_line(&self, pos: BytePos) -> FileMapAndLine {
521517
let idx = self.lookup_filemap_idx(pos);
522518

523519
let files = self.files.borrow();
524520
let f = files.get(idx).clone();
525521
let mut a = 0u;
526522
{
527-
let mut lines = f.lines.borrow_mut();
523+
let lines = f.lines.borrow();
528524
let mut b = lines.len();
529525
while b - a > 1u {
530526
let m = (a + b) / 2u;

branches/dist-snap/src/snapshots.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
S 2014-10-04 749ff5e
2+
freebsd-x86_64 f39d94487d29b3d48217b1295ad2cda8c941e694
3+
linux-i386 555aca74f9a268f80cab2df1147dc6406403e9e4
4+
linux-x86_64 6a43c2f6c8ba2cbbcb9da1f7b58f748aef99f431
5+
macos-i386 331bd7ef519cbb424188c546273e8c7d738f0894
6+
macos-x86_64 2c83a79a9febfe1d326acb17c3af76ba053c6ca9
7+
winnt-i386 fcf0526e5dc7ca4b149e074ff056ac03e2240ac7
8+
winnt-x86_64 611f19816fbfe0730b1fee51481b8d25dd78fa10
9+
110
S 2014-09-28 7eb9337
211
freebsd-x86_64 d45e0edd44f40a976ea0affaadd98732684cfca0
312
linux-i386 3acb35755aa62b7ff78f76007d9a70696fce7aa7

branches/dist-snap/src/test/run-pass-fulldeps/roman-numerals-macro.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,10 @@
1010

1111
// aux-build:roman_numerals.rs
1212
// ignore-stage1
13-
// ignore-android
1413

1514
#![feature(phase)]
1615

17-
#[phase(plugin, link)]
16+
#[phase(plugin)]
1817
extern crate roman_numerals;
1918

2019
pub fn main() {

0 commit comments

Comments
 (0)