diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2011-07-20 19:04:45 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2011-07-20 19:04:45 -0700 |
| commit | 3ec3b02ed086b6061dcda7cc93dbfe90a4253d8b (patch) | |
| tree | 15ee804aab81fda9be74163e1bbc77f298f99057 /src | |
| parent | 142ff3bb4ee0c58efc9185505695681468df3e05 (diff) | |
| download | rust-3ec3b02ed086b6061dcda7cc93dbfe90a4253d8b.tar.gz rust-3ec3b02ed086b6061dcda7cc93dbfe90a4253d8b.zip | |
rustc: Strip cnames before generating glue to avoid duplicates
Diffstat (limited to 'src')
| -rw-r--r-- | src/comp/middle/trans.rs | 8 | ||||
| -rw-r--r-- | src/comp/middle/ty.rs | 5 |
2 files changed, 11 insertions, 2 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 691339a652c..fb79b360252 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -1370,9 +1370,11 @@ fn get_derived_tydesc(&@block_ctxt cx, &ty::t t, bool escapes, ret rslt(cx, v); } -fn get_tydesc(&@block_ctxt cx, &ty::t t, bool escapes, +fn get_tydesc(&@block_ctxt cx, &ty::t orig_t, bool escapes, &mutable option::t[@tydesc_info] static_ti) -> result { + auto t = ty::strip_cname(cx.fcx.lcx.ccx.tcx, orig_t); + // Is the supplied type a type param? If so, return the passed-in tydesc. alt (ty::type_param(cx.fcx.lcx.ccx.tcx, t)) { case (some(?id)) { ret rslt(cx, cx.fcx.lltydescs.(id)); } @@ -1390,8 +1392,10 @@ fn get_tydesc(&@block_ctxt cx, &ty::t t, bool escapes, ret rslt(cx, info.tydesc); } -fn get_static_tydesc(&@block_ctxt cx, &ty::t t, &uint[] ty_params) +fn get_static_tydesc(&@block_ctxt cx, &ty::t orig_t, &uint[] ty_params) -> @tydesc_info { + auto t = ty::strip_cname(cx.fcx.lcx.ccx.tcx, orig_t); + alt (cx.fcx.lcx.ccx.tydescs.find(t)) { case (some(?info)) { ret info; } case (none) { diff --git a/src/comp/middle/ty.rs b/src/comp/middle/ty.rs index 4717bd56efe..42973866499 100644 --- a/src/comp/middle/ty.rs +++ b/src/comp/middle/ty.rs @@ -108,6 +108,7 @@ export sequence_is_interior; export struct; export sort_methods; export stmt_node_id; +export strip_cname; export sty; export substitute_type_params; export t; @@ -855,10 +856,14 @@ fn fold_ty(&ctxt cx, fold_mode fld, t ty_0) -> t { // Type utilities + fn rename(&ctxt cx, t typ, str new_cname) -> t { ret gen_ty_full(cx, struct(cx, typ), some[str](new_cname)); } +fn strip_cname(&ctxt cx, t typ) -> t { + ret gen_ty_full(cx, struct(cx, typ), none); +} // Returns a type with the structural part taken from `struct_ty` and the // canonical name from `cname_ty`. |
