Skip to content

Commit 7bfe1aa

Browse files
committed
---
yaml --- r: 108463 b: refs/heads/dist-snap c: 801f8f6 h: refs/heads/master i: 108461: 3032539 108459: 5c2049b 108455: 38a256a 108447: 28a4d35 v: v3
1 parent 378fb80 commit 7bfe1aa

File tree

28 files changed

+413
-102
lines changed

28 files changed

+413
-102
lines changed

[refs]

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

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

Lines changed: 18 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1750,6 +1750,24 @@ closures, but they also own them: that is, no other code can access
17501750
them. Owned closures are used in concurrent code, particularly
17511751
for spawning [tasks][tasks].
17521752
1753+
Closures can be used to spawn tasks.
1754+
A practical example of this pattern is found when using the `spawn` function,
1755+
which starts a new task.
1756+
1757+
~~~~
1758+
use std::task::spawn;
1759+
1760+
// proc is the closure which will be spawned.
1761+
spawn(proc() {
1762+
debug!("I'm a new task")
1763+
});
1764+
~~~~
1765+
1766+
> ***Note:*** If you want to see the output of `debug!` statements, you will need to turn on
1767+
> `debug!` logging. To enable `debug!` logging, set the RUST_LOG environment
1768+
> variable to the name of your crate, which, for a file named `foo.rs`, will be
1769+
> `foo` (e.g., with bash, `export RUST_LOG=foo`).
1770+
17531771
## Closure compatibility
17541772
17551773
Rust closures have a convenient subtyping property: you can pass any kind of
@@ -1771,45 +1789,6 @@ call_twice(function);
17711789
> in small ways. At the moment they can be unsound in some
17721790
> scenarios, particularly with non-copyable types.
17731791
1774-
## Do syntax
1775-
1776-
The `do` expression makes it easier to call functions that take procedures
1777-
as arguments.
1778-
1779-
Consider this function that takes a procedure:
1780-
1781-
~~~~
1782-
fn call_it(op: proc(v: int)) {
1783-
op(10)
1784-
}
1785-
~~~~
1786-
1787-
As a caller, if we use a closure to provide the final operator
1788-
argument, we can write it in a way that has a pleasant, block-like
1789-
structure.
1790-
1791-
~~~~
1792-
# fn call_it(op: proc(v: int)) { }
1793-
call_it(proc(n) {
1794-
println!("{}", n);
1795-
});
1796-
~~~~
1797-
1798-
A practical example of this pattern is found when using the `spawn` function,
1799-
which starts a new task.
1800-
1801-
~~~~
1802-
use std::task::spawn;
1803-
spawn(proc() {
1804-
debug!("I'm a new task")
1805-
});
1806-
~~~~
1807-
1808-
If you want to see the output of `debug!` statements, you will need to turn on
1809-
`debug!` logging. To enable `debug!` logging, set the RUST_LOG environment
1810-
variable to the name of your crate, which, for a file named `foo.rs`, will be
1811-
`foo` (e.g., with bash, `export RUST_LOG=foo`).
1812-
18131792
# Methods
18141793
18151794
Methods are like functions except that they always begin with a special argument,

