diff options
| author | Daniel Micay <danielmicay@gmail.com> | 2013-07-30 00:33:52 -0400 |
|---|---|---|
| committer | Daniel Micay <danielmicay@gmail.com> | 2013-07-30 02:50:31 -0400 |
| commit | ef870d37a58df136b18f1440f45d4f0102c55c1a (patch) | |
| tree | 3f30f5d551a247978a6fc1a6af602126ed518121 /src/libextra | |
| parent | e94e4d51ca01db908748ab79bafe3254bede645b (diff) | |
implement pointer arithmetic with GEP
Closes #8118, #7136
~~~rust
extern mod extra;
use std::vec;
use std::ptr;
fn bench_from_elem(b: &mut extra::test::BenchHarness) {
do b.iter {
let v: ~[u8] = vec::from_elem(1024, 0u8);
}
}
fn bench_set_memory(b: &mut extra::test::BenchHarness) {
do b.iter {
let mut v: ~[u8] = vec::with_capacity(1024);
unsafe {
let vp = vec::raw::to_mut_ptr(v);
ptr::set_memory(vp, 0, 1024);
vec::raw::set_len(&mut v, 1024);
}
}
}
fn bench_vec_repeat(b: &mut extra::test::BenchHarness) {
do b.iter {
let v: ~[u8] = ~[0u8, ..1024];
}
}
~~~
Before:
test bench_from_elem ... bench: 415 ns/iter (+/- 17)
test bench_set_memory ... bench: 85 ns/iter (+/- 4)
test bench_vec_repeat ... bench: 83 ns/iter (+/- 3)
After:
test bench_from_elem ... bench: 84 ns/iter (+/- 2)
test bench_set_memory ... bench: 84 ns/iter (+/- 5)
test bench_vec_repeat ... bench: 84 ns/iter (+/- 3)
Diffstat (limited to 'src/libextra')
| -rw-r--r-- | src/libextra/arena.rs | 8 | ||||
| -rw-r--r-- | src/libextra/c_vec.rs | 4 | ||||
| -rw-r--r-- | src/libextra/ebml.rs | 2 | ||||
| -rw-r--r-- | src/libextra/par.rs | 2 |
4 files changed, 8 insertions, 8 deletions
diff --git a/src/libextra/arena.rs b/src/libextra/arena.rs index 3c10c3545bf..efe1d47563e 100644 --- a/src/libextra/arena.rs +++ b/src/libextra/arena.rs @@ -116,7 +116,7 @@ unsafe fn destroy_chunk(chunk: &Chunk) { let fill = chunk.fill; while idx < fill { - let tydesc_data: *uint = transmute(ptr::offset(buf, idx)); + let tydesc_data: *uint = transmute(ptr::offset(buf, idx as int)); let (tydesc, is_done) = un_bitpack_tydesc_ptr(*tydesc_data); let (size, align) = ((*tydesc).size, (*tydesc).align); @@ -127,7 +127,7 @@ unsafe fn destroy_chunk(chunk: &Chunk) { //debug!("freeing object: idx = %u, size = %u, align = %u, done = %b", // start, size, align, is_done); if is_done { - ((*tydesc).drop_glue)(ptr::offset(buf, start) as *i8); + ((*tydesc).drop_glue)(ptr::offset(buf, start as int) as *i8); } // Find where the next tydesc lives @@ -176,7 +176,7 @@ impl Arena { //debug!("idx = %u, size = %u, align = %u, fill = %u", // start, n_bytes, align, head.fill); - ptr::offset(vec::raw::to_ptr(this.pod_head.data), start) + ptr::offset(vec::raw::to_ptr(this.pod_head.data), start as int) } } @@ -233,7 +233,7 @@ impl Arena { // start, n_bytes, align, head.fill); let buf = vec::raw::to_ptr(self.head.data); - return (ptr::offset(buf, tydesc_start), ptr::offset(buf, start)); + return (ptr::offset(buf, tydesc_start as int), ptr::offset(buf, start as int)); } } diff --git a/src/libextra/c_vec.rs b/src/libextra/c_vec.rs index f72d3ee694f..e656360aa5a 100644 --- a/src/libextra/c_vec.rs +++ b/src/libextra/c_vec.rs @@ -122,7 +122,7 @@ pub unsafe fn c_vec_with_dtor<T>(base: *mut T, len: uint, dtor: @fn()) pub fn get<T:Clone>(t: CVec<T>, ofs: uint) -> T { assert!(ofs < len(t)); return unsafe { - (*ptr::mut_offset(t.base, ofs)).clone() + (*ptr::mut_offset(t.base, ofs as int)).clone() }; } @@ -133,7 +133,7 @@ pub fn get<T:Clone>(t: CVec<T>, ofs: uint) -> T { */ pub fn set<T>(t: CVec<T>, ofs: uint, v: T) { assert!(ofs < len(t)); - unsafe { *ptr::mut_offset(t.base, ofs) = v }; + unsafe { *ptr::mut_offset(t.base, ofs as int) = v }; } /* diff --git a/src/libextra/ebml.rs b/src/libextra/ebml.rs index c9b0cbb2753..f66677c21f7 100644 --- a/src/libextra/ebml.rs +++ b/src/libextra/ebml.rs @@ -150,7 +150,7 @@ pub mod reader { unsafe { let (ptr, _): (*u8, uint) = transmute(data); - let ptr = offset(ptr, start); + let ptr = offset(ptr, start as int); let ptr: *i32 = transmute(ptr); let val = bswap32(*ptr); let val: u32 = transmute(val); diff --git a/src/libextra/par.rs b/src/libextra/par.rs index f462a0cfae7..4069c68e71c 100644 --- a/src/libextra/par.rs +++ b/src/libextra/par.rs @@ -58,7 +58,7 @@ fn map_slices<A:Clone + Send,B:Clone + Send>( let f = do future_spawn() || { unsafe { let len = end - base; - let slice = (ptr::offset(p, base), + let slice = (ptr::offset(p, base as int), len * sys::size_of::<A>()); info!("pre-slice: %?", (base, slice)); let slice : &[A] = |
