Skip to content

Commit 9d3f57e

Browse files
committed
Introduce new variance inference pass that replaces (and generalizes) old
region-parameterization/variance inference. We now compute variance for type parameters but do not make use of it (most of the way towards rust-lang#3598).
1 parent 1f4faae commit 9d3f57e

23 files changed

+1278
-807
lines changed

src/librustc/metadata/common.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ pub static tag_path_elt_name: uint = 0x43u;
8989
pub static tag_item_field: uint = 0x44u;
9090
pub static tag_struct_mut: uint = 0x45u;
9191

92-
pub static tag_region_param: uint = 0x46u;
92+
pub static tag_item_variances: uint = 0x46;
9393
pub static tag_mod_impl_trait: uint = 0x47u;
9494
/*
9595
trait items contain tag_item_trait_method elements,

src/librustc/metadata/csearch.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
use metadata::common::*;
1515
use metadata::cstore;
1616
use metadata::decoder;
17-
use metadata;
1817
use middle::ty;
1918
use middle::typeck;
2019

@@ -144,6 +143,12 @@ pub fn get_trait_method_def_ids(cstore: @mut cstore::CStore,
144143
decoder::get_trait_method_def_ids(cdata, def.node)
145144
}
146145

146+
pub fn get_item_variances(cstore: @mut cstore::CStore,
147+
def: ast::DefId) -> ty::ItemVariances {
148+
let cdata = cstore::get_crate_data(cstore, def.crate);
149+
decoder::get_item_variances(cdata, def.node)
150+
}
151+
147152
pub fn get_provided_trait_methods(tcx: ty::ctxt,
148153
def: ast::DefId)
149154
-> ~[@ty::Method] {

src/librustc/metadata/decoder.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,6 +1088,14 @@ pub fn get_trait_method_def_ids(cdata: Cmd,
10881088
result
10891089
}
10901090

1091+
pub fn get_item_variances(cdata: Cmd, id: ast::NodeId) -> ty::ItemVariances {
1092+
let data = cdata.data;
1093+
let item_doc = lookup_item(id, data);
1094+
let variance_doc = reader::get_doc(item_doc, tag_item_variances);
1095+
let mut decoder = reader::Decoder(variance_doc);
1096+
Decodable::decode(&mut decoder)
1097+
}
1098+
10911099
pub fn get_provided_trait_methods(intr: @ident_interner, cdata: Cmd,
10921100
id: ast::NodeId, tcx: ty::ctxt) ->
10931101
~[@ty::Method] {

src/librustc/metadata/encoder.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,15 @@ fn encode_region_param_defs(ebml_w: &mut writer::Encoder,
211211
}
212212
}
213213

214+
fn encode_item_variances(ebml_w: &mut writer::Encoder,
215+
ecx: &EncodeContext,
216+
id: ast::NodeId) {
217+
let v = ty::item_variances(ecx.tcx, ast_util::local_def(id));
218+
ebml_w.start_tag(tag_item_variances);
219+
v.encode(ebml_w);
220+
ebml_w.end_tag();
221+
}
222+
214223
fn encode_bounds_and_type(ebml_w: &mut writer::Encoder,
215224
ecx: &EncodeContext,
216225
tpt: &ty::ty_param_bounds_and_ty) {
@@ -992,6 +1001,7 @@ fn encode_info_for_item(ecx: &EncodeContext,
9921001
ebml_w.start_tag(tag_items_data_item);
9931002
encode_def_id(ebml_w, def_id);
9941003
encode_family(ebml_w, 't');
1004+
encode_item_variances(ebml_w, ecx, item.id);
9951005
encode_bounds_and_type(ebml_w, ecx, &lookup_item_type(tcx, def_id));
9961006
encode_name(ecx, ebml_w, item.ident);
9971007
encode_attributes(ebml_w, item.attrs);
@@ -1032,6 +1042,7 @@ fn encode_info_for_item(ecx: &EncodeContext,
10321042
encode_family(ebml_w, 'S');
10331043
encode_bounds_and_type(ebml_w, ecx, &lookup_item_type(tcx, def_id));
10341044

1045+
encode_item_variances(ebml_w, ecx, item.id);
10351046
encode_name(ecx, ebml_w, item.ident);
10361047
encode_attributes(ebml_w, item.attrs);
10371048
encode_path(ecx, ebml_w, path, ast_map::path_name(item.ident));
@@ -1138,6 +1149,7 @@ fn encode_info_for_item(ecx: &EncodeContext,
11381149
ebml_w.start_tag(tag_items_data_item);
11391150
encode_def_id(ebml_w, def_id);
11401151
encode_family(ebml_w, 'I');
1152+
encode_item_variances(ebml_w, ecx, item.id);
11411153
let trait_def = ty::lookup_trait_def(tcx, def_id);
11421154
encode_ty_type_param_defs(ebml_w, ecx,
11431155
trait_def.generics.type_param_defs,

0 commit comments

Comments
 (0)