Skip to content

Commit 926391b

Browse files
nikomatsakisgraydon
authored andcommitted
---
yaml --- r: 140445 b: refs/heads/try2 c: c15fa3a h: refs/heads/master i: 140443: 637629f v: v3
1 parent c21bfa5 commit 926391b

File tree

23 files changed

+211
-550
lines changed

23 files changed

+211
-550
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: 821979f9282decc1ba92391249140f49a7102319
8+
refs/heads/try2: c15fa3a02aa3e7e5111f0410abf7321387a7a97f
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/src/libcore/cleanup.rs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,22 +126,29 @@ struct AnnihilateStats {
126126
n_bytes_freed: uint
127127
}
128128

129-
unsafe fn each_live_alloc(f: &fn(box: *mut BoxRepr, uniq: bool) -> bool) {
129+
unsafe fn each_live_alloc(read_next_before: bool,
130+
f: &fn(box: *mut BoxRepr, uniq: bool) -> bool) {
131+
//! Walks the internal list of allocations
132+
130133
use managed;
131134

132135
let task: *Task = transmute(rustrt::rust_get_task());
133136
let box = (*task).boxed_region.live_allocs;
134137
let mut box: *mut BoxRepr = transmute(copy box);
135138
while box != mut_null() {
136-
let next = transmute(copy (*box).header.next);
139+
let next_before = transmute(copy (*box).header.next);
137140
let uniq =
138141
(*box).header.ref_count == managed::raw::RC_MANAGED_UNIQUE;
139142

140143
if ! f(box, uniq) {
141144
break
142145
}
143146

144-
box = next
147+
if read_next_before {
148+
box = next_before;
149+
} else {
150+
box = transmute(copy (*box).header.next);
151+
}
145152
}
146153
}
147154

@@ -173,7 +180,10 @@ pub unsafe fn annihilate() {
173180
};
174181

175182
// Pass 1: Make all boxes immortal.
176-
for each_live_alloc |box, uniq| {
183+
//
184+
// In this pass, nothing gets freed, so it does not matter whether
185+
// we read the next field before or after the callback.
186+
for each_live_alloc(true) |box, uniq| {
177187
stats.n_total_boxes += 1;
178188
if uniq {
179189
stats.n_unique_boxes += 1;
@@ -183,7 +193,11 @@ pub unsafe fn annihilate() {
183193
}
184194

185195
// Pass 2: Drop all boxes.
186-
for each_live_alloc |box, uniq| {
196+
//
197+
// In this pass, unique-managed boxes may get freed, but not
198+
// managed boxes, so we must read the `next` field *after* the
199+
// callback, as the original value may have been freed.
200+
for each_live_alloc(false) |box, uniq| {
187201
if !uniq {
188202
let tydesc: *TypeDesc = transmute(copy (*box).header.type_desc);
189203
let drop_glue: DropGlue = transmute(((*tydesc).drop_glue, 0));
@@ -192,7 +206,12 @@ pub unsafe fn annihilate() {
192206
}
193207

194208
// Pass 3: Free all boxes.
195-
for each_live_alloc |box, uniq| {
209+
//
210+
// In this pass, managed boxes may get freed (but not
211+
// unique-managed boxes, though I think that none of those are
212+
// left), so we must read the `next` field before, since it will
213+
// not be valid after.
214+
for each_live_alloc(true) |box, uniq| {
196215
if !uniq {
197216
stats.n_bytes_freed +=
198217
(*((*box).header.type_desc)).size

branches/try2/src/libcore/os.rs

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -772,28 +772,6 @@ pub fn list_dir_path(p: &Path) -> ~[~Path] {
772772
list_dir(p).map(|f| ~p.push(*f))
773773
}
774774
775-
/// Removes a directory at the specified path, after removing
776-
/// all its contents. Use carefully!
777-
pub fn remove_dir_recursive(p: &Path) -> bool {
778-
let mut error_happened = false;
779-
for walk_dir(p) |inner| {
780-
if !error_happened {
781-
if path_is_dir(inner) {
782-
if !remove_dir_recursive(inner) {
783-
error_happened = true;
784-
}
785-
}
786-
else {
787-
if !remove_file(inner) {
788-
error_happened = true;
789-
}
790-
}
791-
}
792-
};
793-
// Directory should now be empty
794-
!error_happened && remove_dir(p)
795-
}
796-
797775
/// Removes a directory at the specified path
798776
pub fn remove_dir(p: &Path) -> bool {
799777
return rmdir(p);
@@ -899,10 +877,6 @@ pub fn copy_file(from: &Path, to: &Path) -> bool {
899877
if istream as uint == 0u {
900878
return false;
901879
}
902-
// Preserve permissions
903-
let from_mode = from.get_mode().expect("copy_file: couldn't get permissions \
904-
for source file");
905-
906880
let ostream = do as_c_charp(to.to_str()) |top| {
907881
do as_c_charp("w+b") |modebuf| {
908882
libc::fopen(top, modebuf)
@@ -934,15 +908,6 @@ pub fn copy_file(from: &Path, to: &Path) -> bool {
934908
}
935909
fclose(istream);
936910
fclose(ostream);
937-
938-
// Give the new file the old file's permissions
939-
unsafe {
940-
if do str::as_c_str(to.to_str()) |to_buf| {
941-
libc::chmod(to_buf, from_mode as mode_t)
942-
} != 0 {
943-
return false; // should be a condition...
944-
}
945-
}
946911
return ok;
947912
}
948913
}
@@ -1629,15 +1594,13 @@ mod tests {
16291594
== buf.len() as size_t))
16301595
}
16311596
assert!((libc::fclose(ostream) == (0u as c_int)));
1632-
let in_mode = in.get_mode();
16331597
let rs = os::copy_file(&in, &out);
16341598
if (!os::path_exists(&in)) {
16351599
fail!(fmt!("%s doesn't exist", in.to_str()));
16361600
}
16371601
assert!((rs));
16381602
let rslt = run::run_program(~"diff", ~[in.to_str(), out.to_str()]);
16391603
assert!((rslt == 0));
1640-
assert!(out.get_mode() == in_mode);
16411604
assert!((remove_file(&in)));
16421605
assert!((remove_file(&out)));
16431606
}

branches/try2/src/libcore/prelude.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ pub use io::{print, println};
3131
/* Reexported types and traits */
3232

3333
pub use clone::Clone;
34-
pub use cmp::{Eq, Ord, TotalEq, TotalOrd, Ordering, Less, Equal, Greater, Equiv};
34+
pub use cmp::{Eq, Ord, TotalEq, TotalOrd, Ordering, Less, Equal, Greater};
3535
pub use container::{Container, Mutable, Map, Set};
3636
pub use hash::Hash;
3737
pub use old_iter::{BaseIter, ReverseIter, MutableIter, ExtendedIter, EqIter};

branches/try2/src/libcore/str/ascii.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
//! Operations on ASCII strings and characters.
12-
1311
use to_str::{ToStr,ToStrConsume};
1412
use str;
1513
use cast;

branches/try2/src/libcore/to_bytes.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,8 @@ impl<A> IterBytes for *const A {
419419
}
420420
}
421421

422-
pub trait ToBytes {
422+
423+
trait ToBytes {
423424
fn to_bytes(&self, lsb0: bool) -> ~[u8];
424425
}
425426

branches/try2/src/librustc/back/link.rs

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -752,26 +752,18 @@ pub fn link_binary(sess: Session,
752752
// instead of hard-coded gcc.
753753
// For win32, there is no cc command,
754754
// so we add a condition to make it use gcc.
755-
let cc_prog: ~str = match sess.opts.linker {
756-
Some(copy linker) => linker,
757-
None => {
758-
if sess.targ_cfg.os == session::os_android {
759-
match &sess.opts.android_cross_path {
760-
&Some(copy path) => {
761-
fmt!("%s/bin/arm-linux-androideabi-gcc", path)
762-
}
763-
&None => {
764-
sess.fatal(~"need Android NDK path for linking \
765-
(--android-cross-path)")
766-
}
767-
}
768-
} else if sess.targ_cfg.os == session::os_win32 {
769-
~"gcc"
770-
} else {
771-
~"cc"
755+
let cc_prog: ~str = if sess.targ_cfg.os == session::os_android {
756+
match &sess.opts.android_cross_path {
757+
&Some(copy path) => {
758+
fmt!("%s/bin/arm-linux-androideabi-gcc", path)
759+
}
760+
&None => {
761+
sess.fatal(~"need Android NDK path for linking \
762+
(--android-cross-path)")
772763
}
773764
}
774-
};
765+
} else if sess.targ_cfg.os == session::os_win32 { ~"gcc" }
766+
else { ~"cc" };
775767
// The invocations of cc share some flags across platforms
776768
777769

branches/try2/src/librustc/back/rpath.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ pub fn get_rpath_flags(sess: session::Session, out_filename: &Path)
4040
// where rustrt is and we know every rust program needs it
4141
let libs = vec::append_one(libs, get_sysroot_absolute_rt_lib(sess));
4242

43-
let rpaths = get_rpaths(os, sysroot, output, libs,
43+
let rpaths = get_rpaths(os, &sysroot, output, libs,
4444
sess.opts.target_triple);
4545
rpaths_to_flags(rpaths)
4646
}

branches/try2/src/librustc/driver/driver.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,7 @@ pub fn build_session_options(binary: @~str,
603603
link::output_type_bitcode
604604
} else { link::output_type_exe };
605605
let sysroot_opt = getopts::opt_maybe_str(matches, ~"sysroot");
606-
let sysroot_opt = sysroot_opt.map(|m| @Path(*m));
606+
let sysroot_opt = sysroot_opt.map(|m| Path(*m));
607607
let target_opt = getopts::opt_maybe_str(matches, ~"target");
608608
let target_feature_opt = getopts::opt_maybe_str(matches, ~"target-feature");
609609
let save_temps = getopts::opt_present(matches, ~"save-temps");
@@ -650,7 +650,7 @@ pub fn build_session_options(binary: @~str,
650650
};
651651
652652
let addl_lib_search_paths = getopts::opt_strs(matches, ~"L").map(|s| Path(*s));
653-
let linker = getopts::opt_maybe_str(matches, ~"linker");
653+
654654
let linker_args = getopts::opt_strs(matches, ~"link-args").flat_map( |a| {
655655
let mut args = ~[];
656656
for str::each_split_char(*a, ' ') |arg| {
@@ -676,7 +676,6 @@ pub fn build_session_options(binary: @~str,
676676
jit: jit,
677677
output_type: output_type,
678678
addl_lib_search_paths: addl_lib_search_paths,
679-
linker: linker,
680679
linker_args: linker_args,
681680
maybe_sysroot: sysroot_opt,
682681
target_triple: target,
@@ -761,7 +760,6 @@ pub fn optgroups() -> ~[getopts::groups::OptGroup] {
761760
optmulti("L", "", "Add a directory to the library search path",
762761
"PATH"),
763762
optflag("", "lib", "Compile a library crate"),
764-
optopt("", "linker", "Program to use for linking instead of the default.", "LINKER"),
765763
optmulti("", "link-args", "FLAGS is a space-separated list of flags
766764
passed to the linker", "FLAGS"),
767765
optflag("", "ls", "List the symbols defined by a library crate"),

branches/try2/src/librustc/driver/session.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,8 @@ pub struct options {
124124
jit: bool,
125125
output_type: back::link::output_type,
126126
addl_lib_search_paths: ~[Path],
127-
linker: Option<~str>,
128127
linker_args: ~[~str],
129-
maybe_sysroot: Option<@Path>,
128+
maybe_sysroot: Option<Path>,
130129
target_triple: ~str,
131130
target_feature: ~str,
132131
// User-specified cfg meta items. The compiler itself will add additional
@@ -303,8 +302,7 @@ pub fn basic_options() -> @options {
303302
jit: false,
304303
output_type: link::output_type_exe,
305304
addl_lib_search_paths: ~[],
306-
linker: None,
307-
linker_args: ~[],
305+
linker_args:~[],
308306
maybe_sysroot: None,
309307
target_triple: host_triple(),
310308
target_feature: ~"",

branches/try2/src/librustc/metadata/filesearch.rs

Lines changed: 24 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -20,48 +20,41 @@ pub fn pick_file(file: Path, path: &Path) -> Option<Path> {
2020
}
2121

2222
pub trait FileSearch {
23-
fn sysroot(&self) -> @Path;
24-
fn for_each_lib_search_path(&self, f: &fn(&Path) -> bool);
23+
fn sysroot(&self) -> Path;
24+
fn lib_search_paths(&self) -> ~[Path];
2525
fn get_target_lib_path(&self) -> Path;
2626
fn get_target_lib_file_path(&self, file: &Path) -> Path;
2727
}
2828

29-
pub fn mk_filesearch(maybe_sysroot: &Option<@Path>,
29+
pub fn mk_filesearch(maybe_sysroot: &Option<Path>,
3030
target_triple: &str,
3131
addl_lib_search_paths: ~[Path])
3232
-> @FileSearch {
3333
struct FileSearchImpl {
34-
sysroot: @Path,
34+
sysroot: Path,
3535
addl_lib_search_paths: ~[Path],
3636
target_triple: ~str
3737
}
3838
impl FileSearch for FileSearchImpl {
39-
fn sysroot(&self) -> @Path { self.sysroot }
40-
fn for_each_lib_search_path(&self, f: &fn(&Path) -> bool) {
41-
debug!("filesearch: searching additional lib search paths");
42-
// a little weird
43-
self.addl_lib_search_paths.each(f);
44-
45-
debug!("filesearch: searching target lib path");
46-
if !f(&make_target_lib_path(self.sysroot,
47-
self.target_triple)) {
48-
return;
39+
fn sysroot(&self) -> Path { /*bad*/copy self.sysroot }
40+
fn lib_search_paths(&self) -> ~[Path] {
41+
let mut paths = /*bad*/copy self.addl_lib_search_paths;
42+
43+
paths.push(
44+
make_target_lib_path(&self.sysroot,
45+
self.target_triple));
46+
match get_rustpkg_lib_path_nearest() {
47+
result::Ok(ref p) => paths.push((/*bad*/copy *p)),
48+
result::Err(_) => ()
4949
}
50-
debug!("filesearch: searching rustpkg lib path nearest");
51-
if match get_rustpkg_lib_path_nearest() {
52-
result::Ok(ref p) => f(p),
53-
result::Err(_) => true
54-
} {
55-
return;
56-
}
57-
debug!("filesearch: searching rustpkg lib path");
58-
match get_rustpkg_lib_path() {
59-
result::Ok(ref p) => f(p),
60-
result::Err(_) => true
61-
};
50+
match get_rustpkg_lib_path() {
51+
result::Ok(ref p) => paths.push((/*bad*/copy *p)),
52+
result::Err(_) => ()
53+
}
54+
paths
6255
}
6356
fn get_target_lib_path(&self) -> Path {
64-
make_target_lib_path(self.sysroot, self.target_triple)
57+
make_target_lib_path(&self.sysroot, self.target_triple)
6558
}
6659
fn get_target_lib_file_path(&self, file: &Path) -> Path {
6760
self.get_target_lib_path().push_rel(file)
@@ -79,7 +72,7 @@ pub fn mk_filesearch(maybe_sysroot: &Option<@Path>,
7972

8073
pub fn search<T:Copy>(filesearch: @FileSearch, pick: pick<T>) -> Option<T> {
8174
let mut rslt = None;
82-
for filesearch.for_each_lib_search_path() |lib_search_path| {
75+
for filesearch.lib_search_paths().each |lib_search_path| {
8376
debug!("searching %s", lib_search_path.to_str());
8477
for os::list_dir_path(lib_search_path).each |path| {
8578
debug!("testing %s", path.to_str());
@@ -115,10 +108,10 @@ fn get_or_default_sysroot() -> Path {
115108
}
116109
}
117110
118-
fn get_sysroot(maybe_sysroot: &Option<@Path>) -> @Path {
111+
fn get_sysroot(maybe_sysroot: &Option<Path>) -> Path {
119112
match *maybe_sysroot {
120-
option::Some(sr) => sr,
121-
option::None => @get_or_default_sysroot()
113+
option::Some(ref sr) => (/*bad*/copy *sr),
114+
option::None => get_or_default_sysroot()
122115
}
123116
}
124117

0 commit comments

Comments
 (0)