about summary refs log tree commit diff
path: root/src/rustc/metadata
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2012-04-24 15:52:52 -0700
committerNiko Matsakis <niko@alum.mit.edu>2012-04-25 19:26:56 -0700
commit825fd1808e2ac8763d16940531f037c9b387c871 (patch)
tree493678053820169e7619bf741fa18fb3dbf72420 /src/rustc/metadata
parent458d2ff067261ab646d914123f9c9c496cd612ae (diff)
downloadrust-825fd1808e2ac8763d16940531f037c9b387c871.tar.gz
rust-825fd1808e2ac8763d16940531f037c9b387c871.zip
lots of work to make iface/impls parameterized by regions
- paths can now take region parameters, replacing the dirty hack
  I was doing before of abusing vstores.  vstores are now a bit
  of a hack though.

- fix various small bugs:
  - we never checked that iface types were compatible when casting
    to an iface with `as`
  - we allowed nonsense like int<int>
  - and more! (actually that may be it)
Diffstat (limited to 'src/rustc/metadata')
-rw-r--r--src/rustc/metadata/encoder.rs10
-rw-r--r--src/rustc/metadata/tydecode.rs21
-rw-r--r--src/rustc/metadata/tyencode.rs8
3 files changed, 20 insertions, 19 deletions
diff --git a/src/rustc/metadata/encoder.rs b/src/rustc/metadata/encoder.rs
index ae3bc4e0a2c..a1c996dccf1 100644
--- a/src/rustc/metadata/encoder.rs
+++ b/src/rustc/metadata/encoder.rs
@@ -185,14 +185,14 @@ fn encode_module_item_paths(ebml_w: ebml::writer, ecx: @encode_ctxt,
             ebml_w.end_tag();
             encode_enum_variant_paths(ebml_w, variants, path, index);
           }
-          item_iface(_, _) {
+          item_iface(*) {
             add_to_index(ebml_w, path, index, it.ident);
             ebml_w.start_tag(tag_paths_data_item);
             encode_name(ebml_w, it.ident);
             encode_def_id(ebml_w, local_def(it.id));
             ebml_w.end_tag();
           }
-          item_impl(_, _, _, _) {}
+          item_impl(*) {}
         }
     }
 }
@@ -649,11 +649,12 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item,
         encode_path(ebml_w, path, ast_map::path_name(item.ident));
         ebml_w.end_tag();
       }
-      item_impl(tps, ifce, _, methods) {
+      item_impl(tps, rp, ifce, _, methods) {
         add_to_index();
         ebml_w.start_tag(tag_items_data_item);
         encode_def_id(ebml_w, local_def(item.id));
         encode_family(ebml_w, 'i');
+        encode_region_param(ebml_w, rp);
         encode_type_param_bounds(ebml_w, ecx, tps);
         encode_type(ecx, ebml_w, node_id_to_type(tcx, item.id));
         encode_name(ebml_w, item.ident);
@@ -681,11 +682,12 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item,
                    should_inline(m.attrs), item.id, m, tps + m.tps);
         }
       }
-      item_iface(tps, ms) {
+      item_iface(tps, rp, ms) {
         add_to_index();
         ebml_w.start_tag(tag_items_data_item);
         encode_def_id(ebml_w, local_def(item.id));
         encode_family(ebml_w, 'I');
+        encode_region_param(ebml_w, rp);
         encode_type_param_bounds(ebml_w, ecx, tps);
         encode_type(ecx, ebml_w, node_id_to_type(tcx, item.id));
         encode_name(ebml_w, item.ident);
diff --git a/src/rustc/metadata/tydecode.rs b/src/rustc/metadata/tydecode.rs
index 872dfa8b8d4..46c39256938 100644
--- a/src/rustc/metadata/tydecode.rs
+++ b/src/rustc/metadata/tydecode.rs
@@ -104,7 +104,8 @@ fn parse_path(st: @pstate) -> @ast::path {
           c {
             if c == '(' {
                 ret @{span: ast_util::dummy_sp(),
-                      global: false, idents: idents, types: []};
+                      global: false, idents: idents,
+                      rp: none, types: []};
             } else { idents += [parse_ident_(st, is_last)]; }
           }
         }
@@ -286,12 +287,11 @@ fn parse_ty(st: @pstate, conv: conv_did) -> ty::t {
         ret ty::mk_enum(st.tcx, def, substs);
       }
       'x' {
-        assert (next(st) == '[');
+        assert next(st) == '[';
         let def = parse_def(st, conv);
-        let mut params: [ty::t] = [];
-        while peek(st) != ']' { params += [parse_ty(st, conv)]; }
-        st.pos = st.pos + 1u;
-        ret ty::mk_iface(st.tcx, def, params);
+        let substs = parse_substs(st, conv);
+        assert next(st) == ']';
+        ret ty::mk_iface(st.tcx, def, substs);
       }
       'p' {
         let did = parse_def(st, conv);
@@ -299,10 +299,9 @@ fn parse_ty(st: @pstate, conv: conv_did) -> ty::t {
       }
       's' {
         assert next(st) == '[';
-        let mut params = [];
-        while peek(st) != ']' { params += [parse_ty(st, conv)]; }
-        st.pos += 1u;
-        ret ty::mk_self(st.tcx, params);
+        let substs = parse_substs(st, conv);
+        assert next(st) == ']';
+        ret ty::mk_self(st.tcx, substs);
       }
       '@' { ret ty::mk_box(st.tcx, parse_mt(st, conv)); }
       '~' { ret ty::mk_uniq(st.tcx, parse_mt(st, conv)); }
@@ -344,7 +343,7 @@ fn parse_ty(st: @pstate, conv: conv_did) -> ty::t {
         parse_ty_rust_fn(st, conv, proto)
       }
       'r' {
-        assert (next(st) == '[');
+        assert next(st) == '[';
         let def = parse_def(st, conv);
         let inner = parse_ty(st, conv);
         let substs = parse_substs(st, conv);
diff --git a/src/rustc/metadata/tyencode.rs b/src/rustc/metadata/tyencode.rs
index 763e710b07a..130e7f40916 100644
--- a/src/rustc/metadata/tyencode.rs
+++ b/src/rustc/metadata/tyencode.rs
@@ -220,11 +220,11 @@ fn enc_sty(w: io::writer, cx: @ctxt, st: ty::sty) {
         enc_substs(w, cx, substs);
         w.write_char(']');
       }
-      ty::ty_iface(def, tys) {
+      ty::ty_iface(def, substs) {
         w.write_str("x["/&);
         w.write_str(cx.ds(def));
         w.write_char('|');
-        for tys.each {|t| enc_ty(w, cx, t); }
+        enc_substs(w, cx, substs);
         w.write_char(']');
       }
       ty::ty_tup(ts) {
@@ -281,9 +281,9 @@ fn enc_sty(w: io::writer, cx: @ctxt, st: ty::sty) {
         w.write_char('|');
         w.write_str(uint::str(id));
       }
-      ty::ty_self(tps) {
+      ty::ty_self(substs) {
         w.write_str("s["/&);
-        for tps.each {|t| enc_ty(w, cx, t); }
+        enc_substs(w, cx, substs);
         w.write_char(']');
       }
       ty::ty_type { w.write_char('Y'); }