Skip to content

Commit 1851550

Browse files
committed
Introduce VecPerParamSpace and use it to represent sets of types and
parameters This involves numerous substeps: 1. Treat Self same as any other parameter. 2. No longer compute offsets for method parameters. 3. Store all generic types (both trait/impl and method) with a method, eliminating odd discrepancies. 4. Stop doing unspeakable things to static methods and instead just use the natural types, now that we can easily add the type parameters from trait into the method's polytype. 5. No doubt some more. It was hard to separate these into distinct commits. Fixes rust-lang#13564
1 parent bd6683c commit 1851550

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+2557
-2215
lines changed

src/librustc/metadata/common.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -189,9 +189,7 @@ pub static tag_impls_impl: uint = 0x81;
189189
pub static tag_items_data_item_inherent_impl: uint = 0x82;
190190
pub static tag_items_data_item_extension_impl: uint = 0x83;
191191

192-
pub static tag_region_param_def: uint = 0x84;
193-
pub static tag_region_param_def_ident: uint = 0x85;
194-
pub static tag_region_param_def_def_id: uint = 0x86;
192+
// GAP 0x84, 0x85, 0x86
195193

196194
pub static tag_native_libraries: uint = 0x87;
197195
pub static tag_native_libraries_lib: uint = 0x88;
@@ -214,3 +212,9 @@ pub struct LinkMeta {
214212
pub crateid: CrateId,
215213
pub crate_hash: Svh,
216214
}
215+
216+
pub static tag_region_param_def: uint = 0x90;
217+
pub static tag_region_param_def_ident: uint = 0x91;
218+
pub static tag_region_param_def_def_id: uint = 0x92;
219+
pub static tag_region_param_def_space: uint = 0x93;
220+
pub static tag_region_param_def_index: uint = 0x94;

