1
Fork 0

Make std::istr::push_byte efficient

It used to allocate two (!) heap values per pushed byte. It now goes through
a runtime function that simply grows the istr and writes the byte.
This commit is contained in:
Marijn Haverbeke 2011-08-29 22:46:25 +02:00
parent 14567c5eb0
commit b099b1e3f7
4 changed files with 17 additions and 4 deletions

View file

@ -8,6 +8,10 @@ as_buf, push_byte;
export from_estr, to_estr, from_estrs, to_estrs;
native "rust" mod rustrt {
fn rust_istr_push(s: &mutable istr, ch: u8);
}
fn from_estr(s: &str) -> istr {
let s2 = ~"";
for u in s {
@ -361,12 +365,12 @@ fn pop_byte(s: &mutable istr) -> u8 {
}
fn push_byte(s: &mutable istr, b: u8) {
s += unsafe_from_byte(b);
rustrt::rust_istr_push(s, b);
}
fn push_bytes(s: &mutable istr, bytes: &[u8]) {
for byte in bytes {
push_byte(s, byte);
rustrt::rust_istr_push(s, byte);
}
}

View file

@ -243,6 +243,15 @@ vec_from_buf_shared(rust_task *task, type_desc *ty,
return v;
}
extern "C" CDECL void
rust_istr_push(rust_task* task, rust_vec** sp, uint8_t byte) {
size_t fill = (*sp)->fill;
reserve_vec(task, sp, fill + 1);
(*sp)->data[fill-1] = byte;
(*sp)->data[fill] = 0;
(*sp)->fill = fill + 1;
}
extern "C" CDECL rust_str *
str_from_cstr(rust_task *task, char *sbuf)
{

View file

@ -362,7 +362,6 @@ upcall_vec_push(rust_task* task, rust_vec** vp, type_desc* elt_ty,
v->fill += elt_ty->size;
}
/**
* Returns a token that can be used to deallocate all of the allocated space
* space in the dynamic stack.

View file

@ -84,6 +84,7 @@ upcall_get_type_desc
upcall_grow_task
upcall_vec_grow
upcall_vec_push
upcall_istr_push
upcall_kill
upcall_log_double
upcall_log_float