Skip to content

Commit dc60629

Browse files
committed
---
yaml --- r: 13727 b: refs/heads/master c: 133fdc1 h: refs/heads/master i: 13725: bba52df 13723: fb096d7 13719: f1b3d4c 13711: 5901a54 13695: 3054090 v: v3
1 parent f221ab2 commit dc60629

File tree

4 files changed

+52
-15
lines changed

4 files changed

+52
-15
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: 404afcbb41898cf7f516f07cae3dc42e47bda46d
2+
refs/heads/master: 133fdc11484794274b0c9b7dca9f05196d3ed01d
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 4a81779abd786ff22d71434c6d9a5917ea4cdfff
55
refs/heads/try: 2898dcc5d97da9427ac367542382b6239d9c0bbf

trunk/src/libcore/vec.rs

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -451,32 +451,30 @@ fn push_slow<T>(&v: [const T]/~, +initval: T) {
451451
}
452452
}
453453

454+
// Unchecked vector indexing
455+
#[inline(always)]
456+
unsafe fn ref<T: copy>(v: [const T]/&, i: uint) -> T {
457+
unpack_slice(v) {|p, _len|
458+
*ptr::offset(p, i)
459+
}
460+
}
461+
454462
#[inline(always)]
455463
fn push_all<T: copy>(&v: [const T]/~, rhs: [const T]/&) {
456464
reserve(v, v.len() + rhs.len());
457465

458466
for uint::range(0u, rhs.len()) {|i|
459-
push(v, rhs[i]);
467+
push(v, unsafe { ref(rhs, i) })
460468
}
461469
}
462470

463471
// Appending
464472
#[inline(always)]
465473
pure fn append<T: copy>(lhs: [T]/&, rhs: [const T]/&) -> [T]/~ {
466474
let mut v = []/~;
467-
let mut i = 0u;
468-
while i < lhs.len() {
469-
unsafe { // This is impure, but it appears pure to the caller.
470-
push(v, lhs[i]);
471-
}
472-
i += 1u;
473-
}
474-
i = 0u;
475-
while i < rhs.len() {
476-
unsafe { // This is impure, but it appears pure to the caller.
477-
push(v, rhs[i]);
478-
}
479-
i += 1u;
475+
unchecked {
476+
push_all(v, lhs);
477+
push_all(v, rhs);
480478
}
481479
ret v;
482480
}

trunk/src/rustc/middle/ty.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1234,6 +1234,12 @@ fn type_needs_drop(cx: ctxt, ty: t) -> bool {
12341234
}
12351235
accum
12361236
}
1237+
ty_fn(fty) {
1238+
alt fty.proto {
1239+
proto_bare | proto_any | proto_block { false }
1240+
_ { true }
1241+
}
1242+
}
12371243
_ { true }
12381244
};
12391245

trunk/src/test/bench/core-std.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ fn main(argv: [str]/~) {
2222
#bench[shift_push];
2323
#bench[read_line];
2424
#bench[str_set];
25+
#bench[vec_append];
26+
#bench[vec_push_all];
2527
}
2628

2729
fn run_test(name: str, test: fn()) {
@@ -72,3 +74,34 @@ fn str_set() {
7274
}
7375
}
7476
}
77+
78+
fn vec_append() {
79+
let r = rand::rng();
80+
81+
let mut v = []/~;
82+
for uint::range(0, 1500) {|i|
83+
let rv = vec::from_elem(r.gen_uint_range(0, i + 1), i);
84+
if r.gen_bool() {
85+
v += rv;
86+
}
87+
else {
88+
v = rv + v;
89+
}
90+
}
91+
}
92+
93+
fn vec_push_all() {
94+
let r = rand::rng();
95+
96+
let mut v = []/~;
97+
for uint::range(0, 1500) {|i|
98+
let mut rv = vec::from_elem(r.gen_uint_range(0, i + 1), i);
99+
if r.gen_bool() {
100+
vec::push_all(v, rv);
101+
}
102+
else {
103+
v <-> rv;
104+
vec::push_all(v, rv);
105+
}
106+
}
107+
}

0 commit comments

Comments
 (0)