diff options
| author | Marijn Haverbeke <marijnh@gmail.com> | 2012-03-08 21:16:04 +0100 |
|---|---|---|
| committer | Marijn Haverbeke <marijnh@gmail.com> | 2012-03-15 09:32:53 +0100 |
| commit | 4650e8bcf404d4c27dbbd5446a56fb066ada30f9 (patch) | |
| tree | 7039da7407e5c71f1c0f3f2f0da0f2a98bb4d032 /src/rustc/metadata | |
| parent | 8f84d4c8b6305c960cf51c35a5ea38697d7fa530 (diff) | |
| download | rust-4650e8bcf404d4c27dbbd5446a56fb066ada30f9.tar.gz rust-4650e8bcf404d4c27dbbd5446a56fb066ada30f9.zip | |
Make sure resource destructors are properly monomorphized
Diffstat (limited to 'src/rustc/metadata')
| -rw-r--r-- | src/rustc/metadata/astencode.rs | 4 | ||||
| -rw-r--r-- | src/rustc/metadata/encoder.rs | 9 | ||||
| -rw-r--r-- | src/rustc/metadata/reachable.rs | 20 |
3 files changed, 26 insertions, 7 deletions
diff --git a/src/rustc/metadata/astencode.rs b/src/rustc/metadata/astencode.rs index 007b2ea2e0c..3d54ffe3944 100644 --- a/src/rustc/metadata/astencode.rs +++ b/src/rustc/metadata/astencode.rs @@ -135,6 +135,10 @@ fn visit_ids(item: ast::inlined_item, vfn: fn@(ast::node_id)) { visit_item: fn@(i: @ast::item) { vfn(i.id); + alt i.node { + ast::item_res(_, _, _, d_id, c_id) { vfn(d_id); vfn(c_id); } + _ {} + } }, visit_local: fn@(l: @ast::local) { diff --git a/src/rustc/metadata/encoder.rs b/src/rustc/metadata/encoder.rs index 5c6eb30bbeb..6a8a77b1191 100644 --- a/src/rustc/metadata/encoder.rs +++ b/src/rustc/metadata/encoder.rs @@ -339,10 +339,7 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item, } let tcx = ecx.ccx.tcx; - let must_write = alt item.node { - item_enum(_, _) | item_res(_, _, _, _, _) { true } - _ { false } - }; + let must_write = alt item.node { item_enum(_, _) { true } _ { false } }; if !must_write && !ecx.reachable.contains_key(item.id) { ret false; } alt item.node { @@ -419,6 +416,8 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item, encode_name(ebml_w, item.ident); if tps.len() == 0u { encode_symbol(ecx, ebml_w, item.id); + } else { + astencode::encode_inlined_item(ecx, ebml_w, path, ii_item(item)); } encode_path(ebml_w, path, ast_map::path_name(item.ident)); ebml_w.end_tag(); @@ -533,7 +532,7 @@ fn encode_info_for_items(ecx: @encode_ctxt, ebml_w: ebml::writer, ecx.ccx.tcx.items.items {|key, val| let where = ebml_w.writer.tell(); let written = alt val { - middle::ast_map::node_item(i, path) { + middle::ast_map::node_item(i, path) if i.id == key { encode_info_for_item(ecx, ebml_w, i, index, *path) } middle::ast_map::node_native_item(i, _, path) { diff --git a/src/rustc/metadata/reachable.rs b/src/rustc/metadata/reachable.rs index 9c911807122..1ee2d8eab95 100644 --- a/src/rustc/metadata/reachable.rs +++ b/src/rustc/metadata/reachable.rs @@ -7,7 +7,7 @@ import middle::{resolve, ast_map, typeck}; import syntax::ast::*; -import syntax::visit; +import syntax::{visit, ast_util}; import syntax::ast_util::def_id_of_def; import front::attr; import std::map::hashmap; @@ -22,7 +22,9 @@ type ctx = {ccx: @middle::trans::common::crate_ctxt, fn find_reachable(ccx: @middle::trans::common::crate_ctxt, crate_mod: _mod) -> map { let rmap = std::map::int_hash(); - traverse_public_mod({ccx: ccx, rmap: rmap}, crate_mod); + let cx = {ccx: ccx, rmap: rmap}; + traverse_public_mod(cx, crate_mod); + traverse_all_resources(cx, crate_mod); rmap } @@ -124,3 +126,17 @@ fn traverse_inline_body(cx: ctx, body: blk) { with *visit::default_visitor() })); } + +fn traverse_all_resources(cx: ctx, crate_mod: _mod) { + visit::visit_mod(crate_mod, ast_util::dummy_sp(), 0, cx, visit::mk_vt(@{ + visit_expr: {|_e, _cx, _v|}, + visit_item: {|i, cx, v| + visit::visit_item(i, cx, v); + alt i.node { + item_res(_, _, _, _, _) { traverse_public_item(cx, i); } + _ {} + } + } + with *visit::default_visitor() + })); +} |