src/librustc/metadata/csearch.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,8 @@ pub fn get_field_type(tcx: &ty::ctxt, class_id: ast::DefId,
223223
});
224224
let ty = decoder::item_type(def, the_field, tcx, &*cdata);
225225
ty::ty_param_bounds_and_ty {
226-
generics: ty::Generics {type_param_defs: Rc::new(Vec::new()),
227-
region_param_defs: Rc::new(Vec::new())},
226+
generics: ty::Generics {types: VecPerParamSpace::empty(),
227+
regions: VecPerParamSpace::empty()},
228228
ty: ty
229229
}
230230
}
@@ -240,7 +240,8 @@ pub fn get_impl_trait(tcx: &ty::ctxt,
240240

241241
// Given a def_id for an impl, return information about its vtables
242242
pub fn get_impl_vtables(tcx: &ty::ctxt,
243-
def: ast::DefId) -> typeck::impl_res {
243+
def: ast::DefId)
244+
-> typeck::vtable_res {
244245
let cstore = &tcx.sess.cstore;
245246
let cdata = cstore.get_crate_data(def.krate);
246247
decoder::get_impl_vtables(&*cdata, def.node, tcx)

src/librustc/metadata/decoder.rs

+38-30
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use metadata::tydecode::{parse_ty_data, parse_def_id,
2323
parse_bare_fn_ty_data, parse_trait_ref_data};
2424
use middle::lang_items;
2525
use middle::def;
26+
use middle::subst;
2627
use middle::ty::{ImplContainer, TraitContainer};
2728
use middle::ty;
2829
use middle::typeck;
@@ -257,34 +258,44 @@ fn item_ty_param_defs(item: ebml::Doc,
257258
tcx: &ty::ctxt,
258259
cdata: Cmd,
259260
tag: uint)
260-
-> Rc<Vec<ty::TypeParameterDef> > {
261-
let mut bounds = Vec::new();
261+
-> subst::VecPerParamSpace<ty::TypeParameterDef> {
262+
let mut bounds = subst::VecPerParamSpace::empty();
262263
reader::tagged_docs(item, tag, |p| {
263264
let bd = parse_type_param_def_data(
264265
p.data, p.start, cdata.cnum, tcx,
265266
|_, did| translate_def_id(cdata, did));
266-
bounds.push(bd);
267+
bounds.push(bd.space, bd);
267268
true
268269
});
269-
Rc::new(bounds)
270+
bounds
270271
}
271272

272273
fn item_region_param_defs(item_doc: ebml::Doc, cdata: Cmd)
273-
-> Rc<Vec<ty::RegionParameterDef> > {
274-
let mut v = Vec::new();
274+
-> subst::VecPerParamSpace<ty::RegionParameterDef>
275+
{
276+
let mut v = subst::VecPerParamSpace::empty();
275277
reader::tagged_docs(item_doc, tag_region_param_def, |rp_doc| {
276-
let ident_str_doc = reader::get_doc(rp_doc,
277-
tag_region_param_def_ident);
278-
let ident = item_name(&*token::get_ident_interner(), ident_str_doc);
279-
let def_id_doc = reader::get_doc(rp_doc,
280-
tag_region_param_def_def_id);
281-
let def_id = reader::with_doc_data(def_id_doc, parse_def_id);
282-
let def_id = translate_def_id(cdata, def_id);
283-
v.push(ty::RegionParameterDef { name: ident.name,
284-
def_id: def_id });
285-
true
286-
});
287-
Rc::new(v)
278+
let ident_str_doc = reader::get_doc(rp_doc,
279+
tag_region_param_def_ident);
280+
let ident = item_name(&*token::get_ident_interner(), ident_str_doc);
281+
let def_id_doc = reader::get_doc(rp_doc,
282+
tag_region_param_def_def_id);
283+
let def_id = reader::with_doc_data(def_id_doc, parse_def_id);
284+
let def_id = translate_def_id(cdata, def_id);
285+
286+
let doc = reader::get_doc(rp_doc, tag_region_param_def_space);
287+
let space = subst::ParamSpace::from_uint(reader::doc_as_u64(doc) as uint);
288+
289+
let doc = reader::get_doc(rp_doc, tag_region_param_def_index);
290+
let index = reader::doc_as_u64(doc) as uint;
291+
292+
v.push(space, ty::RegionParameterDef { name: ident.name,
293+
def_id: def_id,
294+
space: space,
295+
index: index });
296+
true
297+
});
298+
v
288299
}
289300

290301
fn enum_variant_ids(item: ebml::Doc, cdata: Cmd) -> Vec<ast::DefId> {
@@ -403,8 +414,8 @@ pub fn get_trait_def(cdata: Cmd,
403414
}
404415

405416
ty::TraitDef {
406-
generics: ty::Generics {type_param_defs: tp_defs,
407-
region_param_defs: rp_defs},
417+
generics: ty::Generics {types: tp_defs,
418+
regions: rp_defs},
408419
bounds: bounds,
409420
trait_ref: Rc::new(item_trait_ref(item_doc, tcx, cdata))
410421
}
@@ -422,8 +433,8 @@ pub fn get_type(cdata: Cmd, id: ast::NodeId, tcx: &ty::ctxt)
422433
let rp_defs = item_region_param_defs(item, cdata);
423434

424435
ty::ty_param_bounds_and_ty {
425-
generics: ty::Generics {type_param_defs: tp_defs,
426-
region_param_defs: rp_defs},
436+
generics: ty::Generics {types: tp_defs,
437+
regions: rp_defs},
427438
ty: t
428439
}
429440
}
@@ -440,16 +451,13 @@ pub fn get_impl_trait(cdata: Cmd,
440451

441452
pub fn get_impl_vtables(cdata: Cmd,
442453
id: ast::NodeId,
443-
tcx: &ty::ctxt) -> typeck::impl_res
454+
tcx: &ty::ctxt)
455+
-> typeck::vtable_res
444456
{
445457
let item_doc = lookup_item(id, cdata.data());
446458
let vtables_doc = reader::get_doc(item_doc, tag_item_impl_vtables);
447459
let mut decoder = reader::Decoder::new(vtables_doc);
448-
449-
typeck::impl_res {
450-
trait_vtables: decoder.read_vtable_res(tcx, cdata),
451-
self_vtables: decoder.read_vtable_param_res(tcx, cdata)
452-
}
460+
decoder.read_vtable_res(tcx, cdata)
453461
}
454462

455463

@@ -802,8 +810,8 @@ pub fn get_method(intr: Rc<IdentInterner>, cdata: Cmd, id: ast::NodeId,
802810
ty::Method::new(
803811
name,
804812
ty::Generics {
805-
type_param_defs: type_param_defs,
806-
region_param_defs: rp_defs,
813+
types: type_param_defs,
814+
regions: rp_defs,
807815
},
808816
fty,
809817
explicit_self,

src/librustc/metadata/encoder.rs

+18-15
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use metadata::common::*;
1919
use metadata::cstore;
2020
use metadata::decoder;
2121
use metadata::tyencode;
22+
use middle::subst::VecPerParamSpace;
2223
use middle::ty::{node_id_to_type, lookup_item_type};
2324
use middle::astencode;
2425
use middle::ty;
@@ -125,10 +126,9 @@ fn encode_trait_ref(ebml_w: &mut Encoder,
125126

126127
fn encode_impl_vtables(ebml_w: &mut Encoder,
127128
ecx: &EncodeContext,
128-
vtables: &typeck::impl_res) {
129+
vtables: &typeck::vtable_res) {
129130
ebml_w.start_tag(tag_item_impl_vtables);
130-
astencode::encode_vtable_res(ecx, ebml_w, &vtables.trait_vtables);
131-
astencode::encode_vtable_param_res(ecx, ebml_w, &vtables.self_vtables);
131+
astencode::encode_vtable_res(ecx, ebml_w, vtables);
132132
ebml_w.end_tag();
133133
}
134134

@@ -145,7 +145,7 @@ pub fn def_to_str(did: DefId) -> String {
145145

146146
fn encode_ty_type_param_defs(ebml_w: &mut Encoder,
147147
ecx: &EncodeContext,
148-
params: &[ty::TypeParameterDef],
148+
params: &VecPerParamSpace<ty::TypeParameterDef>,
149149
tag: uint) {
150150
let ty_str_ctxt = &tyencode::ctxt {
151151
diag: ecx.diag,
@@ -161,7 +161,7 @@ fn encode_ty_type_param_defs(ebml_w: &mut Encoder,
161161
}
162162

163163
fn encode_region_param_defs(ebml_w: &mut Encoder,
164-
params: &[ty::RegionParameterDef]) {
164+
params: &VecPerParamSpace<ty::RegionParameterDef>) {
165165
for param in params.iter() {
166166
ebml_w.start_tag(tag_region_param_def);
167167

@@ -172,6 +172,12 @@ fn encode_region_param_defs(ebml_w: &mut Encoder,
172172
ebml_w.wr_tagged_str(tag_region_param_def_def_id,
173173
def_to_str(param.def_id).as_slice());
174174

175+
ebml_w.wr_tagged_u64(tag_region_param_def_space,
176+
param.space.to_uint() as u64);
177+
178+
ebml_w.wr_tagged_u64(tag_region_param_def_index,
179+
param.index as u64);
180+
175181
ebml_w.end_tag();
176182
}
177183
}
@@ -188,9 +194,9 @@ fn encode_item_variances(ebml_w: &mut Encoder,
188194
fn encode_bounds_and_type(ebml_w: &mut Encoder,
189195
ecx: &EncodeContext,
190196
tpt: &ty::ty_param_bounds_and_ty) {
191-
encode_ty_type_param_defs(ebml_w, ecx, tpt.generics.type_param_defs(),
197+
encode_ty_type_param_defs(ebml_w, ecx, &tpt.generics.types,
192198
tag_items_data_item_ty_param_bounds);
193-
encode_region_param_defs(ebml_w, tpt.generics.region_param_defs());
199+
encode_region_param_defs(ebml_w, &tpt.generics.regions);
194200
encode_type(ecx, ebml_w, tpt.ty);
195201
}
196202

@@ -722,8 +728,7 @@ fn encode_method_ty_fields(ecx: &EncodeContext,
722728
method_ty: &ty::Method) {
723729
encode_def_id(ebml_w, method_ty.def_id);
724730
encode_name(ebml_w, method_ty.ident.name);
725-
encode_ty_type_param_defs(ebml_w, ecx,
726-
method_ty.generics.type_param_defs(),
731+
encode_ty_type_param_defs(ebml_w, ecx, &method_ty.generics.types,
727732
tag_item_method_tps);
728733
encode_method_fty(ecx, ebml_w, &method_ty.fty);
729734
encode_visibility(ebml_w, method_ty.vis);
@@ -767,10 +772,8 @@ fn encode_info_for_method(ecx: &EncodeContext,
767772
}
768773

769774
for &ast_method in ast_method_opt.iter() {
770-
let num_params = tpt.generics.type_param_defs().len();
771-
if num_params > 0u ||
772-
is_default_impl ||
773-
should_inline(ast_method.attrs.as_slice()) {
775+
let any_types = !tpt.generics.types.is_empty();
776+
if any_types || is_default_impl || should_inline(ast_method.attrs.as_slice()) {
774777
encode_inlined_item(ecx, ebml_w,
775778
IIMethodRef(local_def(parent_id), false, ast_method));
776779
} else {
@@ -1121,9 +1124,9 @@ fn encode_info_for_item(ecx: &EncodeContext,
11211124
encode_item_variances(ebml_w, ecx, item.id);
11221125
let trait_def = ty::lookup_trait_def(tcx, def_id);
11231126
encode_ty_type_param_defs(ebml_w, ecx,
1124-
trait_def.generics.type_param_defs(),
1127+
&trait_def.generics.types,
11251128
tag_items_data_item_ty_param_bounds);
1126-
encode_region_param_defs(ebml_w, trait_def.generics.region_param_defs());
1129+
encode_region_param_defs(ebml_w, &trait_def.generics.regions);
11271130
encode_trait_ref(ebml_w, ecx, &*trait_def.trait_ref, tag_item_trait_ref);
11281131
encode_name(ebml_w, item.ident.name);
11291132
encode_attributes(ebml_w, item.attrs.as_slice());

0 commit comments

Comments
 (0)