branches/dist-snap/src/libextra/test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,7 @@ impl<T: Writer> ConsoleTestState<T> {
555555
}
556556
}
557557
}
558-
if_ok!(self.write_plain(format!("result of ratchet: {} matrics added, \
558+
if_ok!(self.write_plain(format!("result of ratchet: {} metrics added, \
559559
{} removed, {} improved, {} regressed, \
560560
{} noise\n",
561561
added, removed, improved, regressed,

branches/dist-snap/src/libextra/url.rs

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,17 @@ pub struct Url {
5555
fragment: Option<~str>
5656
}
5757

58+
#[deriving(Clone, Eq)]
59+
pub struct Path {
60+
/// The path component of a URL, for example `/foo/bar`.
61+
path: ~str,
62+
/// The query component of a URL. `~[(~"baz", ~"qux")]` represents the
63+
/// fragment `baz=qux` in the above example.
64+
query: Query,
65+
/// The fragment component, such as `quz`. Doesn't include the leading `#` character.
66+
fragment: Option<~str>
67+
}
68+
5869
/// An optional subcomponent of a URI authority component.
5970
#[deriving(Clone, Eq)]
6071
pub struct UserInfo {
@@ -88,6 +99,19 @@ impl Url {
8899
}
89100
}
90101

102+
impl Path {
103+
pub fn new(path: ~str,
104+
query: Query,
105+
fragment: Option<~str>)
106+
-> Path {
107+
Path {
108+
path: path,
109+
query: query,
110+
fragment: fragment,
111+
}
112+
}
113+
}
114+
91115
impl UserInfo {
92116
#[inline]
93117
pub fn new(user: ~str, pass: Option<~str>) -> UserInfo {
@@ -727,6 +751,21 @@ pub fn from_str(rawurl: &str) -> Result<Url, ~str> {
727751
Ok(Url::new(scheme, userinfo, host, port, path, query, fragment))
728752
}
729753

754+
pub fn path_from_str(rawpath: &str) -> Result<Path, ~str> {
755+
let (path, rest) = match get_path(rawpath, false) {
756+
Ok(val) => val,
757+
Err(e) => return Err(e)
758+
};
759+
760+
// query and fragment
761+
let (query, fragment) = match get_query_fragment(rest) {
762+
Ok(val) => val,
763+
Err(e) => return Err(e),
764+
};
765+
766+
Ok(Path{ path: path, query: query, fragment: fragment })
767+
}
768+
730769
impl FromStr for Url {
731770
fn from_str(s: &str) -> Option<Url> {
732771
match from_str(s) {
@@ -736,6 +775,15 @@ impl FromStr for Url {
736775
}
737776
}
738777

778+
impl FromStr for Path {
779+
fn from_str(s: &str) -> Option<Path> {
780+
match path_from_str(s) {
781+
Ok(path) => Some(path),
782+
Err(_) => None
783+
}
784+
}
785+
}
786+
739787
/**
740788
* Converts a URL from `Url` to string representation.
741789
*
@@ -780,18 +828,45 @@ pub fn to_str(url: &Url) -> ~str {
780828
format!("{}:{}{}{}{}", url.scheme, authority, url.path, query, fragment)
781829
}
782830

831+
pub fn path_to_str(path: &Path) -> ~str {
832+
let query = if path.query.is_empty() {
833+
~""
834+
} else {
835+
format!("?{}", query_to_str(&path.query))
836+
};
837+
838+
let fragment = match path.fragment {
839+
Some(ref fragment) => format!("\\#{}", encode_component(*fragment)),
840+
None => ~"",
841+
};
842+
843+
format!("{}{}{}", path.path, query, fragment)
844+
}
845+
783846
impl ToStr for Url {
784847
fn to_str(&self) -> ~str {
785848
to_str(self)
786849
}
787850
}
788851

852+
impl ToStr for Path {
853+
fn to_str(&self) -> ~str {
854+
path_to_str(self)
855+
}
856+
}
857+
789858
impl IterBytes for Url {
790859
fn iter_bytes(&self, lsb0: bool, f: to_bytes::Cb) -> bool {
791860
self.to_str().iter_bytes(lsb0, f)
792861
}
793862
}
794863

864+
impl IterBytes for Path {
865+
fn iter_bytes(&self, lsb0: bool, f: to_bytes::Cb) -> bool {
866+
self.to_str().iter_bytes(lsb0, f)
867+
}
868+
}
869+
795870
// Put a few tests outside of the 'test' module so they can test the internal
796871
// functions and those functions don't need 'pub'
797872

@@ -899,6 +974,17 @@ mod tests {
899974
assert_eq!(&u.fragment, &Some(~"something"));
900975
}
901976
977+
#[test]
978+
fn test_path_parse() {
979+
let path = ~"/doc/~u?s=v#something";
980+
981+
let up = path_from_str(path);
982+
let u = up.unwrap();
983+
assert_eq!(&u.path, &~"/doc/~u");
984+
assert_eq!(&u.query, &~[(~"s", ~"v")]);
985+
assert_eq!(&u.fragment, &Some(~"something"));
986+
}
987+
902988
#[test]
903989
fn test_url_parse_host_slash() {
904990
let urlstr = ~"http://0.42.42.42/";
@@ -907,6 +993,13 @@ mod tests {
907993
assert!(url.path == ~"/");
908994
}
909995
996+
#[test]
997+
fn test_path_parse_host_slash() {
998+
let pathstr = ~"/";
999+
let path = path_from_str(pathstr).unwrap();
1000+
assert!(path.path == ~"/");
1001+
}
1002+
9101003
#[test]
9111004
fn test_url_host_with_port() {
9121005
let urlstr = ~"scheme://host:1234";
@@ -930,13 +1023,27 @@ mod tests {
9301023
assert!(url.path == ~"/file_name.html");
9311024
}
9321025
1026+
#[test]
1027+
fn test_path_with_underscores() {
1028+
let pathstr = ~"/file_name.html";
1029+
let path = path_from_str(pathstr).unwrap();
1030+
assert!(path.path == ~"/file_name.html");
1031+
}
1032+
9331033
#[test]
9341034
fn test_url_with_dashes() {
9351035
let urlstr = ~"http://dotcom.com/file-name.html";
9361036
let url = from_str(urlstr).unwrap();
9371037
assert!(url.path == ~"/file-name.html");
9381038
}
9391039
1040+
#[test]
1041+
fn test_path_with_dashes() {
1042+
let pathstr = ~"/file-name.html";
1043+
let path = path_from_str(pathstr).unwrap();
1044+
assert!(path.path == ~"/file-name.html");
1045+
}
1046+
9401047
#[test]
9411048
fn test_no_scheme() {
9421049
assert!(get_scheme("noschemehere.html").is_err());
@@ -1017,6 +1124,14 @@ mod tests {
10171124
assert!(u.query == ~[(~"ba%d ", ~"#&+")]);
10181125
}
10191126
1127+
#[test]
1128+
fn test_path_component_encoding() {
1129+
let path = ~"/doc%20uments?ba%25d%20=%23%26%2B";
1130+
let p = path_from_str(path).unwrap();
1131+
assert!(p.path == ~"/doc uments");
1132+
assert!(p.query == ~[(~"ba%d ", ~"#&+")]);
1133+
}
1134+
10201135
#[test]
10211136
fn test_url_without_authority() {
10221137
let url = ~"mailto:test@email.com";

branches/dist-snap/src/librustc/back/archive.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ impl Archive {
173173
if_ok!(fs::rename(file, &new_filename));
174174
inputs.push(new_filename);
175175
}
176+
if inputs.len() == 0 { return Ok(()) }
176177

177178
// Finally, add all the renamed files to this archive
178179
let mut args = ~[&self.dst];

branches/dist-snap/src/librustc/driver/driver.rs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ use middle;
2727
use util::common::time;
2828
use util::ppaux;
2929

30+
use extra::json;
31+
use serialize::Encodable;
32+
3033
use std::cell::{Cell, RefCell};
3134
use std::hashmap::{HashMap,HashSet};
3235
use std::io;
@@ -154,7 +157,7 @@ pub enum Input {
154157

155158
pub fn phase_1_parse_input(sess: Session, cfg: ast::CrateConfig, input: &Input)
156159
-> ast::Crate {
157-
time(sess.time_passes(), "parsing", (), |_| {
160+
let krate = time(sess.time_passes(), "parsing", (), |_| {
158161
match *input {
159162
FileInput(ref file) => {
160163
parse::parse_crate_from_file(&(*file), cfg.clone(), sess.parse_sess)
@@ -166,7 +169,15 @@ pub fn phase_1_parse_input(sess: Session, cfg: ast::CrateConfig, input: &Input)
166169
sess.parse_sess)
167170
}
168171
}
169-
})
172+
});
173+
174+
if sess.opts.debugging_opts & session::AST_JSON_NOEXPAND != 0 {
175+
let mut stdout = io::stdout();
176+
let mut json = json::PrettyEncoder::new(&mut stdout);
177+
krate.encode(&mut json);
178+
}
179+
180+
krate
170181
}
171182

172183
// For continuing compilation after a parsed crate has been
@@ -220,8 +231,16 @@ pub fn phase_2_configure_and_expand(sess: Session,
220231
krate = time(time_passes, "prelude injection", krate, |krate|
221232
front::std_inject::maybe_inject_prelude(sess, krate));
222233

223-
time(time_passes, "assinging node ids and indexing ast", krate, |krate|
224-
front::assign_node_ids_and_map::assign_node_ids_and_map(sess, krate))
234+
let (krate, map) = time(time_passes, "assinging node ids and indexing ast", krate, |krate|
235+
front::assign_node_ids_and_map::assign_node_ids_and_map(sess, krate));
236+
237+
if sess.opts.debugging_opts & session::AST_JSON != 0 {
238+
let mut stdout = io::stdout();
239+
let mut json = json::PrettyEncoder::new(&mut stdout);
240+
krate.encode(&mut json);
241+
}
242+
243+
(krate, map)
225244
}
226245

227246
pub struct CrateAnalysis {
@@ -428,15 +447,15 @@ pub fn stop_after_phase_1(sess: Session) -> bool {
428447
debug!("invoked with --parse-only, returning early from compile_input");
429448
return true;
430449
}
431-
return false;
450+
return sess.opts.debugging_opts & session::AST_JSON_NOEXPAND != 0;
432451
}
433452

434453
pub fn stop_after_phase_2(sess: Session) -> bool {
435454
if sess.opts.no_analysis {
436455
debug!("invoked with --no-analysis, returning early from compile_input");
437456
return true;
438457
}
439-
return false;
458+
return sess.opts.debugging_opts & session::AST_JSON != 0;
440459
}
441460

442461
pub fn stop_after_phase_5(sess: Session) -> bool {

branches/dist-snap/src/librustc/driver/session.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ debugging_opts!(
6565
GC,
6666
PRINT_LINK_ARGS,
6767
PRINT_LLVM_PASSES,
68-
LTO
68+
LTO,
69+
AST_JSON,
70+
AST_JSON_NOEXPAND
6971
]
7072
0
7173
)
@@ -97,6 +99,8 @@ pub fn debugging_opts_map() -> ~[(&'static str, &'static str, u64)] {
9799
"Prints the llvm optimization passes being run",
98100
PRINT_LLVM_PASSES),
99101
("lto", "Perform LLVM link-time optimizations", LTO),
102+
("ast-json", "Print the AST as JSON and halt", AST_JSON),
103+
("ast-json-noexpand", "Print the pre-expansion AST as JSON and halt", AST_JSON_NOEXPAND),
100104
]
101105
}
102106

branches/dist-snap/src/librustc/middle/ty.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4142,7 +4142,7 @@ pub fn enum_variants(cx: ctxt, id: ast::DefId) -> @~[@VariantInfo] {
41424142
.span_err(e.span,
41434143
format!("expected \
41444144
constant: {}",
4145-
(*err)));
4145+
*err));
41464146
}
41474147
},
41484148
None => {}

0 commit comments

Comments
 (0)