about summary refs log tree commit diff
path: root/src/libstd/rt
diff options
context:
space:
mode:
authorDaniel Micay <danielmicay@gmail.com>2013-07-30 00:33:52 -0400
committerDaniel Micay <danielmicay@gmail.com>2013-07-30 02:50:31 -0400
commitef870d37a58df136b18f1440f45d4f0102c55c1a (patch)
tree3f30f5d551a247978a6fc1a6af602126ed518121 /src/libstd/rt
parente94e4d51ca01db908748ab79bafe3254bede645b (diff)
downloadrust-ef870d37a58df136b18f1440f45d4f0102c55c1a.tar.gz
rust-ef870d37a58df136b18f1440f45d4f0102c55c1a.zip
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/libstd/rt')
-rw-r--r--src/libstd/rt/args.rs2
-rw-r--r--src/libstd/rt/stack.rs2
2 files changed, 2 insertions, 2 deletions
diff --git a/src/libstd/rt/args.rs b/src/libstd/rt/args.rs
index 85cdb9fc941..cd950471286 100644
--- a/src/libstd/rt/args.rs
+++ b/src/libstd/rt/args.rs
@@ -114,7 +114,7 @@ mod imp {
     unsafe fn load_argc_and_argv(argc: int, argv: **u8) -> ~[~str] {
         let mut args = ~[];
         for uint::range(0, argc as uint) |i| {
-            args.push(str::raw::from_c_str(*(argv as **libc::c_char).offset(i)));
+            args.push(str::raw::from_c_str(*(argv as **libc::c_char).offset(i as int)));
         }
         return args;
     }
diff --git a/src/libstd/rt/stack.rs b/src/libstd/rt/stack.rs
index fbb516b2df4..a1269968921 100644
--- a/src/libstd/rt/stack.rs
+++ b/src/libstd/rt/stack.rs
@@ -44,7 +44,7 @@ impl StackSegment {
 
     /// Point one word beyond the high end of the allocated stack
     pub fn end(&self) -> *uint {
-        vec::raw::to_ptr(self.buf).offset(self.buf.len()) as *uint
+        vec::raw::to_ptr(self.buf).offset(self.buf.len() as int) as *uint
     }
 }