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