Skip to content

Commit 813a55d

Browse files
committed
Move walk_ty to stack closure
1 parent 25d6017 commit 813a55d

File tree

2 files changed

+32
-56
lines changed

2 files changed

+32
-56
lines changed

src/comp/middle/trans/base.rs

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -861,28 +861,19 @@ fn field_of_tydesc(cx: @block_ctxt, t: ty::t, escapes: bool, field: int) ->
861861
// constructing derived tydescs.
862862
fn linearize_ty_params(cx: @block_ctxt, t: ty::t) ->
863863
{params: [uint], descs: [ValueRef]} {
864-
let param_vals: [ValueRef] = [];
865-
let param_defs: [uint] = [];
866-
type rr =
867-
{cx: @block_ctxt, mutable vals: [ValueRef], mutable defs: [uint]};
868-
869-
fn linearizer(r: @rr, t: ty::t) {
870-
alt ty::struct(bcx_tcx(r.cx), t) {
864+
let param_vals = [], param_defs = [];
865+
ty::walk_ty(bcx_tcx(cx), t) {|t|
866+
alt ty::struct(bcx_tcx(cx), t) {
871867
ty::ty_param(pid, _) {
872-
let seen: bool = false;
873-
for d: uint in r.defs { if d == pid { seen = true; } }
874-
if !seen {
875-
r.vals += [r.cx.fcx.lltyparams[pid].desc];
876-
r.defs += [pid];
868+
if !vec::any(param_defs, {|d| d == pid}) {
869+
param_vals += [cx.fcx.lltyparams[pid].desc];
870+
param_defs += [pid];
877871
}
878872
}
879873
_ { }
880874
}
881875
}
882-
let x = @{cx: cx, mutable vals: param_vals, mutable defs: param_defs};
883-
let f = bind linearizer(x, _);
884-
ty::walk_ty(bcx_tcx(cx), f, t);
885-
ret {params: x.defs, descs: x.vals};
876+
ret {params: param_defs, descs: param_vals};
886877
}
887878

888879
fn trans_stack_local_derived_tydesc(cx: @block_ctxt, llsz: ValueRef,

src/comp/middle/ty.rs

Lines changed: 25 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -655,39 +655,31 @@ pure fn ty_name(cx: ctxt, typ: t) -> option::t<@str> {
655655
}
656656
}
657657

658-
659-
// Type folds
660-
type ty_walk = fn@(t);
661-
662-
fn walk_ty(cx: ctxt, walker: ty_walk, ty: t) {
658+
fn walk_ty(cx: ctxt, ty: t, f: fn(t)) {
663659
alt struct(cx, ty) {
664660
ty_nil | ty_bot | ty_bool | ty_int(_) | ty_uint(_) | ty_float(_) |
665661
ty_str | ty_send_type | ty_type | ty_native(_) |
666-
ty_opaque_closure_ptr(_) {
667-
/* no-op */
668-
}
669-
ty_box(tm) | ty_vec(tm) | ty_ptr(tm) { walk_ty(cx, walker, tm.ty); }
662+
ty_opaque_closure_ptr(_) | ty_var(_) | ty_param(_, _) {}
663+
ty_box(tm) | ty_vec(tm) | ty_ptr(tm) { walk_ty(cx, tm.ty, f); }
670664
ty_enum(_, subtys) | ty_iface(_, subtys) {
671-
for subty: t in subtys { walk_ty(cx, walker, subty); }
665+
for subty: t in subtys { walk_ty(cx, subty, f); }
672666
}
673667
ty_rec(fields) {
674-
for fl: field in fields { walk_ty(cx, walker, fl.mt.ty); }
668+
for fl: field in fields { walk_ty(cx, fl.mt.ty, f); }
675669
}
676-
ty_tup(ts) { for tt in ts { walk_ty(cx, walker, tt); } }
677-
ty_fn(f) {
678-
for a: arg in f.inputs { walk_ty(cx, walker, a.ty); }
679-
walk_ty(cx, walker, f.output);
670+
ty_tup(ts) { for tt in ts { walk_ty(cx, tt, f); } }
671+
ty_fn(ft) {
672+
for a: arg in ft.inputs { walk_ty(cx, a.ty, f); }
673+
walk_ty(cx, ft.output, f);
680674
}
681675
ty_res(_, sub, tps) {
682-
walk_ty(cx, walker, sub);
683-
for tp: t in tps { walk_ty(cx, walker, tp); }
676+
walk_ty(cx, sub, f);
677+
for tp: t in tps { walk_ty(cx, tp, f); }
684678
}
685-
ty_constr(sub, _) { walk_ty(cx, walker, sub); }
686-
ty_var(_) {/* no-op */ }
687-
ty_param(_, _) {/* no-op */ }
688-
ty_uniq(tm) { walk_ty(cx, walker, tm.ty); }
679+
ty_constr(sub, _) { walk_ty(cx, sub, f); }
680+
ty_uniq(tm) { walk_ty(cx, tm.ty, f); }
689681
}
690-
walker(ty);
682+
f(ty);
691683
}
692684

693685
enum fold_mode {
@@ -1239,14 +1231,11 @@ fn type_param(cx: ctxt, ty: t) -> option::t<uint> {
12391231
// Returns a vec of all the type variables
12401232
// occurring in t. It may contain duplicates.
12411233
fn vars_in_type(cx: ctxt, ty: t) -> [int] {
1242-
fn collect_var(cx: ctxt, vars: @mutable [int], ty: t) {
1243-
alt struct(cx, ty) { ty_var(v) { *vars += [v]; } _ { } }
1234+
let rslt = [];
1235+
walk_ty(cx, ty) {|ty|
1236+
alt struct(cx, ty) { ty_var(v) { rslt += [v]; } _ { } }
12441237
}
1245-
let rslt: @mutable [int] = @mutable [];
1246-
walk_ty(cx, bind collect_var(cx, rslt, _), ty);
1247-
// Works because of a "convenient" bug that lets us
1248-
// return a mutable vec as if it's immutable
1249-
ret *rslt;
1238+
rslt
12501239
}
12511240

12521241
fn type_autoderef(cx: ctxt, t: ty::t) -> ty::t {
@@ -1450,22 +1439,18 @@ fn node_id_has_type_params(cx: ctxt, id: ast::node_id) -> bool {
14501439

14511440
// Returns the number of distinct type parameters in the given type.
14521441
fn count_ty_params(cx: ctxt, ty: t) -> uint {
1453-
fn counter(cx: ctxt, param_indices: @mutable [uint], ty: t) {
1454-
alt struct(cx, ty) {
1442+
let param_indices = [];
1443+
walk_ty(cx, ty) {|t|
1444+
alt struct(cx, t) {
14551445
ty_param(param_idx, _) {
1456-
let seen = false;
1457-
for other_param_idx: uint in *param_indices {
1458-
if param_idx == other_param_idx { seen = true; }
1446+
if !vec::any(param_indices, {|i| i == param_idx}) {
1447+
param_indices += [param_idx];
14591448
}
1460-
if !seen { *param_indices += [param_idx]; }
14611449
}
1462-
_ {/* fall through */ }
1450+
_ {}
14631451
}
14641452
}
1465-
let param_indices: @mutable [uint] = @mutable [];
1466-
let f = bind counter(cx, param_indices, _);
1467-
walk_ty(cx, f, ty);
1468-
ret vec::len::<uint>(*param_indices);
1453+
vec::len(param_indices)
14691454
}
14701455

14711456
fn type_contains_vars(cx: ctxt, typ: t) -> bool {

0 commit comments

Comments
 (0)