diff options
| author | Tim Chevalier <chevalier@alum.wellesley.edu> | 2012-05-15 17:59:55 -0700 |
|---|---|---|
| committer | Tim Chevalier <chevalier@alum.wellesley.edu> | 2012-05-15 18:00:41 -0700 |
| commit | fa5cc5bcd0e370a677de141d46455d4ee518dcfc (patch) | |
| tree | b918a6d1643f41eb4f17b65eca80b283c6cefbd7 /src/rustc/metadata | |
| parent | 5d625af9f944c7b6567c443a6f796e30dbb01bf2 (diff) | |
| download | rust-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.rs | 1 | ||||
| -rw-r--r-- | src/rustc/metadata/csearch.rs | 7 | ||||
| -rw-r--r-- | src/rustc/metadata/decoder.rs | 14 | ||||
| -rw-r--r-- | src/rustc/metadata/encoder.rs | 9 |
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(); |
