Skip to content

Commit 8cf56b9

Browse files
committed
---
yaml --- r: 80741 b: refs/heads/try c: 323e8f0 h: refs/heads/master i: 80739: 7a685f5 v: v3
1 parent 9a3b056 commit 8cf56b9

File tree

13 files changed

+301
-250
lines changed

13 files changed

+301
-250
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
refs/heads/master: 4c6bf4872012c010f84dc7fa2cdfe87522533f89
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: cbd1eefbd350797b783df119fed7956d7e1c74ad
5-
refs/heads/try: ef964a162fb9100042714cc8fa70b37b200770bc
5+
refs/heads/try: 323e8f07ff4d5b8e2e38fe94a13c55070ce66384
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: 147ecfdd8221e4a4d4e090486829a06da1e0ca3c

branches/try/mk/rt.mk

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ RUNTIME_CXXS_$(1)_$(2) := \
7575
rt/rust_rng.cpp \
7676
rt/rust_upcall.cpp \
7777
rt/rust_uv.cpp \
78-
rt/rust_crate_map.cpp \
7978
rt/isaac/randport.cpp \
8079
rt/miniz.cpp \
8180
rt/memory_region.cpp \

branches/try/src/librustc/middle/stack_check.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,18 @@ fn stack_check_item(v: StackCheckVisitor,
8080
visit::walk_method_helper(&mut v, method, new_cx);
8181
}
8282
}
83+
ast::item_trait(_, _, ref methods) => {
84+
for method in methods.iter() {
85+
match *method {
86+
ast::provided(@ref method) => {
87+
let safe_stack = fixed_stack_segment(method.attrs);
88+
let new_cx = Context {safe_stack: safe_stack, ..in_cx};
89+
visit::walk_method_helper(&mut v, method, new_cx);
90+
}
91+
ast::required(*) => ()
92+
}
93+
}
94+
}
8395
_ => {
8496
visit::walk_item(&mut v, item, in_cx);
8597
}

branches/try/src/libstd/hashmap.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -687,6 +687,17 @@ impl<T:Hash + Eq> HashSet<T> {
687687
HashSet { map: HashMap::with_capacity(capacity) }
688688
}
689689

