about summary refs log tree commit diff
path: root/src/rustc/metadata/decoder.rs
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/decoder.rs
parent5d625af9f944c7b6567c443a6f796e30dbb01bf2 (diff)
downloadrust-fa5cc5bcd0e370a677de141d46455d4ee518dcfc.tar.gz
rust-fa5cc5bcd0e370a677de141d46455d4ee518dcfc.zip
Generate drop glue correctly for classes with destructors
Diffstat (limited to 'src/rustc/metadata/decoder.rs')
-rw-r--r--src/rustc/metadata/decoder.rs14
1 files changed, 14 insertions, 0 deletions
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));
 }