about summary refs log tree commit diff
path: root/src/rustc/metadata
diff options
context:
space:
mode:
authorTim Chevalier <chevalier@alum.wellesley.edu>2012-05-15 17:59:55 -0700
committerTim Chevalier <chevalier@alum.wellesley.edu>2012-05-15 18:00:41 -0700
commitfa5cc5bcd0e370a677de141d46455d4ee518dcfc (patch)
treeb918a6d1643f41eb4f17b65eca80b283c6cefbd7 /src/rustc/metadata
parent5d625af9f944c7b6567c443a6f796e30dbb01bf2 (diff)
downloadrust-fa5cc5bcd0e370a677de141d46455d4ee518dcfc.tar.gz
rust-fa5cc5bcd0e370a677de141d46455d4ee518dcfc.zip
Generate drop glue correctly for classes with destructors
Diffstat (limited to 'src/rustc/metadata')
-rw-r--r--src/rustc/metadata/common.rs1
-rw-r--r--src/rustc/metadata/csearch.rs7
-rw-r--r--src/rustc/metadata/decoder.rs14
-rw-r--r--src/rustc/metadata/encoder.rs9
4 files changed, 29 insertions, 2 deletions
diff --git a/src/rustc/metadata/common.rs b/src/rustc/metadata/common.rs
index 42331973baa..35373bffd84 100644
--- a/src/rustc/metadata/common.rs
+++ b/src/rustc/metadata/common.rs
@@ -95,6 +95,7 @@ const tag_mod_impl_iface: uint = 0x47u;
   different tags.
  */
 const tag_item_impl_method: uint = 0x48u;
+const tag_item_dtor: uint = 0x49u;
 
 // used to encode crate_ctxt side tables
 enum astencode_tag { // Reserves 0x50 -- 0x6f
diff --git a/src/rustc/metadata/csearch.rs b/src/rustc/metadata/csearch.rs
index 333ad2806c4..5ebdc144ae7 100644
--- a/src/rustc/metadata/csearch.rs
+++ b/src/rustc/metadata/csearch.rs
@@ -10,6 +10,7 @@ import driver::session::expect;
 import common::*;
 import std::map::hashmap;
 
+export class_dtor;
 export get_symbol;
 export get_class_fields;
 export get_class_method;
@@ -185,6 +186,12 @@ fn get_class_method(cstore: cstore::cstore, def: ast::def_id, mname: str)
     decoder::get_class_method(cdata, def.node, mname)
 }
 
+/* If def names a class with a dtor, return it. Otherwise, return none. */
+fn class_dtor(cstore: cstore::cstore, def: ast::def_id)
+    -> option<ast::def_id> {
+    let cdata = cstore::get_crate_data(cstore, def.crate);
+    decoder::class_dtor(cdata, def.node)
+}
 // Local Variables:
 // mode: rust
 // fill-column: 78;
diff --git a/src/rustc/metadata/decoder.rs b/src/rustc/metadata/decoder.rs
index 1c8caa0f4aa..832dda817e3 100644
--- a/src/rustc/metadata/decoder.rs
+++ b/src/rustc/metadata/decoder.rs
@@ -16,6 +16,7 @@ import util::ppaux::ty_to_str;
 import ebml::deserializer;
 import syntax::diagnostic::span_handler;
 
+export class_dtor;
 export get_class_fields;
 export get_symbol;
 export get_enum_variants;
@@ -331,6 +332,19 @@ fn get_class_method(cdata: cmd, id: ast::node_id, name: str) -> ast::def_id {
     }
 }
 
+fn class_dtor(cdata: cmd, id: ast::node_id) -> option<ast::def_id> {
+    let items = ebml::get_doc(ebml::doc(cdata.data), tag_items);
+    let cls_items = alt maybe_find_item(id, items) {
+            some(it) { it }
+            none     { ret none; }};
+    let mut rslt = none;
+    ebml::tagged_docs(cls_items, tag_item_dtor) {|f|
+        let did = parse_def_id(ebml::doc_data(f));
+        rslt = some(translate_def_id(cdata, did));
+    }
+    rslt
+}
+
 fn get_symbol(data: @[u8], id: ast::node_id) -> str {
     ret item_symbol(lookup_item(id, data));
 }
diff --git a/src/rustc/metadata/encoder.rs b/src/rustc/metadata/encoder.rs
index c4f3225ebfc..4638d8ea4e5 100644
--- a/src/rustc/metadata/encoder.rs
+++ b/src/rustc/metadata/encoder.rs
@@ -201,8 +201,7 @@ fn encode_module_item_paths(ebml_w: ebml::writer, ecx: @encode_ctxt,
             encode_def_id(ebml_w, local_def(it.id));
             ebml_w.end_tag();
           }
-          // FIXME: I don't *think* dtor needs to be serialized?
-          item_class(_, _, items, ctor, _dtor, _) {
+          item_class(_, _, items, ctor, m_dtor, _) {
             add_to_index(ebml_w, path, index, it.ident);
             ebml_w.start_tag(tag_paths_data_item);
             encode_name(ebml_w, it.ident);
@@ -212,6 +211,12 @@ fn encode_module_item_paths(ebml_w: ebml::writer, ecx: @encode_ctxt,
             add_to_index(ebml_w, path, index, it.ident);
             #debug("ctor id: %d", ctor.node.id);
             encode_named_def_id(ebml_w, it.ident, local_def(ctor.node.id));
+            /* Encode id for dtor */
+            option::iter(m_dtor) {|dtor|
+                ebml_w.start_tag(tag_item_dtor);
+                encode_def_id(ebml_w, local_def(dtor.node.id));
+                ebml_w.end_tag();
+            };
             encode_class_item_paths(ebml_w, items, path + [it.ident],
                                       index);
             ebml_w.end_tag();