about summary refs log tree commit diff
path: root/src/rustc/metadata
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2012-03-08 21:16:04 +0100
committerMarijn Haverbeke <marijnh@gmail.com>2012-03-15 09:32:53 +0100
commit4650e8bcf404d4c27dbbd5446a56fb066ada30f9 (patch)
tree7039da7407e5c71f1c0f3f2f0da0f2a98bb4d032 /src/rustc/metadata
parent8f84d4c8b6305c960cf51c35a5ea38697d7fa530 (diff)
downloadrust-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.rs4
-rw-r--r--src/rustc/metadata/encoder.rs9
-rw-r--r--src/rustc/metadata/reachable.rs20
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()
+    }));
+}