Skip to content

Commit f9be601

Browse files
killerswanerickt
authored andcommitted
---
yaml --- r: 23615 b: refs/heads/master c: d47cb10 h: refs/heads/master i: 23613: 113f38b 23611: 2930ee6 23607: c8272dd 23599: f75c3d0 23583: 259bdd0 23551: cb8536f v: v3
1 parent e85a7f4 commit f9be601

File tree

8 files changed

+156
-47
lines changed

8 files changed

+156
-47
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: 5c6be13b29c44920a39b9b9e95931f734b60d92b
2+
refs/heads/master: d47cb101bf8627025345d17a5b0e9bfb6c2d01fa
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: cd6f24f9d14ac90d167386a56e7a6ac1f0318195
55
refs/heads/try: ffbe0e0e00374358b789b0037bcb3a577cd218be

trunk/src/libcore/io.rs

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -663,21 +663,24 @@ type MemBuffer = @{buf: DVec<u8>, mut pos: uint};
663663
664664
impl MemBuffer: Writer {
665665
fn write(v: &[const u8]) {
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;
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+
}
678674
679-
buf
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;
680681
}
682+
self.buf.push_slice(v, vpos, vlen);
683+
self.pos += vlen;
681684
}
682685
fn seek(offset: int, whence: SeekStyle) {
683686
let pos = self.pos;

trunk/src/libcore/result.rs

Lines changed: 10 additions & 13 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_err called on ok result"
56+
Ok(_) => fail ~"get_error called on ok result"
5757
}
5858
}
5959

@@ -341,18 +341,15 @@ 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-
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"
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;
356353
}
357354
}
358355

trunk/src/libcore/str.rs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,12 @@ 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+
118124
/*
119125
Section: Creating a string
120126
*/
@@ -214,9 +220,14 @@ fn push_char(&s: ~str, ch: char) {
214220
*ptr::mut_offset(buf, off + 5u) =
215221
(code & 63u | tag_cont) as u8;
216222
}
223+
*ptr::mut_offset(buf, off + nb) = 0u8;
217224
}
218225

219-
unsafe::set_len(s, new_len);
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+
}
220231
}
221232
}
222233

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

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

19942004
/// Appends a byte to a string. (Not UTF-8 safe).
19952005
unsafe fn push_byte(&s: ~str, b: u8) {
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);
2006+
rustrt::rust_str_push(s, b);
20022007
}
20032008

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

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

trunk/src/libcore/vec.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ 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;
105108
}
106109

107110
#[abi = "rust-intrinsic"]
@@ -1724,11 +1727,10 @@ mod unsafe {
17241727
*/
17251728
#[inline(always)]
17261729
unsafe fn from_buf<T>(ptr: *T, elts: uint) -> ~[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
1730+
return ::unsafe::reinterpret_cast(
1731+
rustrt::vec_from_buf_shared(sys::get_type_desc::<T>(),
1732+
ptr as *(),
1733+
elts as size_t));
17321734
}
17331735

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

18791881
/// Byte-vec hash function
1880-
pure fn hash(s: &~[u8]) -> uint {
1882+
fn hash(s: &~[u8]) -> uint {
18811883
hash::hash_bytes(*s) as uint
18821884
}
18831885

trunk/src/libstd/json.rs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,69 @@ fn to_writer(wr: io::Writer, j: Json) {
8686
}
8787
}
8888

89+
/// Serializes a json value into a io::writer
90+
fn to_writer_pretty(wr: io::Writer, j: Json, indent: uint) {
91+
fn spaces(n: uint) -> ~str {
92+
let ss = ~"";
93+
n.times { str::push_str(ss, " "); }
94+
return ss;
95+
}
96+
97+
match j {
98+
Num(n) => wr.write_str(float::to_str(n, 6u)),
99+
String(s) => wr.write_str(escape_str(*s)),
100+
Boolean(b) => wr.write_str(if b { ~"true" } else { ~"false" }),
101+
List(v) => {
102+
// [
103+
wr.write_str(spaces(indent));
104+
wr.write_str("[ ");
105+
106+
// [ elem,
107+
// elem,
108+
// elem ]
109+
let inner_indent = indent + 2;
110+
let mut first = true;
111+
for (*v).each |item| {
112+
if !first {
113+
wr.write_str(~",\n");
114+
wr.write_str(spaces(inner_indent));
115+
}
116+
first = false;
117+
to_writer_pretty(wr, item, inner_indent);
118+
};
119+
120+
// ]
121+
wr.write_str(~" ]");
122+
}
123+
Dict(d) => {
124+
// {
125+
wr.write_str(spaces(indent));
126+
wr.write_str(~"{ ");
127+
128+
// { k: v,
129+
// k: v,
130+
// k: v }
131+
let inner_indent = indent + 2;
132+
let mut first = true;
133+
for d.each |key, value| {
134+
if !first {
135+
wr.write_str(~",\n");
136+
wr.write_str(spaces(inner_indent));
137+
}
138+
first = false;
139+
let key = str::append(escape_str(key), ~": ");
140+
let key_indent = str::len(key);
141+
wr.write_str(key);
142+
to_writer_pretty(wr, value, key_indent);
143+
};
144+
145+
// }
146+
wr.write_str(~" }");
147+
}
148+
Null => wr.write_str(~"null")
149+
}
150+
}
151+
89152
fn escape_str(s: ~str) -> ~str {
90153
let mut escaped = ~"\"";
91154
do str::chars_iter(s) |c| {
@@ -111,6 +174,11 @@ fn to_str(j: Json) -> ~str {
111174
io::with_str_writer(|wr| to_writer(wr, j))
112175
}
113176

177+
/// Serializes a json value into a string, with whitespace and sorting
178+
fn to_str_pretty(j: Json) -> ~str {
179+
io::with_str_writer(|wr| to_writer_pretty(wr, j, 0))
180+
}
181+
114182
type Parser_ = {
115183
rdr: io::Reader,
116184
mut ch: char,

trunk/src/rt/rust_builtin.cpp

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

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

484517
if (zone != NULL) {
485-
rust_task *task = rust_get_current_task();
486518
size_t size = strlen(zone);
487-
reserve_vec_exact(task, &out_tm->tm_zone, size + 1);
519+
str_reserve_shared(&out_tm->tm_zone, size);
488520
memcpy(out_tm->tm_zone->body.data, zone, size);
489521
out_tm->tm_zone->body.fill = size + 1;
490522
out_tm->tm_zone->body.data[size] = '\0';

trunk/src/rt/rustrt.def.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ rust_getcwd
3838
rust_get_stdin
3939
rust_get_stdout
4040
rust_get_stderr
41+
rust_str_push
4142
rust_list_files
4243
rust_log_console_on
4344
rust_log_console_off
@@ -61,6 +62,8 @@ shape_log_str
6162
start_task
6263
vec_reserve_shared_actual
6364
vec_reserve_shared
65+
str_reserve_shared
66+
vec_from_buf_shared
6467
task_clear_event_reject
6568
task_wait_event
6669
task_signal_event

0 commit comments

Comments
 (0)