rustc: Use an interior vector for ty::count_ty_params

This commit is contained in:
Patrick Walton 2011-07-01 18:05:19 -07:00
parent bd7a072266
commit 75c5f9bdba

View File

@ -1788,24 +1788,22 @@ fn node_id_to_monotype(&ctxt cx, ast::node_id id) -> t {
// Returns the number of distinct type parameters in the given type. // Returns the number of distinct type parameters in the given type.
fn count_ty_params(&ctxt cx, t ty) -> uint { fn count_ty_params(&ctxt cx, t ty) -> uint {
fn counter(&ctxt cx, @mutable vec[uint] param_indices, t ty) { fn counter(&ctxt cx, @mutable (uint[]) param_indices, t ty) {
alt (struct(cx, ty)) { alt (struct(cx, ty)) {
case (ty_param(?param_idx)) { case (ty_param(?param_idx)) {
auto seen = false; auto seen = false;
for (uint other_param_idx in *param_indices) { for (uint other_param_idx in *param_indices) {
if (param_idx == other_param_idx) { seen = true; } if (param_idx == other_param_idx) { seen = true; }
} }
if (!seen) { *param_indices += [param_idx]; } if (!seen) { *param_indices += ~[param_idx]; }
} }
case (_) {/* fall through */ } case (_) {/* fall through */ }
} }
} }
let vec[uint] v = []; // FIXME: typechecker botch let @mutable (uint[]) param_indices = @mutable ~[];
let @mutable vec[uint] param_indices = @mutable v;
auto f = bind counter(cx, param_indices, _); auto f = bind counter(cx, param_indices, _);
walk_ty(cx, f, ty); walk_ty(cx, f, ty);
ret vec::len[uint](*param_indices); ret ivec::len[uint](*param_indices);
} }
fn type_contains_vars(&ctxt cx, &t typ) -> bool { fn type_contains_vars(&ctxt cx, &t typ) -> bool {