diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2012-04-24 15:52:52 -0700 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2012-04-25 19:26:56 -0700 |
| commit | 825fd1808e2ac8763d16940531f037c9b387c871 (patch) | |
| tree | 493678053820169e7619bf741fa18fb3dbf72420 /src/rustc/metadata | |
| parent | 458d2ff067261ab646d914123f9c9c496cd612ae (diff) | |
| download | rust-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.rs | 10 | ||||
| -rw-r--r-- | src/rustc/metadata/tydecode.rs | 21 | ||||
| -rw-r--r-- | src/rustc/metadata/tyencode.rs | 8 |
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'); } |
