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:
parent
14567c5eb0
commit
b099b1e3f7
4 changed files with 17 additions and 4 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue