diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2012-08-09 09:59:50 -0700 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2012-08-23 06:30:43 -0700 |
| commit | 511e7626aebe7a8a41c3be1c6fbd16c92e8f9386 (patch) | |
| tree | aea0830fc0eb00431d95c5b41550ee1e99e99da2 /src/rustc/metadata | |
| parent | 8185ede1fad8312244e418b3c082f87386c40145 (diff) | |
| download | rust-511e7626aebe7a8a41c3be1c6fbd16c92e8f9386.tar.gz rust-511e7626aebe7a8a41c3be1c6fbd16c92e8f9386.zip | |
Infer variance of types with respect to the region parameter.
A similar approach could be used for type parameters. Fixes #2282.
Diffstat (limited to 'src/rustc/metadata')
| -rw-r--r-- | src/rustc/metadata/csearch.rs | 6 | ||||
| -rw-r--r-- | src/rustc/metadata/decoder.rs | 18 | ||||
| -rw-r--r-- | src/rustc/metadata/encoder.rs | 8 |
3 files changed, 21 insertions, 11 deletions
diff --git a/src/rustc/metadata/csearch.rs b/src/rustc/metadata/csearch.rs index 52e6841b2ed..09de007f0a5 100644 --- a/src/rustc/metadata/csearch.rs +++ b/src/rustc/metadata/csearch.rs @@ -127,7 +127,7 @@ fn get_type(tcx: ty::ctxt, def: ast::def_id) -> ty::ty_param_bounds_and_ty { } fn get_region_param(cstore: metadata::cstore::cstore, - def: ast::def_id) -> bool { + def: ast::def_id) -> option<ty::region_variance> { let cdata = cstore::get_crate_data(cstore, def.crate); return decoder::get_region_param(cdata, def.node); } @@ -149,7 +149,9 @@ fn get_field_type(tcx: ty::ctxt, class_id: ast::def_id, class_id, def} ); debug!{"got field data %?", the_field}; let ty = decoder::item_type(def, the_field, tcx, cdata); - return {bounds: @~[], rp: false, ty: ty}; + return {bounds: @~[], + region_param: none, + ty: ty}; } // Given a def_id for an impl or class, return the traits it implements, diff --git a/src/rustc/metadata/decoder.rs b/src/rustc/metadata/decoder.rs index a1a2b7245eb..b78be76dc69 100644 --- a/src/rustc/metadata/decoder.rs +++ b/src/rustc/metadata/decoder.rs @@ -237,11 +237,11 @@ fn item_ty_param_bounds(item: ebml::doc, tcx: ty::ctxt, cdata: cmd) @bounds } -fn item_ty_region_param(item: ebml::doc) -> bool { - match ebml::maybe_get_doc(item, tag_region_param) { - some(_) => true, - none => false - } +fn item_ty_region_param(item: ebml::doc) -> option<ty::region_variance> { + ebml::maybe_get_doc(item, tag_region_param).map(|doc| { + let d = ebml::ebml_deserializer(doc); + ty::deserialize_region_variance(d) + }) } fn item_ty_param_count(item: ebml::doc) -> uint { @@ -340,10 +340,14 @@ fn get_type(cdata: cmd, id: ast::node_id, tcx: ty::ctxt) item_ty_param_bounds(item, tcx, cdata) } else { @~[] }; let rp = item_ty_region_param(item); - return {bounds: tp_bounds, rp: rp, ty: t}; + return {bounds: tp_bounds, + region_param: rp, + ty: t}; } -fn get_region_param(cdata: cmd, id: ast::node_id) -> bool { +fn get_region_param(cdata: cmd, id: ast::node_id) + -> option<ty::region_variance> { + let item = lookup_item(id, cdata.data); return item_ty_region_param(item); } diff --git a/src/rustc/metadata/encoder.rs b/src/rustc/metadata/encoder.rs index 7b2e2b8a217..f37cdd331cc 100644 --- a/src/rustc/metadata/encoder.rs +++ b/src/rustc/metadata/encoder.rs @@ -81,8 +81,12 @@ fn encode_def_id(ebml_w: ebml::writer, id: def_id) { fn encode_region_param(ecx: @encode_ctxt, ebml_w: ebml::writer, it: @ast::item) { - let rp = ecx.tcx.region_paramd_items.contains_key(it.id); - if rp { do ebml_w.wr_tag(tag_region_param) { } } + let opt_rp = ecx.tcx.region_paramd_items.find(it.id); + for opt_rp.each |rp| { + do ebml_w.wr_tag(tag_region_param) { + ty::serialize_region_variance(ebml_w, rp); + } + } } fn encode_mutability(ebml_w: ebml::writer, mt: class_mutability) { |
