Skip to content

Commit 58988c3

Browse files
committed
changes to get std passing borrowck
1 parent 4c2bf8e commit 58988c3

File tree

3 files changed

+53
-48
lines changed

3 files changed

+53
-48
lines changed

src/libstd/ebml.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -406,8 +406,8 @@ impl deserializer of serialization::deserializer for ebml_deserializer {
406406
let {tag: r_tag, doc: r_doc} =
407407
ebml::doc_at(self.parent.data, self.pos);
408408
#debug["self.parent=%?-%? self.pos=%? r_tag=%? r_doc=%?-%?",
409-
self.parent.start, self.parent.end, self.pos,
410-
r_tag, r_doc.start, r_doc.end];
409+
copy self.parent.start, copy self.parent.end,
410+
copy self.pos, r_tag, r_doc.start, r_doc.end];
411411
if r_tag != (exp_tag as uint) {
412412
fail #fmt["expected EMBL doc with tag %? but found tag %?",
413413
exp_tag, r_tag];

src/libstd/map.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -102,16 +102,15 @@ mod chained {
102102
let mut e0 = e_root;
103103
let mut comp = 1u; // for logging
104104
loop {
105-
alt e0.next {
105+
alt copy e0.next {
106106
absent {
107107
#debug("search_tbl: absent, comp %u, hash %u, idx %u",
108108
comp, h, idx);
109109
ret not_found;
110110
}
111111
present(e1) {
112112
comp += 1u;
113-
let e1_key = e1.key; // Satisfy alias checker.
114-
if e1.hash == h && self.eqer(e1_key, k) {
113+
if e1.hash == h && self.eqer(e1.key, k) {
115114
#debug("search_tbl: present, comp %u, \
116115
hash %u, idx %u",
117116
comp, h, idx);
@@ -126,15 +125,14 @@ mod chained {
126125

127126
fn search_tbl(k: K, h: uint) -> search_result<K,V> {
128127
let idx = h % vec::len(self.chains);
129-
alt self.chains[idx] {
128+
alt copy self.chains[idx] {
130129
absent {
131130
#debug("search_tbl: absent, comp %u, hash %u, idx %u",
132131
0u, h, idx);
133132
ret not_found;
134133
}
135134
present(e) {
136-
// FIXME: This copy of the key is not good for perf
137-
if e.hash == h && self.eqer(copy e.key, k) {
135+
if e.hash == h && self.eqer(e.key, k) {
138136
#debug("search_tbl: present, comp %u, hash %u, idx %u",
139137
1u, h, idx);
140138
ret found_first(idx, e);

src/libstd/treemap.rs

Lines changed: 47 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -9,67 +9,74 @@ red-black tree or something else.
99
import core::option::{some, none};
1010
import option = core::option;
1111

12-
export treemap;
1312
export treemap;
1413
export insert;
1514
export find;
1615
export traverse;
1716

18-
type treemap<K, V> = @mut tree_node<K, V>;
17+
type treemap<K, V> = @mut tree_edge<K, V>;
18+
19+
type tree_edge<K, V> = option<@tree_node<K, V>>;
1920

20-
enum tree_node<K, V> { empty, node(@K, @V, treemap<K, V>, treemap<K, V>) }
21+
enum tree_node<K, V> = {
22+
key: K,
23+
mut value: V,
24+
mut left: tree_edge<K, V>,
25+
mut right: tree_edge<K, V>
26+
};
2127

2228
#[doc = "Create a treemap"]
23-
fn treemap<K, V>() -> treemap<K, V> { @mut empty }
29+
fn treemap<K, V>() -> treemap<K, V> { @mut none }
2430

2531
#[doc = "Insert a value into the map"]
26-
fn insert<K: copy, V: copy>(m: treemap<K, V>, k: K, v: V) {
27-
alt m {
28-
@empty { *m = node(@k, @v, @mut empty, @mut empty); }
29-
@node(@kk, _, _, _) {
30-
31-
// We have to name left and right individually, because
32-
// otherwise the alias checker complains.
33-
if k < kk {
34-
alt check m { @node(_, _, left, _) { insert(left, k, v); } }
32+
fn insert<K: copy, V: copy>(m: &mut tree_edge<K, V>, k: K, v: V) {
33+
alt copy *m {
34+
none {
35+
*m = some(@tree_node({key: k,
36+
mut value: v,
37+
mut left: none,
38+
mut right: none}));
39+
ret;
40+
}
41+
some(node) {
42+
if k == node.key {
43+
node.value = v;
44+
} else if k < node.key {
45+
insert(&mut node.left, k, v);
3546
} else {
36-
alt check m {
37-
@node(_, _, _, right) { insert(right, k, v); }
38-
}
47+
insert(&mut node.right, k, v);
3948
}
4049
}
41-
}
50+
};
4251
}
4352

4453
#[doc = "Find a value based on the key"]
45-
fn find<K: copy, V: copy>(m: treemap<K, V>, k: K) -> option<V> {
46-
alt *m {
47-
empty { none }
54+
fn find<K: copy, V: copy>(m: &const tree_edge<K, V>, k: K) -> option<V> {
55+
alt copy *m {
56+
none { none }
57+
4858
// TODO: was that an optimization?
49-
node(@kk, @v, left, right) {
50-
if k == kk {
51-
some(v)
52-
} else if k < kk {
53-
find(left, k)
54-
} else { find(right, k) }
59+
some(node) {
60+
if k == node.key {
61+
some(node.value)
62+
} else if k < node.key {
63+
find(&const node.left, k)
64+
} else {
65+
find(&const node.right, k)
66+
}
5567
}
5668
}
5769
}
5870

5971
#[doc = "Visit all pairs in the map in order."]
60-
fn traverse<K, V>(m: treemap<K, V>, f: fn(K, V)) {
61-
alt *m {
62-
empty { }
63-
/*
64-
Previously, this had what looked like redundant
65-
matches to me, so I changed it. but that may be a
66-
de-optimization -- tjc
67-
*/
68-
node(k, v, left, right) {
69-
let k1 = k, v1 = v;
70-
traverse(left, f);
71-
f(*k1, *v1);
72-
traverse(right, f);
72+
fn traverse<K, V: copy>(m: &const tree_edge<K, V>, f: fn(K, V)) {
73+
alt copy *m {
74+
none { }
75+
some(node) {
76+
traverse(&const node.left, f);
77+
// copy of value is req'd as f() requires an immutable ptr
78+
f(node.key, copy node.value);
79+
traverse(&const node.right, f);
7380
}
7481
}
7582
}
@@ -134,4 +141,4 @@ mod tests {
134141
assert (find(m, k2) == some("bar"));
135142
assert (find(m, k1) == some("foo"));
136143
}
137-
}
144+
}

0 commit comments

Comments
 (0)