From 4c9c1cd199d18719351034a4c358f5a6878880b0 Mon Sep 17 00:00:00 2001 From: Marijn Haverbeke Date: Wed, 11 Jan 2012 21:40:13 +0100 Subject: [PATCH] Fix dependency bug iface-did-of-impl resolving By simply not resolving that def id until the typeck pass. Closes #1494 --- src/comp/metadata/common.rs | 1 - src/comp/metadata/decoder.rs | 13 +------------ src/comp/metadata/encoder.rs | 7 ------- src/comp/middle/resolve.rs | 9 +-------- src/comp/middle/typeck.rs | 10 +++++++++- src/libstd/test.rs | 2 +- 6 files changed, 12 insertions(+), 30 deletions(-) diff --git a/src/comp/metadata/common.rs b/src/comp/metadata/common.rs index e1c05bf2c9f54..b16120d1bec1e 100644 --- a/src/comp/metadata/common.rs +++ b/src/comp/metadata/common.rs @@ -68,7 +68,6 @@ const tag_mod_impl: uint = 0x30u; const tag_item_method: uint = 0x31u; const tag_impl_iface: uint = 0x32u; -const tag_impl_iface_did: uint = 0x33u; // discriminator value for variants const tag_disr_val: uint = 0x34u; diff --git a/src/comp/metadata/decoder.rs b/src/comp/metadata/decoder.rs index b1da9f840a893..c076b044f52b1 100644 --- a/src/comp/metadata/decoder.rs +++ b/src/comp/metadata/decoder.rs @@ -126,16 +126,6 @@ fn item_impl_iface(item: ebml::doc, tcx: ty::ctxt, cdata: cmd) result } -fn item_impl_iface_did(item: ebml::doc, cdata: cmd) - -> option::t { - let result = none; - ebml::tagged_docs(item, tag_impl_iface_did) {|doc| - let did = translate_def_id(cdata, parse_def_id(ebml::doc_data(doc))); - result = some(did); - } - result -} - fn item_ty_param_bounds(item: ebml::doc, tcx: ty::ctxt, cdata: cmd) -> @[ty::param_bounds] { let bounds = []; @@ -297,8 +287,7 @@ fn get_impls_for_mod(cdata: cmd, m_id: ast::node_id, let item = lookup_item(did.node, data), nm = item_name(item); if alt name { some(n) { n == nm } none. { true } } { let base_tps = item_ty_param_count(doc); - let i_did = item_impl_iface_did(item, cdata); - result += [@{did: did, iface_did: i_did, ident: nm, + result += [@{did: did, ident: nm, methods: item_impl_methods(cdata, item, base_tps)}]; } } diff --git a/src/comp/metadata/encoder.rs b/src/comp/metadata/encoder.rs index e7d5c47643f46..634947941d64a 100644 --- a/src/comp/metadata/encoder.rs +++ b/src/comp/metadata/encoder.rs @@ -405,13 +405,6 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item, ebml::start_tag(ebml_w, tag_impl_iface); write_type(ecx, ebml_w, i_ty); ebml::end_tag(ebml_w); - ebml::start_tag(ebml_w, tag_impl_iface_did); - alt ty::struct(tcx, i_ty) { - ty::ty_iface(did, _) { - ebml_w.writer.write(str::bytes(def_to_str(did))); - } - } - ebml::end_tag(ebml_w); } _ {} } diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs index 1232926499519..8925ca6b31295 100644 --- a/src/comp/middle/resolve.rs +++ b/src/comp/middle/resolve.rs @@ -1825,8 +1825,7 @@ fn check_exports(e: @env) { // Impl resolution type method_info = {did: def_id, n_tps: uint, ident: ast::ident}; -type _impl = {did: def_id, iface_did: option::t, - ident: ast::ident, methods: [@method_info]}; +type _impl = {did: def_id, ident: ast::ident, methods: [@method_info]}; type iscopes = list<@[@_impl]>; fn resolve_impls(e: @env, c: @ast::crate) { @@ -1893,12 +1892,6 @@ fn find_impls_in_item(e: env, i: @ast::item, &impls: [@_impl], _ { true } } { impls += [@{did: local_def(i.id), - iface_did: alt ifce { - some(@{node: ast::ty_path(_, id), _}) { - some(def_id_of_def(e.def_map.get(id))) - } - _ { none } - }, ident: i.ident, methods: vec::map(mthds, {|m| @{did: local_def(m.id), diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index 1d701f9b9ab6f..0b0e2bdfe703c 100644 --- a/src/comp/middle/typeck.rs +++ b/src/comp/middle/typeck.rs @@ -2947,7 +2947,15 @@ mod dict { std::list::iter(isc) {|impls| if option::is_some(found) { ret; } for im in *impls { - if im.iface_did == some(iface_id) { + let match = alt ty::impl_iface(tcx, im.did) { + some(ity) { + alt ty::struct(tcx, ity) { + ty::ty_iface(id, _) { id == iface_id } + } + } + _ { false } + }; + if match { let {n_tps, ty: self_ty} = impl_self_ty(tcx, im.did); let {vars, ty: self_ty} = if n_tps > 0u { bind_params(fcx, self_ty, n_tps) diff --git a/src/libstd/test.rs b/src/libstd/test.rs index af2910536b24f..7b9157f2afe11 100644 --- a/src/libstd/test.rs +++ b/src/libstd/test.rs @@ -31,7 +31,7 @@ native mod rustrt { } // FIXME Kludge to work around issue #1494 . Simply import io::writer_util -// when that is fixed. +// after the next snapshot. impl writer_util for io::writer { fn write_str(s: str) { self.write(str::bytes(s)); } fn write_line(s: str) { self.write(str::bytes(s + "\n")); }