690+
/// Create an empty HashSet with space for at least `capacity`
691+
/// elements in the hash table, using `k0` and `k1` as the keys.
692+
///
693+
/// Warning: `k0` and `k1` are normally randomly generated, and
694+
/// are designed to allow HashSets to be resistant to attacks that
695+
/// cause many collisions and very poor performance. Setting them
696+
/// manually using this function can expose a DoS attack vector.
697+
pub fn with_capacity_and_keys(k0: u64, k1: u64, capacity: uint) -> HashSet<T> {
698+
HashSet { map: HashMap::with_capacity_and_keys(k0, k1, capacity) }
699+
}
700+
690701
/// Reserve space for at least `n` elements in the hash table.
691702
pub fn reserve_at_least(&mut self, n: uint) {
692703
self.map.reserve_at_least(n)
Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
// Copyright 2013 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+
12+
use libc::{c_void, c_char};
13+
use ptr;
14+
use ptr::RawPtr;
15+
use vec;
16+
use hashmap::HashSet;
17+
use container::MutableSet;
18+
19+
pub struct ModEntry{
20+
name: *c_char,
21+
log_level: *mut u32
22+
}
23+
struct CrateMapV0 {
24+
entries: *ModEntry,
25+
children: [*CrateMap, ..1]
26+
}
27+
28+
struct CrateMap {
29+
version: i32,
30+
annihilate_fn: *c_void,
31+
entries: *ModEntry,
32+
/// a dynamically sized struct, where all pointers to children are listed adjacent
33+
/// to the struct, terminated with NULL
34+
children: [*CrateMap, ..1]
35+
}
36+
37+
unsafe fn version(crate_map: *CrateMap) -> i32 {
38+
match (*crate_map).version {
39+
1 => return 1,
40+
_ => return 0
41+
}
42+
}
43+
44+
/// Returns a pointer to the annihilate function of the CrateMap
45+
pub unsafe fn annihilate_fn(crate_map: *CrateMap) -> *c_void {
46+
match version(crate_map) {
47+
0 => return ptr::null(),
48+
1 => return (*crate_map).annihilate_fn,
49+
_ => fail!("Unknown crate map version!")
50+
}
51+
}
52+
53+
unsafe fn entries(crate_map: *CrateMap) -> *ModEntry {
54+
match version(crate_map) {
55+
0 => {
56+
let v0 = crate_map as (*CrateMapV0);
57+
return (*v0).entries;
58+
}
59+
1 => return (*crate_map).entries,
60+
_ => fail!("Unknown crate map version!")
61+
}
62+
}
63+
64+
unsafe fn iterator(crate_map: *CrateMap) -> **CrateMap {
65+
match version(crate_map) {
66+
0 => {
67+
let v0 = crate_map as (*CrateMapV0);
68+
return vec::raw::to_ptr((*v0).children);
69+
}
70+
1 => return vec::raw::to_ptr((*crate_map).children),
71+
_ => fail!("Unknown crate map version!")
72+
}
73+
}
74+
75+
unsafe fn iter_module_map(mod_entries: *ModEntry, f: &fn(*mut ModEntry)) {
76+
let mut curr = mod_entries;
77+
78+
while !(*curr).name.is_null() {
79+
f(curr as *mut ModEntry);
80+
curr = curr.offset(1);
81+
}
82+
}
83+
84+
unsafe fn do_iter_crate_map(crate_map: *CrateMap, f: &fn(*mut ModEntry),
85+
visited: &mut HashSet<*CrateMap>) {
86+
if visited.insert(crate_map) {
87+
iter_module_map(entries(crate_map), |x| f(x));
88+
let child_crates = iterator(crate_map);
89+
do ptr::array_each(child_crates) |child| {
90+
do_iter_crate_map(child, |x| f(x), visited);
91+
}
92+
}
93+
}
94+
95+
/// Iterates recursively over `crate_map` and all child crate maps
96+
pub unsafe fn iter_crate_map(crate_map: *CrateMap, f: &fn(*mut ModEntry)) {
97+
// XXX: use random numbers as keys from the OS-level RNG when there is a nice
98+
// way to do this
99+
let mut v: HashSet<*CrateMap> = HashSet::with_capacity_and_keys(0, 0, 32);
100+
do_iter_crate_map(crate_map, f, &mut v);
101+
}
102+
103+
#[test]
104+
fn iter_crate_map_duplicates() {
105+
use c_str::ToCStr;
106+
use cast::transmute;
107+
108+
struct CrateMapT3 {
109+
version: i32,
110+
annihilate_fn: *c_void,
111+
entries: *ModEntry,
112+
children: [*CrateMap, ..3]
113+
}
114+
115+
unsafe {
116+
let mod_name1 = "c::m1".to_c_str();
117+
let mut level3: u32 = 3;
118+
119+
let entries: ~[ModEntry] = ~[
120+
ModEntry { name: mod_name1.with_ref(|buf| buf), log_level: &mut level3},
121+
ModEntry { name: ptr::null(), log_level: ptr::mut_null()}
122+
];
123+
let child_crate = CrateMap {
124+
version: 1,
125+
annihilate_fn: ptr::null(),
126+
entries: vec::raw::to_ptr(entries),
127+
children: [ptr::null()]
128+
};
129+
130+
let root_crate = CrateMapT3 {
131+
version: 1, annihilate_fn: ptr::null(),
132+
entries: vec::raw::to_ptr([ModEntry { name: ptr::null(), log_level: ptr::mut_null()}]),
133+
children: [&child_crate as *CrateMap, &child_crate as *CrateMap, ptr::null()]
134+
};
135+
136+
let mut cnt = 0;
137+
do iter_crate_map(transmute(&root_crate)) |entry| {
138+
assert!(*(*entry).log_level == 3);
139+
cnt += 1;
140+
}
141+
assert!(cnt == 1);
142+
}
143+
}
144+
145+
#[test]
146+
fn iter_crate_map_follow_children() {
147+
use c_str::ToCStr;
148+
use cast::transmute;
149+
150+
struct CrateMapT2 {
151+
version: i32,
152+
annihilate_fn: *c_void,
153+
entries: *ModEntry,
154+
children: [*CrateMap, ..2]
155+
}
156+
157+
unsafe {
158+
let mod_name1 = "c::m1".to_c_str();
159+
let mod_name2 = "c::m2".to_c_str();
160+
let mut level2: u32 = 2;
161+
let mut level3: u32 = 3;
162+
let child_crate2 = CrateMap {
163+
version: 1,
164+
annihilate_fn: ptr::null(),
165+
entries: vec::raw::to_ptr([
166+
ModEntry { name: mod_name1.with_ref(|buf| buf), log_level: &mut level2},
167+
ModEntry { name: mod_name2.with_ref(|buf| buf), log_level: &mut level3},
168+
ModEntry { name: ptr::null(), log_level: ptr::mut_null()}
169+
]),
170+
children: [ptr::null()]
171+
};
172+
173+
let child_crate1 = CrateMapT2 {
174+
version: 1,
175+
annihilate_fn: ptr::null(),
176+
entries: vec::raw::to_ptr([
177+
ModEntry { name: "t::f1".to_c_str().with_ref(|buf| buf), log_level: &mut 1},
178+
ModEntry { name: ptr::null(), log_level: ptr::mut_null()}
179+
]),
180+
children: [&child_crate2 as *CrateMap, ptr::null()]
181+
};
182+
183+
let child_crate1_ptr: *CrateMap = transmute(&child_crate1);
184+
let root_crate = CrateMapT2 {
185+
version: 1, annihilate_fn: ptr::null(),
186+
entries: vec::raw::to_ptr([
187+
ModEntry { name: "t::f1".to_c_str().with_ref(|buf| buf), log_level: &mut 0},
188+
ModEntry { name: ptr::null(), log_level: ptr::mut_null()}
189+
]),
190+
children: [child_crate1_ptr, ptr::null()]
191+
};
192+
193+
let mut cnt = 0;
194+
do iter_crate_map(transmute(&root_crate)) |entry| {
195+
assert!(*(*entry).log_level == cnt);
196+
cnt += 1;
197+
}
198+
assert!(cnt == 4);
199+
}
200+
}

branches/try/src/libstd/rt/io/buffered.rs

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -187,37 +187,31 @@ impl<W: Writer> Decorator<W> for BufferedWriter<W> {
187187
}
188188
}
189189

