Skip to content

Commit d31f02a

Browse files
committed
---
yaml --- r: 32299 b: refs/heads/dist-snap c: a0de6b6 h: refs/heads/master i: 32297: 43dbe99 32295: bbe93ff v: v3
1 parent 684d11f commit d31f02a

File tree

7 files changed

+47
-88
lines changed

7 files changed

+47
-88
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: d0c6ce338884ee21843f4b40bf6bf18d222ce5df
99
refs/heads/incoming: d9317a174e434d4c99fc1a37fd7dc0d2f5328d37
10-
refs/heads/dist-snap: 6d8d258f35321ed257d76d5e3c6458eed00ba574
10+
refs/heads/dist-snap: a0de6b6d5f2ed9ba26468f446d9030c8f87b03fc
1111
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1212
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/dist-snap/src/libcore/io.rs

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -663,24 +663,21 @@ type MemBuffer = @{buf: DVec<u8>, mut pos: uint};
663663
664664
impl MemBuffer: Writer {
665665
fn write(v: &[const u8]) {
666-
// Fast path.
667-
let vlen = vec::len(v);
668-
let buf_len = self.buf.len();
669-
if self.pos == buf_len {
670-
self.buf.push_all(v);
671-
self.pos += vlen;
672-
return;
673-
}
666+
do self.buf.swap |buf| {
667+
let mut buf <- buf;
668+
let v_len = v.len();
669+
let buf_len = buf.len();
670+
671+
let count = uint::max(&buf_len, &(self.pos + v_len));
672+
vec::reserve(buf, count);
673+
unsafe { vec::unsafe::set_len(buf, count); }
674+
675+
vec::u8::memcpy(vec::mut_view(buf, self.pos, count), v, v_len);
676+
677+
self.pos += v_len;
674678
675-
// FIXME #2004--use memcpy here?
676-
let mut pos = self.pos, vpos = 0u;
677-
while vpos < vlen && pos < buf_len {
678-
self.buf.set_elt(pos, copy v[vpos]);
679-
pos += 1u;
680-
vpos += 1u;
679+
buf
681680
}
682-
self.buf.push_slice(v, vpos, vlen);
683-
self.pos += vlen;
684681
}
685682
fn seek(offset: int, whence: SeekStyle) {
686683
let pos = self.pos;

branches/dist-snap/src/libcore/result.rs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ pure fn get_ref<T, U>(res: &a/Result<T, U>) -> &a/T {
5353
pure fn get_err<T, U: copy>(res: Result<T, U>) -> U {
5454
match res {
5555
Err(u) => u,
56-
Ok(_) => fail ~"get_error called on ok result"
56+
Ok(_) => fail ~"get_err called on ok result"
5757
}
5858
}
5959

@@ -341,15 +341,18 @@ fn iter_vec2<S,T,U:copy>(ss: &[S], ts: &[T],
341341
}
342342

343343
/// Unwraps a result, assuming it is an `ok(T)`
344-
fn unwrap<T, U>(-res: Result<T, U>) -> T {
345-
unsafe {
346-
let addr = match res {
347-
Ok(x) => ptr::addr_of(x),
348-
Err(_) => fail ~"error result"
349-
};
350-
let liberated_value = unsafe::reinterpret_cast(*addr);
351-
unsafe::forget(res);
352-
return liberated_value;
344+
fn unwrap<T, U>(+res: Result<T, U>) -> T {
345+
match move res {
346+
Ok(move t) => t,
347+
Err(_) => fail ~"unwrap called on an err result"
348+
}
349+
}
350+
351+
/// Unwraps a result, assuming it is an `err(U)`
352+
fn unwrap_err<T, U>(+res: Result<T, U>) -> U {
353+
match move res {
354+
Err(move u) => u,
355+
Ok(_) => fail ~"unwrap called on an ok result"
353356
}
354357
}
355358

branches/dist-snap/src/libcore/str.rs

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -115,12 +115,6 @@ export
115115
StrSlice,
116116
UniqueStr;
117117

118-
#[abi = "cdecl"]
119-
extern mod rustrt {
120-
fn rust_str_push(&s: ~str, ch: u8);
121-
fn str_reserve_shared(&ss: ~str, nn: libc::size_t);
122-
}
123-
124118
/*
125119
Section: Creating a string
126120
*/
@@ -220,14 +214,9 @@ fn push_char(&s: ~str, ch: char) {
220214
*ptr::mut_offset(buf, off + 5u) =
221215
(code & 63u | tag_cont) as u8;
222216
}
223-
*ptr::mut_offset(buf, off + nb) = 0u8;
224217
}
225218

226-
do as_bytes(s) |bytes| {
227-
let mut mut_bytes: ~[u8] = ::unsafe::reinterpret_cast(bytes);
228-
vec::unsafe::set_len(mut_bytes, new_len + 1u);
229-
::unsafe::forget(mut_bytes);
230-
}
219+
unsafe::set_len(s, new_len);
231220
}
232221
}
233222

@@ -1824,8 +1813,9 @@ pure fn as_buf<T>(s: &str, f: fn(*u8, uint) -> T) -> T {
18241813
* * n - The number of bytes to reserve space for
18251814
*/
18261815
fn reserve(&s: ~str, n: uint) {
1827-
if capacity(s) < n {
1828-
rustrt::str_reserve_shared(s, n as size_t);
1816+
unsafe {
1817+
let v: *mut ~[u8] = ::unsafe::reinterpret_cast(ptr::addr_of(s));
1818+
vec::reserve(*v, n + 1);
18291819
}
18301820
}
18311821

@@ -2003,12 +1993,18 @@ mod unsafe {
20031993

20041994
/// Appends a byte to a string. (Not UTF-8 safe).
20051995
unsafe fn push_byte(&s: ~str, b: u8) {
2006-
rustrt::rust_str_push(s, b);
1996+
reserve_at_least(s, s.len() + 1);
1997+
do as_buf(s) |buf, len| {
1998+
let buf: *mut u8 = ::unsafe::reinterpret_cast(buf);
1999+
*ptr::mut_offset(buf, len) = b;
2000+
}
2001+
set_len(s, s.len() + 1);
20072002
}
20082003

20092004
/// Appends a vector of bytes to a string. (Not UTF-8 safe).
20102005
unsafe fn push_bytes(&s: ~str, bytes: ~[u8]) {
2011-
for vec::each(bytes) |byte| { rustrt::rust_str_push(s, byte); }
2006+
reserve_at_least(s, s.len() + bytes.len());
2007+
for vec::each(bytes) |byte| { push_byte(s, byte); }
20122008
}
20132009

20142010
/// Removes the last byte from a string and returns it. (Not UTF-8 safe).

branches/dist-snap/src/libcore/vec.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,6 @@ extern mod rustrt {
102102
fn vec_reserve_shared(++t: *sys::TypeDesc,
103103
++v: **unsafe::VecRepr,
104104
++n: libc::size_t);
105-
fn vec_from_buf_shared(++t: *sys::TypeDesc,
106-
++ptr: *(),
107-
++count: libc::size_t) -> *unsafe::VecRepr;
108105
}
109106

110107
#[abi = "rust-intrinsic"]
@@ -1727,10 +1724,11 @@ mod unsafe {
17271724
*/
17281725
#[inline(always)]
17291726
unsafe fn from_buf<T>(ptr: *T, elts: uint) -> ~[T] {
1730-
return ::unsafe::reinterpret_cast(
1731-
rustrt::vec_from_buf_shared(sys::get_type_desc::<T>(),
1732-
ptr as *(),
1733-
elts as size_t));
1727+
let mut dst = ~[];
1728+
reserve(dst, elts);
1729+
set_len(dst, elts);
1730+
as_buf(dst, |p_dst, _len_dst| ptr::memcpy(p_dst, ptr, elts));
1731+
dst
17341732
}
17351733

17361734
/**
@@ -1879,7 +1877,7 @@ mod u8 {
18791877
pure fn gt(a: &~[u8], b: &~[u8]) -> bool { cmp(a, b) > 0 }
18801878

18811879
/// Byte-vec hash function
1882-
fn hash(s: &~[u8]) -> uint {
1880+
pure fn hash(s: &~[u8]) -> uint {
18831881
hash::hash_bytes(*s) as uint
18841882
}
18851883

branches/dist-snap/src/rt/rust_builtin.cpp

Lines changed: 2 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -142,39 +142,6 @@ vec_reserve_shared(type_desc* ty, rust_vec_box** vp,
142142
reserve_vec_exact(task, vp, n_elts * ty->size);
143143
}
144144

145-
extern "C" CDECL void
146-
str_reserve_shared(rust_vec_box** sp,
147-
size_t n_elts) {
148-
rust_task *task = rust_get_current_task();
149-
reserve_vec_exact(task, sp, n_elts + 1);
150-
}
151-
152-
/**
153-
* Copies elements in an unsafe buffer to the given interior vector. The
154-
* vector must have size zero.
155-
*/
156-
extern "C" CDECL rust_vec_box*
157-
vec_from_buf_shared(type_desc *ty, void *ptr, size_t count) {
158-
rust_task *task = rust_get_current_task();
159-
size_t fill = ty->size * count;
160-
rust_vec_box* v = (rust_vec_box*)
161-
task->kernel->malloc(fill + sizeof(rust_vec_box),
162-
"vec_from_buf");
163-
v->body.fill = v->body.alloc = fill;
164-
memmove(&v->body.data[0], ptr, fill);
165-
return v;
166-
}
167-
168-
extern "C" CDECL void
169-
rust_str_push(rust_vec_box** sp, uint8_t byte) {
170-
rust_task *task = rust_get_current_task();
171-
size_t fill = (*sp)->body.fill;
172-
reserve_vec(task, sp, fill + 1);
173-
(*sp)->body.data[fill-1] = byte;
174-
(*sp)->body.data[fill] = 0;
175-
(*sp)->body.fill = fill + 1;
176-
}
177-
178145
extern "C" CDECL rust_vec*
179146
rand_seed() {
180147
size_t size = sizeof(ub4) * RANDSIZ;
@@ -516,8 +483,9 @@ void tm_to_rust_tm(tm* in_tm, rust_tm* out_tm, int32_t gmtoff,
516483
out_tm->tm_nsec = nsec;
517484

518485
if (zone != NULL) {
486+
rust_task *task = rust_get_current_task();
519487
size_t size = strlen(zone);
520-
str_reserve_shared(&out_tm->tm_zone, size);
488+
reserve_vec_exact(task, &out_tm->tm_zone, size + 1);
521489
memcpy(out_tm->tm_zone->body.data, zone, size);
522490
out_tm->tm_zone->body.fill = size + 1;
523491
out_tm->tm_zone->body.data[size] = '\0';

branches/dist-snap/src/rt/rustrt.def.in

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ rust_getcwd
3838
rust_get_stdin
3939
rust_get_stdout
4040
rust_get_stderr
41-
rust_str_push
4241
rust_list_files
4342
rust_log_console_on
4443
rust_log_console_off
@@ -62,8 +61,6 @@ shape_log_str
6261
start_task
6362
vec_reserve_shared_actual
6463
vec_reserve_shared
65-
str_reserve_shared
66-
vec_from_buf_shared
6764
task_clear_event_reject
6865
task_wait_event
6966
task_signal_event

0 commit comments

Comments
 (0)