Skip to content

Commit aa345c5

Browse files
committed
---
yaml --- r: 60119 b: refs/heads/master c: d12d255 h: refs/heads/master i: 60117: e366ca2 60115: 73884d7 60111: 49c66fe v: v3
1 parent 3f5f3cb commit aa345c5

File tree

5 files changed

+115
-74
lines changed

5 files changed

+115
-74
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 8919f32f8320847501182e517b26b9755fc97041
2+
refs/heads/master: d12d25534b01632f7b19fae85854032ebb1b319c
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 2d28d645422c1617be58c8ca7ad9a457264ca850
55
refs/heads/try: c50a9d5b664478e533ba1d1d353213d70c8ad589

trunk/src/libcore/comm.rs

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,9 @@ impl<T: Owned> Selectable for Port<T> {
234234
}
235235
236236
/// Treat many ports as one.
237+
#[unsafe_mut_field(ports)]
237238
pub struct PortSet<T> {
238-
mut ports: ~[Port<T>],
239+
ports: ~[Port<T>],
239240
}
240241
241242
pub impl<T: Owned> PortSet<T> {
@@ -246,7 +247,10 @@ pub impl<T: Owned> PortSet<T> {
246247
}
247248
248249
fn add(&self, port: Port<T>) {
249-
self.ports.push(port)
250+
unsafe {
251+
let self_ports = transmute_mut(&self.ports);
252+
self_ports.push(port)
253+
}
250254
}
251255
252256
fn chan(&self) -> Chan<T> {
@@ -258,25 +262,28 @@ pub impl<T: Owned> PortSet<T> {
258262
259263
impl<T:Owned> GenericPort<T> for PortSet<T> {
260264
fn try_recv(&self) -> Option<T> {
261-
let mut result = None;
262-
// we have to swap the ports array so we aren't borrowing
263-
// aliasable mutable memory.
264-
let mut ports = ~[];
265-
ports <-> self.ports;
266-
while result.is_none() && ports.len() > 0 {
267-
let i = wait_many(ports);
268-
match ports[i].try_recv() {
269-
Some(m) => {
270-
result = Some(m);
271-
}
272-
None => {
273-
// Remove this port.
274-
let _ = ports.swap_remove(i);
265+
unsafe {
266+
let mut self_ports = transmute_mut(&self.ports);
267+
let mut result = None;
268+
// we have to swap the ports array so we aren't borrowing
269+
// aliasable mutable memory.
270+
let mut ports = ~[];
271+
ports <-> *self_ports;
272+
while result.is_none() && ports.len() > 0 {
273+
let i = wait_many(ports);
274+
match ports[i].try_recv() {
275+
Some(m) => {
276+
result = Some(m);
277+
}
278+
None => {
279+
// Remove this port.
280+
let _ = ports.swap_remove(i);
281+
}
275282
}
276283
}
284+
ports <-> *self_ports;
285+
result
277286
}
278-
ports <-> self.ports;
279-
result
280287
}
281288
fn recv(&self) -> T {
282289
self.try_recv().expect("port_set: endpoints closed")
@@ -288,10 +295,9 @@ impl<T: Owned> Peekable<T> for PortSet<T> {
288295
// It'd be nice to use self.port.each, but that version isn't
289296
// pure.
290297
for uint::range(0, vec::uniq_len(&const self.ports)) |i| {
291-
// XXX: Botch pending demuting.
292-
unsafe {
293-
let port: &Port<T> = cast::transmute(&mut self.ports[i]);
294-
if port.peek() { return true }
298+
let port: &Port<T> = &self.ports[i];
299+
if port.peek() {
300+
return true;
295301
}
296302
}
297303
false

trunk/src/libcore/io.rs

Lines changed: 68 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -983,36 +983,50 @@ pub fn file_reader(path: &Path) -> Result<@Reader, ~str> {
983983
// Byte readers
984984
pub struct BytesReader<'self> {
985985
bytes: &'self [u8],
986-
mut pos: uint
986+
pos: @mut uint
987987
}
988988
989989
impl<'self> Reader for BytesReader<'self> {
990990
fn read(&self, bytes: &mut [u8], len: uint) -> uint {
991-
let count = uint::min(len, self.bytes.len() - self.pos);
991+
let count = uint::min(len, self.bytes.len() - *self.pos);
992992
993-
let view = vec::slice(self.bytes, self.pos, self.bytes.len());
993+
let view = vec::slice(self.bytes, *self.pos, self.bytes.len());
994994
vec::bytes::copy_memory(bytes, view, count);
995995
996-
self.pos += count;
996+
*self.pos += count;
997997
998998
count
999999
}
1000+
10001001
fn read_byte(&self) -> int {
1001-
if self.pos == self.bytes.len() { return -1; }
1002-
let b = self.bytes[self.pos];
1003-
self.pos += 1u;
1004-
return b as int;
1002+
if *self.pos == self.bytes.len() {
1003+
return -1;
1004+
}
1005+
1006+
let b = self.bytes[*self.pos];
1007+
*self.pos += 1u;
1008+
b as int
10051009
}
1006-
fn eof(&self) -> bool { self.pos == self.bytes.len() }
1010+
1011+
fn eof(&self) -> bool {
1012+
*self.pos == self.bytes.len()
1013+
}
1014+
10071015
fn seek(&self, offset: int, whence: SeekStyle) {
1008-
let pos = self.pos;
1009-
self.pos = seek_in_buf(offset, pos, self.bytes.len(), whence);
1016+
let pos = *self.pos;
1017+
*self.pos = seek_in_buf(offset, pos, self.bytes.len(), whence);
1018+
}
1019+
1020+
fn tell(&self) -> uint {
1021+
*self.pos
10101022
}
1011-
fn tell(&self) -> uint { self.pos }
10121023
}
10131024
1014-
pub fn with_bytes_reader<t>(bytes: &[u8], f: &fn(@Reader) -> t) -> t {
1015-
f(@BytesReader { bytes: bytes, pos: 0u } as @Reader)
1025+
pub fn with_bytes_reader<T>(bytes: &[u8], f: &fn(@Reader) -> T) -> T {
1026+
f(@BytesReader {
1027+
bytes: bytes,
1028+
pos: @mut 0
1029+
} as @Reader)
10161030
}
10171031
10181032
pub fn with_str_reader<T>(s: &str, f: &fn(@Reader) -> T) -> T {
@@ -1498,49 +1512,67 @@ pub fn buffered_file_writer(path: &Path) -> Result<@Writer, ~str> {
14981512
pub fn stdout() -> @Writer { fd_writer(libc::STDOUT_FILENO as c_int, false) }
14991513
pub fn stderr() -> @Writer { fd_writer(libc::STDERR_FILENO as c_int, false) }
15001514
1501-
pub fn print(s: &str) { stdout().write_str(s); }
1502-
pub fn println(s: &str) { stdout().write_line(s); }
1515+
pub fn print(s: &str) {
1516+
stdout().write_str(s);
1517+
}
1518+
1519+
pub fn println(s: &str) {
1520+
stdout().write_line(s);
1521+
}
15031522
15041523
pub struct BytesWriter {
1505-
mut bytes: ~[u8],
1506-
mut pos: uint,
1524+
bytes: @mut ~[u8],
1525+
pos: @mut uint,
15071526
}
15081527
15091528
impl Writer for BytesWriter {
15101529
fn write(&self, v: &[u8]) {
15111530
let v_len = v.len();
1512-
let bytes_len = vec::uniq_len(&const self.bytes);
1531+
let bytes_len = vec::uniq_len(&const *self.bytes);
15131532
1514-
let count = uint::max(bytes_len, self.pos + v_len);
1515-
vec::reserve(&mut self.bytes, count);
1533+
let count = uint::max(bytes_len, *self.pos + v_len);
1534+
vec::reserve(&mut *self.bytes, count);
15161535
15171536
unsafe {
1518-
vec::raw::set_len(&mut self.bytes, count);
1519-
let view = vec::mut_slice(self.bytes, self.pos, count);
1537+
vec::raw::set_len(&mut *self.bytes, count);
1538+
let view = vec::mut_slice(*self.bytes, *self.pos, count);
15201539
vec::bytes::copy_memory(view, v, v_len);
15211540
}
15221541
1523-
self.pos += v_len;
1542+
*self.pos += v_len;
15241543
}
1544+
15251545
fn seek(&self, offset: int, whence: SeekStyle) {
1526-
let pos = self.pos;
1527-
let len = vec::uniq_len(&const self.bytes);
1528-
self.pos = seek_in_buf(offset, pos, len, whence);
1546+
let pos = *self.pos;
1547+
let len = vec::uniq_len(&const *self.bytes);
1548+
*self.pos = seek_in_buf(offset, pos, len, whence);
1549+
}
1550+
1551+
fn tell(&self) -> uint {
1552+
*self.pos
1553+
}
1554+
1555+
fn flush(&self) -> int {
1556+
0
1557+
}
1558+
1559+
fn get_type(&self) -> WriterType {
1560+
File
15291561
}
1530-
fn tell(&self) -> uint { self.pos }
1531-
fn flush(&self) -> int { 0 }
1532-
fn get_type(&self) -> WriterType { File }
15331562
}
15341563
15351564
pub fn BytesWriter() -> BytesWriter {
1536-
BytesWriter { bytes: ~[], mut pos: 0u }
1565+
BytesWriter {
1566+
bytes: @mut ~[],
1567+
pos: @mut 0
1568+
}
15371569
}
15381570
15391571
pub fn with_bytes_writer(f: &fn(@Writer)) -> ~[u8] {
15401572
let wr = @BytesWriter();
15411573
f(wr as @Writer);
1542-
let @BytesWriter{bytes, _} = wr;
1543-
return bytes;
1574+
let @BytesWriter { bytes, _ } = wr;
1575+
copy *bytes
15441576
}
15451577
15461578
pub fn with_str_writer(f: &fn(@Writer)) -> ~str {
@@ -1550,7 +1582,9 @@ pub fn with_str_writer(f: &fn(@Writer)) -> ~str {
15501582
v.push(0);
15511583
assert!(str::is_utf8(v));
15521584
1553-
unsafe { ::cast::transmute(v) }
1585+
unsafe {
1586+
::cast::transmute(v)
1587+
}
15541588
}
15551589
15561590
// Utility functions

trunk/src/librustc/metadata/encoder.rs

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1372,41 +1372,40 @@ pub fn encode_metadata(parms: EncodeParams, crate: &crate) -> ~[u8] {
13721372
13731373
encode_hash(&mut ebml_w, ecx.link_meta.extras_hash);
13741374
1375-
let mut i = wr.pos;
1375+
let mut i = *wr.pos;
13761376
let crate_attrs = synthesize_crate_attrs(ecx, crate);
13771377
encode_attributes(&mut ebml_w, crate_attrs);
1378-
ecx.stats.attr_bytes = wr.pos - i;
1378+
ecx.stats.attr_bytes = *wr.pos - i;
13791379
1380-
i = wr.pos;
1380+
i = *wr.pos;
13811381
encode_crate_deps(ecx, &mut ebml_w, ecx.cstore);
1382-
ecx.stats.dep_bytes = wr.pos - i;
1382+
ecx.stats.dep_bytes = *wr.pos - i;
13831383
13841384
// Encode the language items.
1385-
i = wr.pos;
1385+
i = *wr.pos;
13861386
encode_lang_items(ecx, &mut ebml_w);
1387-
ecx.stats.lang_item_bytes = wr.pos - i;
1387+
ecx.stats.lang_item_bytes = *wr.pos - i;
13881388
13891389
// Encode the link args.
1390-
i = wr.pos;
1390+
i = *wr.pos;
13911391
encode_link_args(ecx, &mut ebml_w);
1392-
ecx.stats.link_args_bytes = wr.pos - i;
1392+
ecx.stats.link_args_bytes = *wr.pos - i;
13931393
13941394
// Encode and index the items.
13951395
ebml_w.start_tag(tag_items);
1396-
i = wr.pos;
1396+
i = *wr.pos;
13971397
let items_index = encode_info_for_items(ecx, &mut ebml_w, crate);
1398-
ecx.stats.item_bytes = wr.pos - i;
1398+
ecx.stats.item_bytes = *wr.pos - i;
13991399
1400-
i = wr.pos;
1400+
i = *wr.pos;
14011401
let items_buckets = create_index(items_index);
14021402
encode_index(&mut ebml_w, items_buckets, write_int);
1403-
ecx.stats.index_bytes = wr.pos - i;
1403+
ecx.stats.index_bytes = *wr.pos - i;
14041404
ebml_w.end_tag();
14051405
1406-
ecx.stats.total_bytes = wr.pos;
1406+
ecx.stats.total_bytes = *wr.pos;
14071407
14081408
if (tcx.sess.meta_stats()) {
1409-
14101409
do wr.bytes.each |e| {
14111410
if *e == 0 {
14121411
ecx.stats.zero_bytes += 1;
@@ -1438,9 +1437,11 @@ pub fn encode_metadata(parms: EncodeParams, crate: &crate) -> ~[u8] {
14381437
//
14391438
// vec::from_slice(metadata_encoding_version) +
14401439
1440+
let writer_bytes: &mut ~[u8] = wr.bytes;
1441+
14411442
(do str::as_bytes(&~"rust\x00\x00\x00\x01") |bytes| {
14421443
vec::slice(*bytes, 0, 8).to_vec()
1443-
}) + flate::deflate_bytes(wr.bytes)
1444+
}) + flate::deflate_bytes(*writer_bytes)
14441445
}
14451446

14461447
// Get the encoded string for a type

trunk/src/libstd/io_util.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@ pub impl BufReader {
2929
// I can't get the borrowing to work correctly
3030
let bytes_reader = BytesReader {
3131
bytes: ::core::util::id::<&[u8]>(self.buf),
32-
pos: *self.pos
32+
pos: @mut *self.pos
3333
};
3434

3535
let res = f(&bytes_reader);
3636

3737
// FIXME #4429: This isn't correct if f fails
38-
*self.pos = bytes_reader.pos;
38+
*self.pos = *bytes_reader.pos;
3939

4040
return res;
4141
}

0 commit comments

Comments
 (0)