Skip to content

Commit 3550824

Browse files
committed
---
yaml --- r: 69500 b: refs/heads/auto c: 7265cc6 h: refs/heads/master v: v3
1 parent be9cc99 commit 3550824

File tree

6 files changed

+81
-69
lines changed

6 files changed

+81
-69
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ refs/heads/try3: 9387340aab40a73e8424c48fd42f0c521a4875c0
1414
refs/tags/release-0.3.1: 495bae036dfe5ec6ceafd3312b4dca48741e845b
1515
refs/tags/release-0.4: e828ea2080499553b97dfe33b3f4d472b4562ad7
1616
refs/tags/release-0.5: 7e3bcfbf21278251ee936ad53e92e9b719702d73
17-
refs/heads/auto: ef7e94550ccfdcf9d114c3eb6f0f9279742c611f
17+
refs/heads/auto: 7265cc6530b242f9590a3207f2bfdf9a5425a32c
1818
refs/heads/servo: af82457af293e2a842ba6b7759b70288da276167
1919
refs/tags/release-0.6: b4ebcfa1812664df5e142f0134a5faea3918544c

branches/auto/src/compiletest/compiletest.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ pub fn parse_config(args: ~[~str]) -> config {
8585
if args[1] == ~"-h" || args[1] == ~"--help" {
8686
let message = fmt!("Usage: %s [OPTIONS] [TESTNAME...]", argv0);
8787
println(getopts::groups::usage(message, groups));
88+
println("");
8889
fail!()
8990
}
9091

@@ -97,6 +98,7 @@ pub fn parse_config(args: ~[~str]) -> config {
9798
if getopts::opt_present(matches, "h") || getopts::opt_present(matches, "help") {
9899
let message = fmt!("Usage: %s [OPTIONS] [TESTNAME...]", argv0);
99100
println(getopts::groups::usage(message, groups));
101+
println("");
100102
fail!()
101103
}
102104

branches/auto/src/libextra/getopts.rs

Lines changed: 18 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,7 @@ pub fn optflag(name: &str) -> Opt {
140140
return Opt {name: mkname(name), hasarg: No, occur: Optional};
141141
}
142142

143-
/** Create an option that is optional, does not take an argument,
144-
* and may occur multiple times.
145-
*/
143+
/// Create an option that is optional and does not take an argument
146144
pub fn optflagmulti(name: &str) -> Opt {
147145
return Opt {name: mkname(name), hasarg: No, occur: Multi};
148146
}
@@ -371,14 +369,7 @@ fn opt_vals(mm: &Matches, nm: &str) -> ~[Optval] {
371369
};
372370
}
373371

374-
fn opt_val(mm: &Matches, nm: &str) -> Option<Optval> {
375-
let vals = opt_vals(mm, nm);
376-
if (vals.is_empty()) {
377-
None
378-
} else {
379-
Some(opt_vals(mm, nm)[0].clone())
380-
}
381-
}
372+
fn opt_val(mm: &Matches, nm: &str) -> Optval { opt_vals(mm, nm)[0].clone() }
382373

383374
/// Returns true if an option was matched
384375
pub fn opt_present(mm: &Matches, nm: &str) -> bool {
@@ -409,10 +400,7 @@ pub fn opts_present(mm: &Matches, names: &[~str]) -> bool {
409400
* argument
410401
*/
411402
pub fn opt_str(mm: &Matches, nm: &str) -> ~str {
412-
return match opt_val(mm, nm) {
413-
Some(Val(s)) => s,
414-
_ => fail!()
415-
};
403+
return match opt_val(mm, nm) { Val(s) => s, _ => fail!() };
416404
}
417405

418406
/**
@@ -424,7 +412,7 @@ pub fn opt_str(mm: &Matches, nm: &str) -> ~str {
424412
pub fn opts_str(mm: &Matches, names: &[~str]) -> ~str {
425413
for names.iter().advance |nm| {
426414
match opt_val(mm, *nm) {
427-
Some(Val(ref s)) => return (*s).clone(),
415+
Val(ref s) => return (*s).clone(),
428416
_ => ()
429417
}
430418
}
@@ -692,7 +680,7 @@ pub mod groups {
692680
return brief.to_owned() +
693681
"\n\nOptions:\n" +
694682
rows.collect::<~[~str]>().connect("\n") +
695-
"\n\n";
683+
"\n";
696684
}
697685

698686
/** Splits a string into substrings with possibly internal whitespace,
@@ -1330,41 +1318,24 @@ mod tests {
13301318
13311319
#[test]
13321320
fn test_multi() {
1321+
let args = ~[~"-e", ~"foo", ~"--encrypt", ~"foo"];
13331322
let opts = ~[optopt("e"), optopt("encrypt"), optopt("f")];
1334-
1335-
let args_single = ~[~"-e", ~"foo"];
1336-
let matches_single = &match getopts(args_single, opts) {
1337-
result::Ok(m) => m,
1338-
result::Err(_) => fail!()
1339-
};
1340-
assert!(opts_present(matches_single, [~"e"]));
1341-
assert!(opts_present(matches_single, [~"encrypt", ~"e"]));
1342-
assert!(opts_present(matches_single, [~"e", ~"encrypt"]));
1343-
assert!(!opts_present(matches_single, [~"encrypt"]));
1344-
assert!(!opts_present(matches_single, [~"thing"]));
1345-
assert!(!opts_present(matches_single, []));
1346-
1347-
assert_eq!(opts_str(matches_single, [~"e"]), ~"foo");
1348-
assert_eq!(opts_str(matches_single, [~"e", ~"encrypt"]), ~"foo");
1349-
assert_eq!(opts_str(matches_single, [~"encrypt", ~"e"]), ~"foo");
1350-
1351-
let args_both = ~[~"-e", ~"foo", ~"--encrypt", ~"foo"];
1352-
let matches_both = &match getopts(args_both, opts) {
1323+
let matches = &match getopts(args, opts) {
13531324
result::Ok(m) => m,
13541325
result::Err(_) => fail!()
13551326
};
1356-
assert!(opts_present(matches_both, [~"e"]));
1357-
assert!(opts_present(matches_both, [~"encrypt"]));
1358-
assert!(opts_present(matches_both, [~"encrypt", ~"e"]));
1359-
assert!(opts_present(matches_both, [~"e", ~"encrypt"]));
1360-
assert!(!opts_present(matches_both, [~"f"]));
1361-
assert!(!opts_present(matches_both, [~"thing"]));
1362-
assert!(!opts_present(matches_both, []));
1327+
assert!(opts_present(matches, [~"e"]));
1328+
assert!(opts_present(matches, [~"encrypt"]));
1329+
assert!(opts_present(matches, [~"encrypt", ~"e"]));
1330+
assert!(opts_present(matches, [~"e", ~"encrypt"]));
1331+
assert!(!opts_present(matches, [~"f"]));
1332+
assert!(!opts_present(matches, [~"thing"]));
1333+
assert!(!opts_present(matches, []));
13631334
1364-
assert_eq!(opts_str(matches_both, [~"e"]), ~"foo");
1365-
assert_eq!(opts_str(matches_both, [~"encrypt"]), ~"foo");
1366-
assert_eq!(opts_str(matches_both, [~"e", ~"encrypt"]), ~"foo");
1367-
assert_eq!(opts_str(matches_both, [~"encrypt", ~"e"]), ~"foo");
1335+
assert_eq!(opts_str(matches, [~"e"]), ~"foo");
1336+
assert_eq!(opts_str(matches, [~"encrypt"]), ~"foo");
1337+
assert_eq!(opts_str(matches, [~"e", ~"encrypt"]), ~"foo");
1338+
assert_eq!(opts_str(matches, [~"encrypt", ~"e"]), ~"foo");
13681339
}
13691340
13701341
#[test]
@@ -1492,7 +1463,6 @@ Options:
14921463
-k --kiwi Desc
14931464
-p [VAL] Desc
14941465
-l VAL Desc
1495-
14961466
";
14971467
14981468
let generated_usage = groups::usage("Usage: fruits", optgroups);
@@ -1521,7 +1491,6 @@ Options:
15211491
-k --kiwi This is a long description which won't be wrapped..+..
15221492
-a --apple This is a long description which _will_ be
15231493
wrapped..+..
1524-
15251494
";
15261495
15271496
let usage = groups::usage("Usage: fruits", optgroups);

branches/auto/src/libextra/test.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ fn optgroups() -> ~[getopts::groups::OptGroup] {
191191
fn usage(binary: &str, helpstr: &str) -> ! {
192192
let message = fmt!("Usage: %s [OPTIONS] [FILTER]", binary);
193193
println(groups::usage(message, optgroups()));
194+
println("");
194195
if helpstr == "help" {
195196
println("\
196197
The FILTER is matched against the name of all tests to run, and if any tests

branches/auto/src/libstd/rt/task.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ impl Drop for Task {
219219
impl Coroutine {
220220

221221
pub fn new(stack_pool: &mut StackPool, start: ~fn()) -> Coroutine {
222-
static MIN_STACK_SIZE: uint = 100000; // XXX: Too much stack
222+
static MIN_STACK_SIZE: uint = 2000000; // XXX: Too much stack
223223

224224
let start = Coroutine::build_start_wrapper(start);
225225
let mut stack = stack_pool.take_segment(MIN_STACK_SIZE);

branches/auto/src/libstd/str.rs

Lines changed: 58 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,18 @@ fn match_at<'a,'b>(haystack: &'a str, needle: &'b str, at: uint) -> bool {
564564
Section: Misc
565565
*/
566566

567+
// Return the initial codepoint accumulator for the first byte.
568+
// The first byte is special, only want bottom 5 bits for width 2, 4 bits
569+
// for width 3, and 3 bits for width 4
570+
macro_rules! utf8_first_byte(
571+
($byte:expr, $width:expr) => (($byte & (0x7F >> $width)) as uint)
572+
)
573+
574+
// return the value of $ch updated with continuation byte $byte
575+
macro_rules! utf8_acc_cont_byte(
576+
($ch:expr, $byte:expr) => (($ch << 6) | ($byte & 63u8) as uint)
577+
)
578+
567579
/// Determines if a vector of bytes contains valid UTF-8
568580
pub fn is_utf8(v: &[u8]) -> bool {
569581
let mut i = 0u;
@@ -577,11 +589,26 @@ pub fn is_utf8(v: &[u8]) -> bool {
577589

578590
let nexti = i + w;
579591
if nexti > total { return false; }
592+
// 1. Make sure the correct number of continuation bytes are present
593+
// 2. Check codepoint ranges (deny overlong encodings)
594+
// 2-byte encoding is for codepoints \u0080 to \u07ff
595+
// 3-byte encoding is for codepoints \u0800 to \uffff
596+
// 4-byte encoding is for codepoints \u10000 to \u10ffff
580597

598+
// 2-byte encodings are correct if the width and continuation match up
581599
if v[i + 1] & 192u8 != TAG_CONT_U8 { return false; }
582600
if w > 2 {
601+
let mut ch;
602+
ch = utf8_first_byte!(v[i], w);
603+
ch = utf8_acc_cont_byte!(ch, v[i + 1]);
583604
if v[i + 2] & 192u8 != TAG_CONT_U8 { return false; }
584-
if w > 3 && (v[i + 3] & 192u8 != TAG_CONT_U8) { return false; }
605+
ch = utf8_acc_cont_byte!(ch, v[i + 2]);
606+
if w == 3 && ch < MAX_TWO_B { return false; }
607+
if w > 3 {
608+
if v[i + 3] & 192u8 != TAG_CONT_U8 { return false; }
609+
ch = utf8_acc_cont_byte!(ch, v[i + 3]);
610+
if ch < MAX_THREE_B || ch >= MAX_UNICODE { return false; }
611+
}
585612
}
586613

587614
i = nexti;
@@ -699,7 +726,7 @@ pub fn count_bytes<'b>(s: &'b str, start: uint, n: uint) -> uint {
699726
}
700727

701728
// https://tools.ietf.org/html/rfc3629
702-
static UTF8_CHAR_WIDTH: [u8, ..256] = [
729+
priv static UTF8_CHAR_WIDTH: [u8, ..256] = [
703730
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
704731
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x1F
705732
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
@@ -712,7 +739,7 @@ static UTF8_CHAR_WIDTH: [u8, ..256] = [
712739
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0x9F
713740
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
714741
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0xBF
715-
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
742+
0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
716743
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, // 0xDF
717744
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, // 0xEF
718745
4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0, // 0xFF
@@ -730,14 +757,15 @@ pub struct CharRange {
730757
}
731758

732759
// UTF-8 tags and ranges
733-
static TAG_CONT_U8: u8 = 128u8;
734-
static TAG_CONT: uint = 128u;
735-
static MAX_ONE_B: uint = 128u;
736-
static TAG_TWO_B: uint = 192u;
737-
static MAX_TWO_B: uint = 2048u;
738-
static TAG_THREE_B: uint = 224u;
739-
static MAX_THREE_B: uint = 65536u;
740-
static TAG_FOUR_B: uint = 240u;
760+
priv static TAG_CONT_U8: u8 = 128u8;
761+
priv static TAG_CONT: uint = 128u;
762+
priv static MAX_ONE_B: uint = 128u;
763+
priv static TAG_TWO_B: uint = 192u;
764+
priv static MAX_TWO_B: uint = 2048u;
765+
priv static TAG_THREE_B: uint = 224u;
766+
priv static MAX_THREE_B: uint = 65536u;
767+
priv static TAG_FOUR_B: uint = 240u;
768+
priv static MAX_UNICODE: uint = 1114112u;
741769

742770
/// Unsafe operations
743771
pub mod raw {
@@ -1665,12 +1693,10 @@ impl<'self> StrSlice<'self> for &'self str {
16651693
let w = UTF8_CHAR_WIDTH[val] as uint;
16661694
assert!((w != 0));
16671695
1668-
// First byte is special, only want bottom 5 bits for width 2, 4 bits
1669-
// for width 3, and 3 bits for width 4
1670-
val &= 0x7Fu >> w;
1671-
val = (val << 6) | (s[i + 1] & 63u8) as uint;
1672-
if w > 2 { val = (val << 6) | (s[i + 2] & 63u8) as uint; }
1673-
if w > 3 { val = (val << 6) | (s[i + 3] & 63u8) as uint; }
1696+
val = utf8_first_byte!(val, w);
1697+
val = utf8_acc_cont_byte!(val, s[i + 1]);
1698+
if w > 2 { val = utf8_acc_cont_byte!(val, s[i + 2]); }
1699+
if w > 3 { val = utf8_acc_cont_byte!(val, s[i + 3]); }
16741700
16751701
return CharRange {ch: val as char, next: i + w};
16761702
}
@@ -2035,7 +2061,7 @@ impl OwnedStr for ~str {
20352061
/// Appends a character to the back of a string
20362062
#[inline]
20372063
fn push_char(&mut self, c: char) {
2038-
assert!(c as uint <= 0x10ffff); // FIXME: #7609: should be enforced on all `char`
2064+
assert!((c as uint) < MAX_UNICODE); // FIXME: #7609: should be enforced on all `char`
20392065
unsafe {
20402066
let code = c as uint;
20412067
let nb = if code < MAX_ONE_B { 1u }
@@ -2799,9 +2825,23 @@ mod tests {
27992825
0x20_u8, 0x4e_u8, 0x61_u8,
28002826
0x6d_u8];
28012827
2828+
28022829
assert_eq!(ss, from_bytes(bb));
2830+
assert_eq!(~"𐌀𐌖𐌋𐌄𐌑𐌉ปรدولة الكويتทศไทย中华𐍅𐌿𐌻𐍆𐌹𐌻𐌰",
2831+
from_bytes(bytes!("𐌀𐌖𐌋𐌄𐌑𐌉ปรدولة الكويتทศไทย中华𐍅𐌿𐌻𐍆𐌹𐌻𐌰")));
28032832
}
28042833
2834+
#[test]
2835+
fn test_is_utf8_deny_overlong() {
2836+
assert!(!is_utf8([0xc0, 0x80]));
2837+
assert!(!is_utf8([0xc0, 0xae]));
2838+
assert!(!is_utf8([0xe0, 0x80, 0x80]));
2839+
assert!(!is_utf8([0xe0, 0x80, 0xaf]));
2840+
assert!(!is_utf8([0xe0, 0x81, 0x81]));
2841+
assert!(!is_utf8([0xf0, 0x82, 0x82, 0xac]));
2842+
}
2843+
2844+
28052845
#[test]
28062846
#[ignore(cfg(windows))]
28072847
fn test_from_bytes_fail() {

0 commit comments

Comments
 (0)