Skip to content

Commit 8d930e0

Browse files
committed
---
yaml --- r: 4283 b: refs/heads/master c: 0c9b749 h: refs/heads/master i: 4281: fefa306 4279: 6310ede v: v3
1 parent 7d0aafb commit 8d930e0

File tree

12 files changed

+86
-63
lines changed

12 files changed

+86
-63
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 6ba4e349598aa736449a985d38348f083efdfb9d
2+
refs/heads/master: 0c9b749d208ccc75f03ab9f7fce1322aa5dbbfd3

trunk/src/comp/middle/ast_map.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ fn map_expr(map: &map, ex: &@expr, e: &(), v: &vt[()]) {
4747
visit::visit_expr(ex, e, v);
4848
}
4949

50-
fn new_smallintmap_int_adapter[V]() -> std::map::hashmap[int, V] {
50+
fn new_smallintmap_int_adapter[@V]() -> std::map::hashmap[int, V] {
5151
let key_idx = fn (key: &int) -> uint { key as uint };
5252
let idx_key = fn (idx: &uint) -> int { idx as int };
5353
ret new_smallintmap_adapter(key_idx, idx_key);
@@ -58,15 +58,15 @@ fn new_smallintmap_int_adapter[V]() -> std::map::hashmap[int, V] {
5858
// the entire codebase adapting all the callsites to the different
5959
// interface.
6060
// FIXME: hashmap and smallintmap should support the same interface.
61-
fn new_smallintmap_adapter[K,
62-
V](key_idx: fn(&K) -> uint ,
63-
idx_key: fn(&uint) -> K ) ->
61+
fn new_smallintmap_adapter[@K,
62+
@V](key_idx: fn(&K) -> uint ,
63+
idx_key: fn(&uint) -> K ) ->
6464
std::map::hashmap[K, V] {
6565

66-
obj adapter[K,
67-
V](map: smallintmap::smallintmap[V],
68-
key_idx: fn(&K) -> uint ,
69-
idx_key: fn(&uint) -> K ) {
66+
obj adapter[@K,
67+
@V](map: smallintmap::smallintmap[V],
68+
key_idx: fn(&K) -> uint ,
69+
idx_key: fn(&uint) -> K ) {
7070

7171
fn size() -> uint { fail }
7272

trunk/src/comp/middle/kind.rs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@
7474
import syntax::ast;
7575
import syntax::visit;
7676

77+
import std::ivec;
78+
7779
import ast::kind;
7880
import ast::kind_unique;
7981
import ast::kind_shared;
@@ -138,10 +140,31 @@ fn check_expr(tcx: &ty::ctxt, e: &@ast::expr) {
138140
ast::expr_move(a, b) { need_shared_lhs_rhs(tcx, a, b, "<-"); }
139141
ast::expr_assign(a, b) { need_shared_lhs_rhs(tcx, a, b, "="); }
140142
ast::expr_swap(a, b) { need_shared_lhs_rhs(tcx, a, b, "<->"); }
141-
ast::expr_call(callee, args) {
142-
// FIXME: when ready, start checking param kinds against args.
143-
// This will break stdlib again.
144-
// let tpt = ty::expr_ty_params_and_ty(tcx, callee);
143+
ast::expr_call(callee, _) {
144+
let tpt = ty::expr_ty_params_and_ty(tcx, callee);
145+
// If we have typarams, we're calling an item; we need to check
146+
// that all the types we're supplying as typarams conform to the
147+
// typaram kind constraints on that item.
148+
if ivec::len(tpt.params) != 0u {
149+
let callee_def = ast::def_id_of_def(tcx.def_map.get(callee.id));
150+
let item_tk = ty::lookup_item_type(tcx, callee_def);
151+
let i = 0;
152+
assert ivec::len(item_tk.kinds) == ivec::len(tpt.params);
153+
for k_need: ast::kind in item_tk.kinds {
154+
let t = tpt.params.(i);
155+
let k = ty::type_kind(tcx, t);
156+
if ! kind_lteq(k_need, k) {
157+
let s = #fmt("mismatched kinds for typaram %d: \
158+
needed %s type, got %s type %s",
159+
i,
160+
kind_to_str(k_need),
161+
kind_to_str(k),
162+
util::ppaux::ty_to_str(tcx, t));
163+
tcx.sess.span_err(e.span, s);
164+
}
165+
i += 1;
166+
}
167+
}
145168
}
146169
_ { }
147170
}

trunk/src/comp/syntax/util/interner.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ type interner[T] =
1616
hasher: hashfn[T],
1717
eqer: eqfn[T]};
1818

19-
fn mk[T](hasher: hashfn[T], eqer: eqfn[T]) -> interner[T] {
19+
fn mk[@T](hasher: hashfn[T], eqer: eqfn[T]) -> interner[T] {
2020
let m = map::mk_hashmap[T, uint](hasher, eqer);
2121
ret {map: m, mutable vect: ~[], hasher: hasher, eqer: eqer};
2222
}
23-
fn intern[T](itr: &interner[T], val: &T) -> uint {
23+
fn intern[@T](itr: &interner[T], val: &T) -> uint {
2424
alt itr.map.find(val) {
2525
some(idx) { ret idx; }
2626
none. {

trunk/src/comp/util/common.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ fn hash_def(d: &ast::def_id) -> uint {
4141
ret h;
4242
}
4343

44-
fn new_def_hash[V]() -> std::map::hashmap[ast::def_id, V] {
44+
fn new_def_hash[@V]() -> std::map::hashmap[ast::def_id, V] {
4545
let hasher: std::map::hashfn[ast::def_id] = hash_def;
4646
let eqer: std::map::eqfn[ast::def_id] = def_eq;
4747
ret std::map::mk_hashmap[ast::def_id, V](hasher, eqer);

trunk/src/lib/ivec.rs

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@ native "rust" mod rustrt {
1919
count: uint);
2020
}
2121

22-
fn from_vec[T](v: &vec[T]) -> T[] {
22+
fn from_vec[@T](v: &vec[T]) -> T[] {
2323
let iv: T[] = ~[];
2424
for e in v {
2525
iv += ~[e];
2626
}
2727
ret iv;
2828
}
2929

30-
fn to_vec[T](iv: &T[]) -> vec[T] {
30+
fn to_vec[@T](iv: &T[]) -> vec[T] {
3131
let v: vec[T] = [];
3232
for e in iv {
3333
v += [e];
@@ -36,7 +36,7 @@ fn to_vec[T](iv: &T[]) -> vec[T] {
3636
}
3737

3838
/// Reserves space for `n` elements in the given vector.
39-
fn reserve[T](v: &mutable T[mutable? ], n: uint) {
39+
fn reserve[@T](v: &mutable T[mutable? ], n: uint) {
4040
rustrt::ivec_reserve_shared(v, n);
4141
}
4242

@@ -48,7 +48,7 @@ fn len[T](v: &T[mutable? ]) -> uint { ret rusti::ivec_len(v); }
4848

4949
type init_op[T] = fn(uint) -> T ;
5050

51-
fn init_fn[T](op: &init_op[T], n_elts: uint) -> T[] {
51+
fn init_fn[@T](op: &init_op[T], n_elts: uint) -> T[] {
5252
let v = ~[];
5353
reserve(v, n_elts);
5454
let i: uint = 0u;
@@ -57,15 +57,15 @@ fn init_fn[T](op: &init_op[T], n_elts: uint) -> T[] {
5757
}
5858

5959
// TODO: Remove me once we have slots.
60-
fn init_fn_mut[T](op: &init_op[T], n_elts: uint) -> T[mutable ] {
60+
fn init_fn_mut[@T](op: &init_op[T], n_elts: uint) -> T[mutable ] {
6161
let v = ~[mutable ];
6262
reserve(v, n_elts);
6363
let i: uint = 0u;
6464
while i < n_elts { v += ~[mutable op(i)]; i += 1u; }
6565
ret v;
6666
}
6767

68-
fn init_elt[T](t: &T, n_elts: uint) -> T[] {
68+
fn init_elt[@T](t: &T, n_elts: uint) -> T[] {
6969
let v = ~[];
7070
reserve(v, n_elts);
7171
let i: uint = 0u;
@@ -74,21 +74,21 @@ fn init_elt[T](t: &T, n_elts: uint) -> T[] {
7474
}
7575

7676
// TODO: Remove me once we have slots.
77-
fn init_elt_mut[T](t: &T, n_elts: uint) -> T[mutable ] {
77+
fn init_elt_mut[@T](t: &T, n_elts: uint) -> T[mutable ] {
7878
let v = ~[mutable ];
7979
reserve(v, n_elts);
8080
let i: uint = 0u;
8181
while i < n_elts { v += ~[mutable t]; i += 1u; }
8282
ret v;
8383
}
8484

85-
fn to_mut[T](v: &T[]) -> T[mutable ] {
85+
fn to_mut[@T](v: &T[]) -> T[mutable ] {
8686
let vres = ~[mutable ];
8787
for t: T in v { vres += ~[mutable t]; }
8888
ret vres;
8989
}
9090

91-
fn from_mut[T](v: &T[mutable ]) -> T[] {
91+
fn from_mut[@T](v: &T[mutable ]) -> T[] {
9292
let vres = ~[];
9393
for t: T in v { vres += ~[t]; }
9494
ret vres;
@@ -106,21 +106,21 @@ pred is_not_empty[T](v: &T[mutable? ]) -> bool { ret !is_empty(v); }
106106
// Accessors
107107

108108
/// Returns the first element of a vector
109-
fn head[T](v: &T[mutable?]) : is_not_empty(v) -> T { ret v.(0); }
109+
fn head[@T](v: &T[mutable?]) : is_not_empty(v) -> T { ret v.(0); }
110110

111111
/// Returns all but the first element of a vector
112-
fn tail[T](v: &T[mutable? ]) : is_not_empty(v) -> T[mutable?] {
112+
fn tail[@T](v: &T[mutable? ]) : is_not_empty(v) -> T[mutable?] {
113113
ret slice(v, 1u, len(v));
114114
}
115115

116116
/// Returns the last element of `v`.
117-
fn last[T](v: &T[mutable? ]) -> option::t[T] {
117+
fn last[@T](v: &T[mutable? ]) -> option::t[T] {
118118
if len(v) == 0u { ret none; }
119119
ret some(v.(len(v) - 1u));
120120
}
121121

122122
/// Returns a copy of the elements from [`start`..`end`) from `v`.
123-
fn slice[T](v: &T[mutable? ], start: uint, end: uint) -> T[] {
123+
fn slice[@T](v: &T[mutable? ], start: uint, end: uint) -> T[] {
124124
assert (start <= end);
125125
assert (end <= len(v));
126126
let result = ~[];
@@ -131,7 +131,7 @@ fn slice[T](v: &T[mutable? ], start: uint, end: uint) -> T[] {
131131
}
132132

133133
// TODO: Remove me once we have slots.
134-
fn slice_mut[T](v: &T[mutable? ], start: uint, end: uint) -> T[mutable ] {
134+
fn slice_mut[@T](v: &T[mutable? ], start: uint, end: uint) -> T[mutable ] {
135135
assert (start <= end);
136136
assert (end <= len(v));
137137
let result = ~[mutable ];
@@ -145,7 +145,7 @@ fn slice_mut[T](v: &T[mutable? ], start: uint, end: uint) -> T[mutable ] {
145145
// Mutators
146146

147147
// TODO: Write this, unsafely, in a way that's not O(n).
148-
fn pop[T](v: &mutable T[mutable? ]) -> T {
148+
fn pop[@T](v: &mutable T[mutable? ]) -> T {
149149
let ln = len(v);
150150
assert (ln > 0u);
151151
ln -= 1u;
@@ -160,22 +160,22 @@ fn pop[T](v: &mutable T[mutable? ]) -> T {
160160
// Appending
161161

162162
/// Expands the given vector in-place by appending `n` copies of `initval`.
163-
fn grow[T](v: &mutable T[], n: uint, initval: &T) {
163+
fn grow[@T](v: &mutable T[], n: uint, initval: &T) {
164164
reserve(v, next_power_of_two(len(v) + n));
165165
let i: uint = 0u;
166166
while i < n { v += ~[initval]; i += 1u; }
167167
}
168168

169169
// TODO: Remove me once we have slots.
170-
fn grow_mut[T](v: &mutable T[mutable ], n: uint, initval: &T) {
170+
fn grow_mut[@T](v: &mutable T[mutable ], n: uint, initval: &T) {
171171
reserve(v, next_power_of_two(len(v) + n));
172172
let i: uint = 0u;
173173
while i < n { v += ~[mutable initval]; i += 1u; }
174174
}
175175

176176
/// Calls `f` `n` times and appends the results of these calls to the given
177177
/// vector.
178-
fn grow_fn[T](v: &mutable T[], n: uint, init_fn: fn(uint) -> T ) {
178+
fn grow_fn[@T](v: &mutable T[], n: uint, init_fn: fn(uint) -> T ) {
179179
reserve(v, next_power_of_two(len(v) + n));
180180
let i: uint = 0u;
181181
while i < n { v += ~[init_fn(i)]; i += 1u; }
@@ -192,7 +192,7 @@ fn grow_set[@T](v: &mutable T[mutable ], index: uint, initval: &T, val: &T) {
192192

193193
// Functional utilities
194194

195-
fn map[T, U](f: fn(&T) -> U , v: &T[mutable? ]) -> U[] {
195+
fn map[@T, @U](f: fn(&T) -> U , v: &T[mutable? ]) -> U[] {
196196
let result = ~[];
197197
reserve(result, len(v));
198198
for elem: T in v {
@@ -202,7 +202,7 @@ fn map[T, U](f: fn(&T) -> U , v: &T[mutable? ]) -> U[] {
202202
ret result;
203203
}
204204

205-
fn filter_map[T, U](f: fn(&T) -> option::t[U] , v: &T[mutable? ]) -> U[] {
205+
fn filter_map[@T, @U](f: fn(&T) -> option::t[U] , v: &T[mutable? ]) -> U[] {
206206
let result = ~[];
207207
for elem: T in v {
208208
let elem2 = elem; // satisfies alias checker
@@ -214,7 +214,7 @@ fn filter_map[T, U](f: fn(&T) -> option::t[U] , v: &T[mutable? ]) -> U[] {
214214
ret result;
215215
}
216216

217-
fn foldl[T, U](p: fn(&U, &T) -> U , z: &U, v: &T[mutable? ]) -> U {
217+
fn foldl[@T, @U](p: fn(&U, &T) -> U , z: &U, v: &T[mutable? ]) -> U {
218218
let sz = len(v);
219219
if sz == 0u { ret z; }
220220
let first = v.(0);
@@ -243,12 +243,12 @@ fn count[T](x: &T, v: &T[mutable? ]) -> uint {
243243
ret cnt;
244244
}
245245

246-
fn find[T](f: fn(&T) -> bool , v: &T[]) -> option::t[T] {
246+
fn find[@T](f: fn(&T) -> bool , v: &T[]) -> option::t[T] {
247247
for elt: T in v { if f(elt) { ret some[T](elt); } }
248248
ret none[T];
249249
}
250250

251-
fn unzip[T, U](v: &{_0: T, _1: U}[]) -> {_0: T[], _1: U[]} {
251+
fn unzip[@T, @U](v: &{_0: T, _1: U}[]) -> {_0: T[], _1: U[]} {
252252
let sz = len(v);
253253
if sz == 0u {
254254
ret {_0: ~[], _1: ~[]};
@@ -263,7 +263,7 @@ fn unzip[T, U](v: &{_0: T, _1: U}[]) -> {_0: T[], _1: U[]} {
263263

264264

265265
// FIXME make the lengths being equal a constraint
266-
fn zip[T, U](v: &T[], u: &U[]) -> {_0: T, _1: U}[] {
266+
fn zip[@T, @U](v: &T[], u: &U[]) -> {_0: T, _1: U}[] {
267267
let sz = len(v);
268268
assert (sz == len(u));
269269
if sz == 0u {
@@ -309,5 +309,5 @@ mod unsafe {
309309
// indent-tabs-mode: nil
310310
// c-basic-offset: 4
311311
// buffer-file-coding-system: utf-8-unix
312-
// compile-command: "make -k -C .. 2>&1 | sed -e 's/\\/x\\//x:\\//g'";
312+
// compile-command: "make -k -C $RBUILD 2>&1 | sed -e 's/\\/x\\//x:\\//g'";
313313
// End:

trunk/src/lib/list.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ fn has[@T](ls_: &list[T], elt: &T) -> bool {
5555

5656
}
5757

58-
fn length[T](ls: &list[T]) -> uint {
58+
fn length[@T](ls: &list[T]) -> uint {
5959
fn count[T](t: &T, u: &uint) -> uint { ret u + 1u; }
6060
ret foldl[T, uint](ls, 0u, bind count[T](_, _));
6161
}

trunk/src/lib/map.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ fn mk_hashmap[@K, @V](hasher: &hashfn[K], eqer: &eqfn[K]) -> hashmap[K, V] {
2525
let initial_capacity: uint = 32u; // 2^5
2626

2727
let load_factor: util::rational = {num: 3, den: 4};
28-
tag bucket[K, V] { nil; deleted; some(K, V); }
29-
fn make_buckets[K, V](nbkts: uint) -> (bucket[K, V])[mutable ] {
28+
tag bucket[@K, @V] { nil; deleted; some(K, V); }
29+
fn make_buckets[@K, @V](nbkts: uint) -> (bucket[K, V])[mutable ] {
3030
ret ivec::init_elt_mut[bucket[K, V]](nil[K, V], nbkts);
3131
}
3232
// Derive two hash functions from the one given by taking the upper

trunk/src/lib/option.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,34 @@
22

33

44
// lib/option::rs
5-
tag t[T] { none; some(T); }
5+
tag t[@T] { none; some(T); }
66

7-
type operator[T, U] = fn(&T) -> U ;
7+
type operator[@T, @U] = fn(&T) -> U ;
88

9-
fn get[T](opt: &t[T]) -> T { ret alt opt { some(x) { x } none. { fail } }; }
9+
fn get[@T](opt: &t[T]) -> T { ret alt opt { some(x) { x } none. { fail } }; }
1010

11-
fn map[T, U](f: &operator[T, U], opt: &t[T]) -> t[U] {
11+
fn map[@T, @U](f: &operator[T, U], opt: &t[T]) -> t[U] {
1212
ret alt opt { some(x) { some[U](f(x)) } none. { none[U] } };
1313
}
1414

15-
fn is_none[T](opt: &t[T]) -> bool {
15+
fn is_none[@T](opt: &t[T]) -> bool {
1616
ret alt opt { none. { true } some(_) { false } };
1717
}
1818

19-
fn is_some[T](opt: &t[T]) -> bool { ret !is_none(opt); }
19+
fn is_some[@T](opt: &t[T]) -> bool { ret !is_none(opt); }
2020

21-
fn from_maybe[T](def: &T, opt: &t[T]) -> T {
21+
fn from_maybe[@T](def: &T, opt: &t[T]) -> T {
2222
let f = bind util::id[T](_);
2323
ret maybe[T, T](def, f, opt);
2424
}
2525

26-
fn maybe[T, U](def: &U, f: fn(&T) -> U , opt: &t[T]) -> U {
26+
fn maybe[@T, @U](def: &U, f: fn(&T) -> U , opt: &t[T]) -> U {
2727
ret alt opt { none. { def } some(t) { f(t) } };
2828
}
2929

3030

3131
// Can be defined in terms of the above when/if we have const bind.
32-
fn may[T](f: fn(&T) , opt: &t[T]) {
32+
fn may[@T](f: fn(&T) , opt: &t[T]) {
3333
alt opt { none. {/* nothing */ } some(t) { f(t); } }
3434
}
3535
// Local Variables:

0 commit comments

Comments
 (0)