summary refs log tree commit diff
path: root/src/rustc/metadata
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2012-08-09 09:59:50 -0700
committerNiko Matsakis <niko@alum.mit.edu>2012-08-23 06:30:43 -0700
commit511e7626aebe7a8a41c3be1c6fbd16c92e8f9386 (patch)
treeaea0830fc0eb00431d95c5b41550ee1e99e99da2 /src/rustc/metadata
parent8185ede1fad8312244e418b3c082f87386c40145 (diff)
downloadrust-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.rs6
-rw-r--r--src/rustc/metadata/decoder.rs18
-rw-r--r--src/rustc/metadata/encoder.rs8
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) {