190-
// FIXME #9155 this should be a newtype struct
191-
struct InternalBufferedWriter<W> {
192-
inner: BufferedWriter<W>
193-
}
190+
struct InternalBufferedWriter<W>(BufferedWriter<W>);
194191

195192
impl<W: Reader> Reader for InternalBufferedWriter<W> {
196193
fn read(&mut self, buf: &mut [u8]) -> Option<uint> {
197-
self.inner.inner.read(buf)
194+
self.inner.read(buf)
198195
}
199196

200197
fn eof(&mut self) -> bool {
201-
self.inner.inner.eof()
198+
self.inner.eof()
202199
}
203200
}
204201

205202
/// Wraps a Stream and buffers input and output to and from it
206203
///
207204
/// NOTE: `BufferedStream` will NOT flush its output buffer when dropped.
208-
// FIXME #9155 this should be a newtype struct
209-
pub struct BufferedStream<S> {
210-
priv inner: BufferedReader<InternalBufferedWriter<S>>
211-
}
205+
pub struct BufferedStream<S>(BufferedReader<InternalBufferedWriter<S>>);
212206

213207
impl<S: Stream> BufferedStream<S> {
214208
pub fn with_capacities(reader_cap: uint, writer_cap: uint, inner: S)
215209
-> BufferedStream<S> {
216210
let writer = BufferedWriter::with_capacity(writer_cap, inner);
217-
let internal_writer = InternalBufferedWriter { inner: writer };
211+
let internal_writer = InternalBufferedWriter(writer);
218212
let reader = BufferedReader::with_capacity(reader_cap,
219213
internal_writer);
220-
BufferedStream { inner: reader }
214+
BufferedStream(reader)
221215
}
222216

223217
pub fn new(inner: S) -> BufferedStream<S> {
@@ -228,35 +222,35 @@ impl<S: Stream> BufferedStream<S> {
228222

229223
impl<S: Stream> Reader for BufferedStream<S> {
230224
fn read(&mut self, buf: &mut [u8]) -> Option<uint> {
231-
self.inner.read(buf)
225+
(**self).read(buf)
232226
}
233227

234228
fn eof(&mut self) -> bool {
235-
self.inner.eof()
229+
(**self).eof()
236230
}
237231
}
238232

239233
impl<S: Stream> Writer for BufferedStream<S> {
240234
fn write(&mut self, buf: &[u8]) {
241-
self.inner.inner.inner.write(buf)
235+
self.inner.write(buf)
242236
}
243237

244238
fn flush(&mut self) {
245-
self.inner.inner.inner.flush()
239+
self.inner.flush()
246240
}
247241
}
248242

249243
impl<S: Stream> Decorator<S> for BufferedStream<S> {
250244
fn inner(self) -> S {
251-
self.inner.inner.inner.inner()
245+
self.inner.inner()
252246
}
253247

254248
fn inner_ref<'a>(&'a self) -> &'a S {
255-
self.inner.inner.inner.inner_ref()
249+
self.inner.inner_ref()
256250
}
257251

258252
fn inner_mut_ref<'a>(&'a mut self) -> &'a mut S {
259-
self.inner.inner.inner.inner_mut_ref()
253+
self.inner.inner_mut_ref()
260254
}
261255
}
262256

0 commit comments

Comments
 (0)