Brian Anderson | 45efb1f | 2011-06-27 23:03:01 | [diff] [blame] | 1 | // Metadata encoding |
| 2 | |
Patrick Walton | 0e2fff5 | 2011-07-07 02:00:00 | [diff] [blame] | 3 | import std::ivec; |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 4 | import std::str; |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 5 | import std::uint; |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 6 | import std::ioivec; |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 7 | import std::option; |
| 8 | import std::option::some; |
| 9 | import std::option::none; |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 10 | import std::ebmlivec; |
Brian Anderson | d0a432f | 2011-07-08 06:55:41 | [diff] [blame] | 11 | import std::map; |
Marijn Haverbeke | 6fd6fde | 2011-07-05 09:48:19 | [diff] [blame] | 12 | import syntax::ast::*; |
Brian Anderson | e29ef1b | 2011-07-07 19:22:39 | [diff] [blame] | 13 | import common::*; |
Michael Sullivan | 3b2d23b | 2011-07-22 00:27:34 | [diff] [blame] | 14 | import middle::trans_common::crate_ctxt; |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 15 | import middle::ty; |
Brian Anderson | d236259 | 2011-07-07 17:10:10 | [diff] [blame] | 16 | import middle::ty::node_id_to_monotype; |
Brian Anderson | 5de916d | 2011-06-30 06:42:35 | [diff] [blame] | 17 | import front::attr; |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 18 | |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 19 | export encode_metadata; |
Brian Anderson | 6ee1ffe | 2011-07-07 19:56:01 | [diff] [blame] | 20 | export encoded_ty; |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 21 | |
Brian Anderson | d0a432f | 2011-07-08 06:55:41 | [diff] [blame] | 22 | type abbrev_map = map::hashmap[ty::t, tyencode::ty_abbrev]; |
| 23 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 24 | type encode_ctxt = {ccx: @crate_ctxt, type_abbrevs: abbrev_map}; |
Brian Anderson | d0a432f | 2011-07-08 06:55:41 | [diff] [blame] | 25 | |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 26 | // Path table encoding |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 27 | fn encode_name(ebml_w: &ebmlivec::writer, name: &str) { |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 28 | ebmlivec::start_tag(ebml_w, tag_paths_data_name); |
Brian Anderson | 2e7e588 | 2011-08-11 23:36:20 | [diff] [blame^] | 29 | ebml_w.writer.write(str::bytes(name)); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 30 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 31 | } |
| 32 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 33 | fn encode_def_id(ebml_w: &ebmlivec::writer, id: &def_id) { |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 34 | ebmlivec::start_tag(ebml_w, tag_def_id); |
Brian Anderson | 2e7e588 | 2011-08-11 23:36:20 | [diff] [blame^] | 35 | ebml_w.writer.write(str::bytes(def_to_str(id))); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 36 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 37 | } |
| 38 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 39 | type entry[T] = {val: T, pos: uint}; |
Marijn Haverbeke | aea5377 | 2011-07-26 12:06:02 | [diff] [blame] | 40 | |
Erick Tryzelaar | 8b15045 | 2011-08-04 23:20:09 | [diff] [blame] | 41 | fn encode_tag_variant_paths(ebml_w: &ebmlivec::writer, variants: &[variant], |
| 42 | path: &[str], index: &mutable [entry[str]]) { |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 43 | for variant: variant in variants { |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 44 | add_to_index(ebml_w, path, index, variant.node.name); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 45 | ebmlivec::start_tag(ebml_w, tag_paths_data_item); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 46 | encode_name(ebml_w, variant.node.name); |
| 47 | encode_def_id(ebml_w, local_def(variant.node.id)); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 48 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 49 | } |
| 50 | } |
| 51 | |
Erick Tryzelaar | 8b15045 | 2011-08-04 23:20:09 | [diff] [blame] | 52 | fn add_to_index(ebml_w: &ebmlivec::writer, path: &[str], |
| 53 | index: &mutable [entry[str]], name: &str) { |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 54 | let full_path = path + ~[name]; |
| 55 | index += |
| 56 | ~[{val: str::connect_ivec(full_path, "::"), |
| 57 | pos: ebml_w.writer.tell()}]; |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 58 | } |
| 59 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 60 | fn encode_native_module_item_paths(ebml_w: &ebmlivec::writer, |
Erick Tryzelaar | 8b15045 | 2011-08-04 23:20:09 | [diff] [blame] | 61 | nmod: &native_mod, path: &[str], |
| 62 | index: &mutable [entry[str]]) { |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 63 | for nitem: @native_item in nmod.items { |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 64 | add_to_index(ebml_w, path, index, nitem.ident); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 65 | ebmlivec::start_tag(ebml_w, tag_paths_data_item); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 66 | encode_name(ebml_w, nitem.ident); |
| 67 | encode_def_id(ebml_w, local_def(nitem.id)); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 68 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 69 | } |
| 70 | } |
| 71 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 72 | fn encode_module_item_paths(ebml_w: &ebmlivec::writer, module: &_mod, |
Erick Tryzelaar | 8b15045 | 2011-08-04 23:20:09 | [diff] [blame] | 73 | path: &[str], index: &mutable [entry[str]]) { |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 74 | for it: @item in module.items { |
| 75 | if !is_exported(it.ident, module) { cont; } |
| 76 | alt it.node { |
| 77 | item_const(_, _) { |
| 78 | add_to_index(ebml_w, path, index, it.ident); |
| 79 | ebmlivec::start_tag(ebml_w, tag_paths_data_item); |
| 80 | encode_name(ebml_w, it.ident); |
| 81 | encode_def_id(ebml_w, local_def(it.id)); |
| 82 | ebmlivec::end_tag(ebml_w); |
| 83 | } |
Patrick Walton | 59e9b62 | 2011-08-05 18:38:06 | [diff] [blame] | 84 | item_fn(_, tps) { |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 85 | add_to_index(ebml_w, path, index, it.ident); |
| 86 | ebmlivec::start_tag(ebml_w, tag_paths_data_item); |
| 87 | encode_name(ebml_w, it.ident); |
| 88 | encode_def_id(ebml_w, local_def(it.id)); |
| 89 | ebmlivec::end_tag(ebml_w); |
| 90 | } |
| 91 | item_mod(_mod) { |
| 92 | add_to_index(ebml_w, path, index, it.ident); |
| 93 | ebmlivec::start_tag(ebml_w, tag_paths_data_mod); |
| 94 | encode_name(ebml_w, it.ident); |
| 95 | encode_def_id(ebml_w, local_def(it.id)); |
| 96 | encode_module_item_paths(ebml_w, _mod, path + ~[it.ident], index); |
| 97 | ebmlivec::end_tag(ebml_w); |
| 98 | } |
| 99 | item_native_mod(nmod) { |
| 100 | add_to_index(ebml_w, path, index, it.ident); |
| 101 | ebmlivec::start_tag(ebml_w, tag_paths_data_mod); |
| 102 | encode_name(ebml_w, it.ident); |
| 103 | encode_def_id(ebml_w, local_def(it.id)); |
| 104 | encode_native_module_item_paths(ebml_w, nmod, path + ~[it.ident], |
| 105 | index); |
| 106 | ebmlivec::end_tag(ebml_w); |
| 107 | } |
| 108 | item_ty(_, tps) { |
| 109 | add_to_index(ebml_w, path, index, it.ident); |
| 110 | ebmlivec::start_tag(ebml_w, tag_paths_data_item); |
| 111 | encode_name(ebml_w, it.ident); |
| 112 | encode_def_id(ebml_w, local_def(it.id)); |
| 113 | ebmlivec::end_tag(ebml_w); |
| 114 | } |
| 115 | item_res(_, _, tps, ctor_id) { |
| 116 | add_to_index(ebml_w, path, index, it.ident); |
| 117 | ebmlivec::start_tag(ebml_w, tag_paths_data_item); |
| 118 | encode_name(ebml_w, it.ident); |
| 119 | encode_def_id(ebml_w, local_def(ctor_id)); |
| 120 | ebmlivec::end_tag(ebml_w); |
| 121 | add_to_index(ebml_w, path, index, it.ident); |
| 122 | ebmlivec::start_tag(ebml_w, tag_paths_data_item); |
| 123 | encode_name(ebml_w, it.ident); |
| 124 | encode_def_id(ebml_w, local_def(it.id)); |
| 125 | ebmlivec::end_tag(ebml_w); |
| 126 | } |
| 127 | item_tag(variants, tps) { |
| 128 | add_to_index(ebml_w, path, index, it.ident); |
| 129 | ebmlivec::start_tag(ebml_w, tag_paths_data_item); |
| 130 | encode_name(ebml_w, it.ident); |
| 131 | encode_def_id(ebml_w, local_def(it.id)); |
| 132 | ebmlivec::end_tag(ebml_w); |
| 133 | encode_tag_variant_paths(ebml_w, variants, path, index); |
| 134 | } |
| 135 | item_obj(_, tps, ctor_id) { |
| 136 | add_to_index(ebml_w, path, index, it.ident); |
| 137 | ebmlivec::start_tag(ebml_w, tag_paths_data_item); |
| 138 | encode_name(ebml_w, it.ident); |
| 139 | encode_def_id(ebml_w, local_def(ctor_id)); |
| 140 | ebmlivec::end_tag(ebml_w); |
| 141 | add_to_index(ebml_w, path, index, it.ident); |
| 142 | ebmlivec::start_tag(ebml_w, tag_paths_data_item); |
| 143 | encode_name(ebml_w, it.ident); |
| 144 | encode_def_id(ebml_w, local_def(it.id)); |
| 145 | ebmlivec::end_tag(ebml_w); |
| 146 | } |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 147 | } |
| 148 | } |
| 149 | } |
| 150 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 151 | fn encode_item_paths(ebml_w: &ebmlivec::writer, crate: &@crate) -> |
Erick Tryzelaar | 8b15045 | 2011-08-04 23:20:09 | [diff] [blame] | 152 | [entry[str]] { |
| 153 | let index: [entry[str]] = ~[]; |
| 154 | let path: [str] = ~[]; |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 155 | ebmlivec::start_tag(ebml_w, tag_paths); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 156 | encode_module_item_paths(ebml_w, crate.node.module, path, index); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 157 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 158 | ret index; |
| 159 | } |
| 160 | |
| 161 | |
| 162 | // Item info table encoding |
Graydon Hoare | 59c441a | 2011-07-29 23:40:23 | [diff] [blame] | 163 | fn encode_family(ebml_w: &ebmlivec::writer, c: u8) { |
| 164 | ebmlivec::start_tag(ebml_w, tag_items_data_item_family); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 165 | ebml_w.writer.write(~[c]); |
| 166 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 167 | } |
| 168 | |
Patrick Walton | b079e1a | 2011-08-05 20:58:33 | [diff] [blame] | 169 | fn encode_inlineness(ebml_w: &ebmlivec::writer, c: u8) { |
| 170 | ebmlivec::start_tag(ebml_w, tag_items_data_item_inlineness); |
| 171 | ebml_w.writer.write(~[c]); |
| 172 | ebmlivec::end_tag(ebml_w); |
| 173 | } |
| 174 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 175 | fn def_to_str(did: &def_id) -> str { ret #fmt("%d:%d", did.crate, did.node); } |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 176 | |
Erick Tryzelaar | 8b15045 | 2011-08-04 23:20:09 | [diff] [blame] | 177 | fn encode_type_param_kinds(ebml_w: &ebmlivec::writer, tps: &[ty_param]) { |
Graydon Hoare | 59c441a | 2011-07-29 23:40:23 | [diff] [blame] | 178 | ebmlivec::start_tag(ebml_w, tag_items_data_item_ty_param_kinds); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 179 | ebmlivec::write_vint(ebml_w.writer, ivec::len[ty_param](tps)); |
Graydon Hoare | 59c441a | 2011-07-29 23:40:23 | [diff] [blame] | 180 | for tp: ty_param in tps { |
| 181 | let c = alt tp.kind { |
| 182 | kind_unique. { 'u' } |
| 183 | kind_shared. { 's' } |
| 184 | kind_pinned. { 'p' } |
| 185 | }; |
| 186 | ebml_w.writer.write(~[c as u8]); |
| 187 | } |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 188 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 189 | } |
| 190 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 191 | fn encode_variant_id(ebml_w: &ebmlivec::writer, vid: &def_id) { |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 192 | ebmlivec::start_tag(ebml_w, tag_items_data_item_variant); |
Brian Anderson | 2e7e588 | 2011-08-11 23:36:20 | [diff] [blame^] | 193 | ebml_w.writer.write(str::bytes(def_to_str(vid))); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 194 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 195 | } |
| 196 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 197 | fn encode_type(ecx: &@encode_ctxt, ebml_w: &ebmlivec::writer, typ: &ty::t) { |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 198 | ebmlivec::start_tag(ebml_w, tag_items_data_item_type); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 199 | let f = def_to_str; |
| 200 | let ty_str_ctxt = |
| 201 | @{ds: f, |
| 202 | tcx: ecx.ccx.tcx, |
| 203 | abbrevs: tyencode::ac_use_abbrevs(ecx.type_abbrevs)}; |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 204 | tyencode::enc_ty(ioivec::new_writer_(ebml_w.writer), ty_str_ctxt, typ); |
| 205 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 206 | } |
| 207 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 208 | fn encode_symbol(ecx: &@encode_ctxt, ebml_w: &ebmlivec::writer, id: node_id) { |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 209 | ebmlivec::start_tag(ebml_w, tag_items_data_item_symbol); |
Brian Anderson | 2e7e588 | 2011-08-11 23:36:20 | [diff] [blame^] | 210 | ebml_w.writer.write(str::bytes(ecx.ccx.item_symbols.get(id))); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 211 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 212 | } |
| 213 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 214 | fn encode_discriminant(ecx: &@encode_ctxt, ebml_w: &ebmlivec::writer, |
| 215 | id: node_id) { |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 216 | ebmlivec::start_tag(ebml_w, tag_items_data_item_symbol); |
Brian Anderson | 2e7e588 | 2011-08-11 23:36:20 | [diff] [blame^] | 217 | ebml_w.writer.write(str::bytes(ecx.ccx.discrim_symbols.get(id))); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 218 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 219 | } |
| 220 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 221 | fn encode_tag_id(ebml_w: &ebmlivec::writer, id: &def_id) { |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 222 | ebmlivec::start_tag(ebml_w, tag_items_data_item_tag_id); |
Brian Anderson | 2e7e588 | 2011-08-11 23:36:20 | [diff] [blame^] | 223 | ebml_w.writer.write(str::bytes(def_to_str(id))); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 224 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 225 | } |
| 226 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 227 | fn encode_tag_variant_info(ecx: &@encode_ctxt, ebml_w: &ebmlivec::writer, |
Erick Tryzelaar | 8b15045 | 2011-08-04 23:20:09 | [diff] [blame] | 228 | id: node_id, variants: &[variant], |
| 229 | index: &mutable [entry[int]], |
| 230 | ty_params: &[ty_param]) { |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 231 | for variant: variant in variants { |
| 232 | index += ~[{val: variant.node.id, pos: ebml_w.writer.tell()}]; |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 233 | ebmlivec::start_tag(ebml_w, tag_items_data_item); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 234 | encode_def_id(ebml_w, local_def(variant.node.id)); |
Graydon Hoare | 59c441a | 2011-07-29 23:40:23 | [diff] [blame] | 235 | encode_family(ebml_w, 'v' as u8); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 236 | encode_tag_id(ebml_w, local_def(id)); |
Brian Anderson | d0a432f | 2011-07-08 06:55:41 | [diff] [blame] | 237 | encode_type(ecx, ebml_w, |
| 238 | node_id_to_monotype(ecx.ccx.tcx, variant.node.id)); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 239 | if ivec::len[variant_arg](variant.node.args) > 0u { |
Brian Anderson | d0a432f | 2011-07-08 06:55:41 | [diff] [blame] | 240 | encode_symbol(ecx, ebml_w, variant.node.id); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 241 | } |
Brian Anderson | d0a432f | 2011-07-08 06:55:41 | [diff] [blame] | 242 | encode_discriminant(ecx, ebml_w, variant.node.id); |
Graydon Hoare | 59c441a | 2011-07-29 23:40:23 | [diff] [blame] | 243 | encode_type_param_kinds(ebml_w, ty_params); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 244 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 245 | } |
| 246 | } |
| 247 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 248 | fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: &ebmlivec::writer, |
Erick Tryzelaar | 8b15045 | 2011-08-04 23:20:09 | [diff] [blame] | 249 | item: @item, index: &mutable [entry[int]]) { |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 250 | alt item.node { |
| 251 | item_const(_, _) { |
| 252 | ebmlivec::start_tag(ebml_w, tag_items_data_item); |
| 253 | encode_def_id(ebml_w, local_def(item.id)); |
Graydon Hoare | 59c441a | 2011-07-29 23:40:23 | [diff] [blame] | 254 | encode_family(ebml_w, 'c' as u8); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 255 | encode_type(ecx, ebml_w, node_id_to_monotype(ecx.ccx.tcx, item.id)); |
| 256 | encode_symbol(ecx, ebml_w, item.id); |
| 257 | ebmlivec::end_tag(ebml_w); |
| 258 | } |
Patrick Walton | 59e9b62 | 2011-08-05 18:38:06 | [diff] [blame] | 259 | item_fn(fd, tps) { |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 260 | ebmlivec::start_tag(ebml_w, tag_items_data_item); |
| 261 | encode_def_id(ebml_w, local_def(item.id)); |
Graydon Hoare | 59c441a | 2011-07-29 23:40:23 | [diff] [blame] | 262 | encode_family(ebml_w, |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 263 | alt fd.decl.purity { pure_fn. { 'p' } impure_fn. { 'f' } } |
| 264 | as u8); |
Patrick Walton | b079e1a | 2011-08-05 20:58:33 | [diff] [blame] | 265 | encode_inlineness(ebml_w, |
| 266 | alt fd.decl.il { |
| 267 | il_normal. { 'n' } |
| 268 | il_inline. { 'i' } |
| 269 | } as u8); |
Graydon Hoare | 59c441a | 2011-07-29 23:40:23 | [diff] [blame] | 270 | encode_type_param_kinds(ebml_w, tps); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 271 | encode_type(ecx, ebml_w, node_id_to_monotype(ecx.ccx.tcx, item.id)); |
| 272 | encode_symbol(ecx, ebml_w, item.id); |
| 273 | ebmlivec::end_tag(ebml_w); |
| 274 | } |
| 275 | item_mod(_) { |
| 276 | ebmlivec::start_tag(ebml_w, tag_items_data_item); |
| 277 | encode_def_id(ebml_w, local_def(item.id)); |
Graydon Hoare | 59c441a | 2011-07-29 23:40:23 | [diff] [blame] | 278 | encode_family(ebml_w, 'm' as u8); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 279 | ebmlivec::end_tag(ebml_w); |
| 280 | } |
| 281 | item_native_mod(_) { |
| 282 | ebmlivec::start_tag(ebml_w, tag_items_data_item); |
| 283 | encode_def_id(ebml_w, local_def(item.id)); |
Graydon Hoare | 59c441a | 2011-07-29 23:40:23 | [diff] [blame] | 284 | encode_family(ebml_w, 'n' as u8); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 285 | ebmlivec::end_tag(ebml_w); |
| 286 | } |
| 287 | item_ty(_, tps) { |
| 288 | ebmlivec::start_tag(ebml_w, tag_items_data_item); |
| 289 | encode_def_id(ebml_w, local_def(item.id)); |
Graydon Hoare | 59c441a | 2011-07-29 23:40:23 | [diff] [blame] | 290 | encode_family(ebml_w, 'y' as u8); |
| 291 | encode_type_param_kinds(ebml_w, tps); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 292 | encode_type(ecx, ebml_w, node_id_to_monotype(ecx.ccx.tcx, item.id)); |
| 293 | ebmlivec::end_tag(ebml_w); |
| 294 | } |
| 295 | item_tag(variants, tps) { |
| 296 | ebmlivec::start_tag(ebml_w, tag_items_data_item); |
| 297 | encode_def_id(ebml_w, local_def(item.id)); |
Graydon Hoare | 59c441a | 2011-07-29 23:40:23 | [diff] [blame] | 298 | encode_family(ebml_w, 't' as u8); |
| 299 | encode_type_param_kinds(ebml_w, tps); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 300 | encode_type(ecx, ebml_w, node_id_to_monotype(ecx.ccx.tcx, item.id)); |
| 301 | for v: variant in variants { |
| 302 | encode_variant_id(ebml_w, local_def(v.node.id)); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 303 | } |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 304 | ebmlivec::end_tag(ebml_w); |
| 305 | encode_tag_variant_info(ecx, ebml_w, item.id, variants, index, tps); |
| 306 | } |
| 307 | item_res(_, _, tps, ctor_id) { |
| 308 | let fn_ty = node_id_to_monotype(ecx.ccx.tcx, ctor_id); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 309 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 310 | ebmlivec::start_tag(ebml_w, tag_items_data_item); |
| 311 | encode_def_id(ebml_w, local_def(ctor_id)); |
Graydon Hoare | 59c441a | 2011-07-29 23:40:23 | [diff] [blame] | 312 | encode_family(ebml_w, 'y' as u8); |
| 313 | encode_type_param_kinds(ebml_w, tps); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 314 | encode_type(ecx, ebml_w, ty::ty_fn_ret(ecx.ccx.tcx, fn_ty)); |
| 315 | encode_symbol(ecx, ebml_w, item.id); |
| 316 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 317 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 318 | index += ~[{val: ctor_id, pos: ebml_w.writer.tell()}]; |
| 319 | ebmlivec::start_tag(ebml_w, tag_items_data_item); |
| 320 | encode_def_id(ebml_w, local_def(ctor_id)); |
Graydon Hoare | 59c441a | 2011-07-29 23:40:23 | [diff] [blame] | 321 | encode_family(ebml_w, 'f' as u8); |
| 322 | encode_type_param_kinds(ebml_w, tps); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 323 | encode_type(ecx, ebml_w, fn_ty); |
| 324 | encode_symbol(ecx, ebml_w, ctor_id); |
| 325 | ebmlivec::end_tag(ebml_w); |
| 326 | } |
| 327 | item_obj(_, tps, ctor_id) { |
| 328 | let fn_ty = node_id_to_monotype(ecx.ccx.tcx, ctor_id); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 329 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 330 | ebmlivec::start_tag(ebml_w, tag_items_data_item); |
| 331 | encode_def_id(ebml_w, local_def(item.id)); |
Graydon Hoare | 59c441a | 2011-07-29 23:40:23 | [diff] [blame] | 332 | encode_family(ebml_w, 'y' as u8); |
| 333 | encode_type_param_kinds(ebml_w, tps); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 334 | encode_type(ecx, ebml_w, ty::ty_fn_ret(ecx.ccx.tcx, fn_ty)); |
| 335 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 336 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 337 | index += ~[{val: ctor_id, pos: ebml_w.writer.tell()}]; |
| 338 | ebmlivec::start_tag(ebml_w, tag_items_data_item); |
| 339 | encode_def_id(ebml_w, local_def(ctor_id)); |
Graydon Hoare | 59c441a | 2011-07-29 23:40:23 | [diff] [blame] | 340 | encode_family(ebml_w, 'f' as u8); |
| 341 | encode_type_param_kinds(ebml_w, tps); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 342 | encode_type(ecx, ebml_w, fn_ty); |
| 343 | encode_symbol(ecx, ebml_w, ctor_id); |
| 344 | ebmlivec::end_tag(ebml_w); |
| 345 | } |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 346 | } |
| 347 | } |
| 348 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 349 | fn encode_info_for_native_item(ecx: &@encode_ctxt, ebml_w: &ebmlivec::writer, |
| 350 | nitem: &@native_item) { |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 351 | ebmlivec::start_tag(ebml_w, tag_items_data_item); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 352 | alt nitem.node { |
| 353 | native_item_ty. { |
| 354 | encode_def_id(ebml_w, local_def(nitem.id)); |
Graydon Hoare | 59c441a | 2011-07-29 23:40:23 | [diff] [blame] | 355 | encode_family(ebml_w, 'T' as u8); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 356 | encode_type(ecx, ebml_w, |
| 357 | ty::mk_native(ecx.ccx.tcx, local_def(nitem.id))); |
| 358 | } |
| 359 | native_item_fn(_, _, tps) { |
| 360 | encode_def_id(ebml_w, local_def(nitem.id)); |
Graydon Hoare | 59c441a | 2011-07-29 23:40:23 | [diff] [blame] | 361 | encode_family(ebml_w, 'F' as u8); |
| 362 | encode_type_param_kinds(ebml_w, tps); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 363 | encode_type(ecx, ebml_w, node_id_to_monotype(ecx.ccx.tcx, nitem.id)); |
| 364 | encode_symbol(ecx, ebml_w, nitem.id); |
| 365 | } |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 366 | } |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 367 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 368 | } |
| 369 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 370 | fn encode_info_for_items(ecx: &@encode_ctxt, ebml_w: &ebmlivec::writer) -> |
Erick Tryzelaar | 8b15045 | 2011-08-04 23:20:09 | [diff] [blame] | 371 | [entry[int]] { |
| 372 | let index: [entry[int]] = ~[]; |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 373 | ebmlivec::start_tag(ebml_w, tag_items_data); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 374 | for each kvp: @{key: node_id, val: middle::ast_map::ast_node} in |
| 375 | ecx.ccx.ast_map.items() { |
| 376 | alt kvp.val { |
| 377 | middle::ast_map::node_item(i) { |
| 378 | index += ~[{val: kvp.key, pos: ebml_w.writer.tell()}]; |
| 379 | encode_info_for_item(ecx, ebml_w, i, index); |
| 380 | } |
| 381 | middle::ast_map::node_native_item(i) { |
| 382 | index += ~[{val: kvp.key, pos: ebml_w.writer.tell()}]; |
| 383 | encode_info_for_native_item(ecx, ebml_w, i); |
| 384 | } |
| 385 | _ { } |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 386 | } |
| 387 | } |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 388 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 389 | ret index; |
| 390 | } |
| 391 | |
| 392 | |
| 393 | // Path and definition ID indexing |
| 394 | |
Erick Tryzelaar | 8b15045 | 2011-08-04 23:20:09 | [diff] [blame] | 395 | fn create_index[T](index: &[entry[T]], hash_fn: fn(&T) -> uint ) -> |
| 396 | [@[entry[T]]] { |
| 397 | let buckets: [@mutable [entry[T]]] = ~[]; |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 398 | for each i: uint in uint::range(0u, 256u) { buckets += ~[@mutable ~[]]; } |
| 399 | for elt: entry[T] in index { |
| 400 | let h = hash_fn(elt.val); |
| 401 | *buckets.(h % 256u) += ~[elt]; |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 402 | } |
Patrick Walton | 1a6419b | 2011-07-14 21:25:43 | [diff] [blame] | 403 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 404 | let buckets_frozen = ~[]; |
Erick Tryzelaar | 8b15045 | 2011-08-04 23:20:09 | [diff] [blame] | 405 | for bucket: @mutable [entry[T]] in buckets { |
Patrick Walton | 1a6419b | 2011-07-14 21:25:43 | [diff] [blame] | 406 | buckets_frozen += ~[@*bucket]; |
| 407 | } |
| 408 | ret buckets_frozen; |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 409 | } |
| 410 | |
Erick Tryzelaar | 8b15045 | 2011-08-04 23:20:09 | [diff] [blame] | 411 | fn encode_index[T](ebml_w: &ebmlivec::writer, buckets: &[@[entry[T]]], |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 412 | write_fn: fn(&ioivec::writer, &T) ) { |
| 413 | let writer = ioivec::new_writer_(ebml_w.writer); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 414 | ebmlivec::start_tag(ebml_w, tag_index); |
Erick Tryzelaar | 8b15045 | 2011-08-04 23:20:09 | [diff] [blame] | 415 | let bucket_locs: [uint] = ~[]; |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 416 | ebmlivec::start_tag(ebml_w, tag_index_buckets); |
Erick Tryzelaar | 8b15045 | 2011-08-04 23:20:09 | [diff] [blame] | 417 | for bucket: @[entry[T]] in buckets { |
Patrick Walton | 1a6419b | 2011-07-14 21:25:43 | [diff] [blame] | 418 | bucket_locs += ~[ebml_w.writer.tell()]; |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 419 | ebmlivec::start_tag(ebml_w, tag_index_buckets_bucket); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 420 | for elt: entry[T] in *bucket { |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 421 | ebmlivec::start_tag(ebml_w, tag_index_buckets_bucket_elt); |
Marijn Haverbeke | aea5377 | 2011-07-26 12:06:02 | [diff] [blame] | 422 | writer.write_be_uint(elt.pos, 4u); |
| 423 | write_fn(writer, elt.val); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 424 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 425 | } |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 426 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 427 | } |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 428 | ebmlivec::end_tag(ebml_w); |
| 429 | ebmlivec::start_tag(ebml_w, tag_index_table); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 430 | for pos: uint in bucket_locs { writer.write_be_uint(pos, 4u); } |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 431 | ebmlivec::end_tag(ebml_w); |
| 432 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 433 | } |
| 434 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 435 | fn write_str(writer: &ioivec::writer, s: &str) { writer.write_str(s); } |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 436 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 437 | fn write_int(writer: &ioivec::writer, n: &int) { |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 438 | writer.write_be_uint(n as uint, 4u); |
| 439 | } |
| 440 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 441 | fn encode_meta_item(ebml_w: &ebmlivec::writer, mi: &meta_item) { |
| 442 | alt mi.node { |
| 443 | meta_word(name) { |
| 444 | ebmlivec::start_tag(ebml_w, tag_meta_item_word); |
| 445 | ebmlivec::start_tag(ebml_w, tag_meta_item_name); |
Brian Anderson | 2e7e588 | 2011-08-11 23:36:20 | [diff] [blame^] | 446 | ebml_w.writer.write(str::bytes(name)); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 447 | ebmlivec::end_tag(ebml_w); |
| 448 | ebmlivec::end_tag(ebml_w); |
| 449 | } |
| 450 | meta_name_value(name, value) { |
| 451 | alt value.node { |
| 452 | lit_str(value, _) { |
| 453 | ebmlivec::start_tag(ebml_w, tag_meta_item_name_value); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 454 | ebmlivec::start_tag(ebml_w, tag_meta_item_name); |
Brian Anderson | 2e7e588 | 2011-08-11 23:36:20 | [diff] [blame^] | 455 | ebml_w.writer.write(str::bytes(name)); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 456 | ebmlivec::end_tag(ebml_w); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 457 | ebmlivec::start_tag(ebml_w, tag_meta_item_value); |
Brian Anderson | 2e7e588 | 2011-08-11 23:36:20 | [diff] [blame^] | 458 | ebml_w.writer.write(str::bytes(value)); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 459 | ebmlivec::end_tag(ebml_w); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 460 | ebmlivec::end_tag(ebml_w); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 461 | } |
| 462 | _ {/* FIXME (#611) */ } |
Brian Anderson | f53c4f7 | 2011-06-28 02:41:48 | [diff] [blame] | 463 | } |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 464 | } |
| 465 | meta_list(name, items) { |
| 466 | ebmlivec::start_tag(ebml_w, tag_meta_item_list); |
| 467 | ebmlivec::start_tag(ebml_w, tag_meta_item_name); |
Brian Anderson | 2e7e588 | 2011-08-11 23:36:20 | [diff] [blame^] | 468 | ebml_w.writer.write(str::bytes(name)); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 469 | ebmlivec::end_tag(ebml_w); |
| 470 | for inner_item: @meta_item in items { |
| 471 | encode_meta_item(ebml_w, *inner_item); |
| 472 | } |
| 473 | ebmlivec::end_tag(ebml_w); |
| 474 | } |
Brian Anderson | f53c4f7 | 2011-06-28 02:41:48 | [diff] [blame] | 475 | } |
Brian Anderson | f53c4f7 | 2011-06-28 02:41:48 | [diff] [blame] | 476 | } |
| 477 | |
Erick Tryzelaar | 8b15045 | 2011-08-04 23:20:09 | [diff] [blame] | 478 | fn encode_attributes(ebml_w: &ebmlivec::writer, attrs: &[attribute]) { |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 479 | ebmlivec::start_tag(ebml_w, tag_attributes); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 480 | for attr: attribute in attrs { |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 481 | ebmlivec::start_tag(ebml_w, tag_attribute); |
Brian Anderson | f53c4f7 | 2011-06-28 02:41:48 | [diff] [blame] | 482 | encode_meta_item(ebml_w, attr.node.value); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 483 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 484 | } |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 485 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | f53c4f7 | 2011-06-28 02:41:48 | [diff] [blame] | 486 | } |
| 487 | |
Graydon Hoare | c796a8f | 2011-06-29 22:11:20 | [diff] [blame] | 488 | // So there's a special crate attribute called 'link' which defines the |
| 489 | // metadata that Rust cares about for linking crates. This attribute requires |
Brian Anderson | 70a28dc | 2011-07-01 00:03:08 | [diff] [blame] | 490 | // 'name' and 'vers' items, so if the user didn't provide them we will throw |
Graydon Hoare | c796a8f | 2011-06-29 22:11:20 | [diff] [blame] | 491 | // them in anyway with default values. |
Erick Tryzelaar | 8b15045 | 2011-08-04 23:20:09 | [diff] [blame] | 492 | fn synthesize_crate_attrs(ecx: &@encode_ctxt, crate: &@crate) -> [attribute] { |
Brian Anderson | 29afe1a | 2011-06-29 21:17:23 | [diff] [blame] | 493 | |
Erick Tryzelaar | 8b15045 | 2011-08-04 23:20:09 | [diff] [blame] | 494 | fn synthesize_link_attr(ecx: &@encode_ctxt, items: &[@meta_item]) -> |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 495 | attribute { |
Brian Anderson | 29afe1a | 2011-06-29 21:17:23 | [diff] [blame] | 496 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 497 | assert (ecx.ccx.link_meta.name != ""); |
| 498 | assert (ecx.ccx.link_meta.vers != ""); |
Brian Anderson | 29afe1a | 2011-06-29 21:17:23 | [diff] [blame] | 499 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 500 | let name_item = |
| 501 | attr::mk_name_value_item_str("name", ecx.ccx.link_meta.name); |
| 502 | let vers_item = |
| 503 | attr::mk_name_value_item_str("vers", ecx.ccx.link_meta.vers); |
Brian Anderson | 29afe1a | 2011-06-29 21:17:23 | [diff] [blame] | 504 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 505 | let other_items = |
| 506 | { |
| 507 | let tmp = attr::remove_meta_items_by_name(items, "name"); |
| 508 | attr::remove_meta_items_by_name(tmp, "vers") |
| 509 | }; |
Brian Anderson | 29afe1a | 2011-06-29 21:17:23 | [diff] [blame] | 510 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 511 | let meta_items = ~[name_item, vers_item] + other_items; |
| 512 | let link_item = attr::mk_list_item("link", meta_items); |
Brian Anderson | 29afe1a | 2011-06-29 21:17:23 | [diff] [blame] | 513 | |
Brian Anderson | 70a28dc | 2011-07-01 00:03:08 | [diff] [blame] | 514 | ret attr::mk_attr(link_item); |
Brian Anderson | 29afe1a | 2011-06-29 21:17:23 | [diff] [blame] | 515 | } |
| 516 | |
Erick Tryzelaar | 8b15045 | 2011-08-04 23:20:09 | [diff] [blame] | 517 | let attrs: [attribute] = ~[]; |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 518 | let found_link_attr = false; |
| 519 | for attr: attribute in crate.node.attrs { |
| 520 | attrs += |
| 521 | if attr::get_attr_name(attr) != "link" { |
| 522 | ~[attr] |
| 523 | } else { |
| 524 | alt attr.node.value.node { |
| 525 | meta_list(n, l) { |
Brian Anderson | 29afe1a | 2011-06-29 21:17:23 | [diff] [blame] | 526 | found_link_attr = true; |
Patrick Walton | 1a6419b | 2011-07-14 21:25:43 | [diff] [blame] | 527 | ~[synthesize_link_attr(ecx, l)] |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 528 | } |
| 529 | _ { ~[attr] } |
Brian Anderson | 29afe1a | 2011-06-29 21:17:23 | [diff] [blame] | 530 | } |
Brian Anderson | 29afe1a | 2011-06-29 21:17:23 | [diff] [blame] | 531 | } |
Brian Anderson | 29afe1a | 2011-06-29 21:17:23 | [diff] [blame] | 532 | } |
| 533 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 534 | if !found_link_attr { attrs += ~[synthesize_link_attr(ecx, ~[])]; } |
Brian Anderson | 29afe1a | 2011-06-29 21:17:23 | [diff] [blame] | 535 | |
| 536 | ret attrs; |
| 537 | } |
| 538 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 539 | fn encode_crate_deps(ebml_w: &ebmlivec::writer, cstore: &cstore::cstore) { |
Brian Anderson | 3070439 | 2011-07-08 18:29:56 | [diff] [blame] | 540 | |
Erick Tryzelaar | 8b15045 | 2011-08-04 23:20:09 | [diff] [blame] | 541 | fn get_ordered_names(cstore: &cstore::cstore) -> [str] { |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 542 | type hashkv = @{key: crate_num, val: cstore::crate_metadata}; |
| 543 | type numname = {crate: crate_num, ident: str}; |
Brian Anderson | 3070439 | 2011-07-08 18:29:56 | [diff] [blame] | 544 | |
| 545 | // Pull the cnums and names out of cstore |
Erick Tryzelaar | 8b15045 | 2011-08-04 23:20:09 | [diff] [blame] | 546 | let pairs: [mutable numname] = ~[mutable]; |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 547 | for each hashkv: hashkv in cstore::iter_crate_data(cstore) { |
| 548 | pairs += ~[mutable {crate: hashkv.key, ident: hashkv.val.name}]; |
Brian Anderson | 3070439 | 2011-07-08 18:29:56 | [diff] [blame] | 549 | } |
| 550 | |
| 551 | // Sort by cnum |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 552 | fn lteq(kv1: &numname, kv2: &numname) -> bool { |
| 553 | kv1.crate <= kv2.crate |
| 554 | } |
Patrick Walton | 1a6419b | 2011-07-14 21:25:43 | [diff] [blame] | 555 | std::sort::ivector::quick_sort(lteq, pairs); |
Brian Anderson | 3070439 | 2011-07-08 18:29:56 | [diff] [blame] | 556 | |
| 557 | // Sanity-check the crate numbers |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 558 | let expected_cnum = 1; |
| 559 | for n: numname in pairs { |
| 560 | assert (n.crate == expected_cnum); |
Brian Anderson | 3070439 | 2011-07-08 18:29:56 | [diff] [blame] | 561 | expected_cnum += 1; |
| 562 | } |
| 563 | |
| 564 | // Return just the names |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 565 | fn name(kv: &numname) -> str { kv.ident } |
Patrick Walton | 1a6419b | 2011-07-14 21:25:43 | [diff] [blame] | 566 | // mutable -> immutable hack for ivec::map |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 567 | let immpairs = ivec::slice(pairs, 0u, ivec::len(pairs)); |
Patrick Walton | 1a6419b | 2011-07-14 21:25:43 | [diff] [blame] | 568 | ret ivec::map(name, immpairs); |
Brian Anderson | 3070439 | 2011-07-08 18:29:56 | [diff] [blame] | 569 | } |
| 570 | |
| 571 | // We're just going to write a list of crate names, with the assumption |
| 572 | // that they are numbered 1 to n. |
| 573 | // FIXME: This is not nearly enough to support correct versioning |
| 574 | // but is enough to get transitive crate dependencies working. |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 575 | ebmlivec::start_tag(ebml_w, tag_crate_deps); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 576 | for cname: str in get_ordered_names(cstore) { |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 577 | ebmlivec::start_tag(ebml_w, tag_crate_dep); |
Brian Anderson | 2e7e588 | 2011-08-11 23:36:20 | [diff] [blame^] | 578 | ebml_w.writer.write(str::bytes(cname)); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 579 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 3070439 | 2011-07-08 18:29:56 | [diff] [blame] | 580 | } |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 581 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 3070439 | 2011-07-08 18:29:56 | [diff] [blame] | 582 | } |
| 583 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 584 | fn encode_metadata(cx: &@crate_ctxt, crate: &@crate) -> str { |
Brian Anderson | d0a432f | 2011-07-08 06:55:41 | [diff] [blame] | 585 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 586 | let abbrevs = map::mk_hashmap(ty::hash_ty, ty::eq_ty); |
| 587 | let ecx = @{ccx: cx, type_abbrevs: abbrevs}; |
Brian Anderson | d0a432f | 2011-07-08 06:55:41 | [diff] [blame] | 588 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 589 | let string_w = ioivec::string_writer(); |
| 590 | let buf_w = string_w.get_writer().get_buf_writer(); |
| 591 | let ebml_w = ebmlivec::create_writer(buf_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 592 | |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 593 | let crate_attrs = synthesize_crate_attrs(ecx, crate); |
Brian Anderson | 29afe1a | 2011-06-29 21:17:23 | [diff] [blame] | 594 | encode_attributes(ebml_w, crate_attrs); |
Brian Anderson | 3070439 | 2011-07-08 18:29:56 | [diff] [blame] | 595 | |
| 596 | encode_crate_deps(ebml_w, cx.sess.get_cstore()); |
| 597 | |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 598 | // Encode and index the paths. |
| 599 | |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 600 | ebmlivec::start_tag(ebml_w, tag_paths); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 601 | let paths_index = encode_item_paths(ebml_w, crate); |
| 602 | let paths_buckets = create_index(paths_index, hash_path); |
Marijn Haverbeke | e949aab | 2011-07-25 13:07:48 | [diff] [blame] | 603 | encode_index(ebml_w, paths_buckets, write_str); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 604 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 605 | // Encode and index the items. |
| 606 | |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 607 | ebmlivec::start_tag(ebml_w, tag_items); |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 608 | let items_index = encode_info_for_items(ecx, ebml_w); |
| 609 | let items_buckets = create_index(items_index, hash_node_id); |
Marijn Haverbeke | e949aab | 2011-07-25 13:07:48 | [diff] [blame] | 610 | encode_index(ebml_w, items_buckets, write_int); |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 611 | ebmlivec::end_tag(ebml_w); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 612 | // Pad this, since something (LLVM, presumably) is cutting off the |
Brian Anderson | 2e7e588 | 2011-08-11 23:36:20 | [diff] [blame^] | 613 | // remaining % 4 bytes. |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 614 | |
Patrick Walton | be489ee | 2011-07-12 17:59:18 | [diff] [blame] | 615 | buf_w.write(~[0u8, 0u8, 0u8, 0u8]); |
Brian Anderson | 33294c7 | 2011-06-27 22:20:17 | [diff] [blame] | 616 | ret string_w.get_str(); |
| 617 | } |
Brian Anderson | 894e222 | 2011-06-28 02:16:16 | [diff] [blame] | 618 | |
Brian Anderson | 7d26d1d | 2011-07-07 19:47:39 | [diff] [blame] | 619 | // Get the encoded string for a type |
Marijn Haverbeke | df7f21d | 2011-07-27 12:19:39 | [diff] [blame] | 620 | fn encoded_ty(tcx: &ty::ctxt, t: &ty::t) -> str { |
| 621 | let cx = @{ds: def_to_str, tcx: tcx, abbrevs: tyencode::ac_no_abbrevs}; |
| 622 | let sw = ioivec::string_writer(); |
Brian Anderson | 7d26d1d | 2011-07-07 19:47:39 | [diff] [blame] | 623 | tyencode::enc_ty(sw.get_writer(), cx, t); |
| 624 | ret sw.get_str(); |
| 625 | } |
| 626 | |
Brian Anderson | 894e222 | 2011-06-28 02:16:16 | [diff] [blame] | 627 | |
| 628 | // Local Variables: |
| 629 | // mode: rust |
| 630 | // fill-column: 78; |
| 631 | // indent-tabs-mode: nil |
| 632 | // c-basic-offset: 4 |
| 633 | // buffer-file-coding-system: utf-8-unix |
| 634 | // compile-command: "make -k -C $RBUILD 2>&1 | sed -e 's/\\/x\\//x:\\//g'"; |
| 635 | // End: |