blob: 154f623eacb5dbed1a3c16187c5e56fe85fbc9de [file] [log] [blame]
Brian Anderson45efb1f2011-06-27 23:03:011// Metadata encoding
2
Graydon Hoarea4815b62011-09-12 23:13:283import std::{vec, str, uint, io, option, ebml, map};
4import std::option::{some, none};
Marijn Haverbeke6fd6fde2011-07-05 09:48:195import syntax::ast::*;
Brian Anderson152cbaa2011-08-22 04:44:416import syntax::ast_util;
7import syntax::ast_util::local_def;
Brian Andersone29ef1b2011-07-07 19:22:398import common::*;
Michael Sullivan3b2d23b2011-07-22 00:27:349import middle::trans_common::crate_ctxt;
Brian Anderson33294c72011-06-27 22:20:1710import middle::ty;
Brian Andersond2362592011-07-07 17:10:1011import middle::ty::node_id_to_monotype;
Brian Anderson5de916d2011-06-30 06:42:3512import front::attr;
Brian Anderson33294c72011-06-27 22:20:1713
Brian Anderson33294c72011-06-27 22:20:1714export encode_metadata;
Brian Anderson6ee1ffe2011-07-07 19:56:0115export encoded_ty;
Brian Anderson33294c72011-06-27 22:20:1716
Erick Tryzelaare4a0f992011-08-12 14:15:1817type abbrev_map = map::hashmap<ty::t, tyencode::ty_abbrev>;
Brian Andersond0a432f2011-07-08 06:55:4118
Marijn Haverbekedf7f21d2011-07-27 12:19:3919type encode_ctxt = {ccx: @crate_ctxt, type_abbrevs: abbrev_map};
Brian Andersond0a432f2011-07-08 06:55:4120
Brian Anderson33294c72011-06-27 22:20:1721// Path table encoding
Marijn Haverbekefc6b7c82011-09-12 09:27:3022fn encode_name(ebml_w: ebml::writer, name: str) {
Brian Anderson0fed5392011-08-12 05:58:1423 ebml::start_tag(ebml_w, tag_paths_data_name);
Brian Andersonab6bb032011-09-02 00:27:5824 ebml_w.writer.write(str::bytes(name));
Brian Anderson0fed5392011-08-12 05:58:1425 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:1726}
27
Marijn Haverbekefc6b7c82011-09-12 09:27:3028fn encode_def_id(ebml_w: ebml::writer, id: def_id) {
Brian Anderson0fed5392011-08-12 05:58:1429 ebml::start_tag(ebml_w, tag_def_id);
Brian Andersonab6bb032011-09-02 00:27:5830 ebml_w.writer.write(str::bytes(def_to_str(id)));
Brian Anderson0fed5392011-08-12 05:58:1431 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:1732}
33
Erick Tryzelaar4abc4712011-08-12 13:36:5134type entry<T> = {val: T, pos: uint};
Marijn Haverbekeaea53772011-07-26 12:06:0235
Marijn Haverbekefc6b7c82011-09-12 09:27:3036fn encode_tag_variant_paths(ebml_w: ebml::writer, variants: [variant],
Marijn Haverbekeca1df2b2011-09-12 10:39:3837 path: [str], &index: [entry<str>]) {
Lindsey Kuperf91351a2011-08-16 04:54:5238 for variant: variant in variants {
Brian Anderson03119fe2011-08-26 00:00:1239 add_to_index(ebml_w, path, index, variant.node.name);
Brian Anderson0fed5392011-08-12 05:58:1440 ebml::start_tag(ebml_w, tag_paths_data_item);
Brian Anderson03119fe2011-08-26 00:00:1241 encode_name(ebml_w, variant.node.name);
Brian Anderson33294c72011-06-27 22:20:1742 encode_def_id(ebml_w, local_def(variant.node.id));
Brian Anderson0fed5392011-08-12 05:58:1443 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:1744 }
45}
46
Marijn Haverbekeca1df2b2011-09-12 10:39:3847fn add_to_index(ebml_w: ebml::writer, path: [str], &index: [entry<str>],
48 name: str) {
Brian Anderson518dc522011-08-19 22:16:4849 let full_path = path + [name];
Marijn Haverbekedf7f21d2011-07-27 12:19:3950 index +=
Brian Anderson5c49e4f2011-09-02 22:34:5851 [{val: str::connect(full_path, "::"), pos: ebml_w.writer.tell()}];
Brian Anderson33294c72011-06-27 22:20:1752}
53
Marijn Haverbekefc6b7c82011-09-12 09:27:3054fn encode_native_module_item_paths(ebml_w: ebml::writer, nmod: native_mod,
Marijn Haverbekeca1df2b2011-09-12 10:39:3855 path: [str], &index: [entry<str>]) {
Lindsey Kuperf91351a2011-08-16 04:54:5256 for nitem: @native_item in nmod.items {
Brian Anderson03119fe2011-08-26 00:00:1257 add_to_index(ebml_w, path, index, nitem.ident);
Brian Anderson0fed5392011-08-12 05:58:1458 ebml::start_tag(ebml_w, tag_paths_data_item);
Brian Anderson03119fe2011-08-26 00:00:1259 encode_name(ebml_w, nitem.ident);
Brian Anderson33294c72011-06-27 22:20:1760 encode_def_id(ebml_w, local_def(nitem.id));
Brian Anderson0fed5392011-08-12 05:58:1461 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:1762 }
63}
64
Marijn Haverbekefc6b7c82011-09-12 09:27:3065fn encode_module_item_paths(ebml_w: ebml::writer, module: _mod, path: [str],
Marijn Haverbekeca1df2b2011-09-12 10:39:3866 &index: [entry<str>]) {
Lindsey Kuperf91351a2011-08-16 04:54:5267 for it: @item in module.items {
Brian Anderson152cbaa2011-08-22 04:44:4168 if !ast_util::is_exported(it.ident, module) { cont; }
Marijn Haverbekedf7f21d2011-07-27 12:19:3969 alt it.node {
70 item_const(_, _) {
Brian Anderson03119fe2011-08-26 00:00:1271 add_to_index(ebml_w, path, index, it.ident);
Brian Anderson0fed5392011-08-12 05:58:1472 ebml::start_tag(ebml_w, tag_paths_data_item);
Brian Anderson03119fe2011-08-26 00:00:1273 encode_name(ebml_w, it.ident);
Marijn Haverbekedf7f21d2011-07-27 12:19:3974 encode_def_id(ebml_w, local_def(it.id));
Brian Anderson0fed5392011-08-12 05:58:1475 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:3976 }
Patrick Walton59e9b622011-08-05 18:38:0677 item_fn(_, tps) {
Brian Anderson03119fe2011-08-26 00:00:1278 add_to_index(ebml_w, path, index, it.ident);
Brian Anderson0fed5392011-08-12 05:58:1479 ebml::start_tag(ebml_w, tag_paths_data_item);
Brian Anderson03119fe2011-08-26 00:00:1280 encode_name(ebml_w, it.ident);
Marijn Haverbekedf7f21d2011-07-27 12:19:3981 encode_def_id(ebml_w, local_def(it.id));
Brian Anderson0fed5392011-08-12 05:58:1482 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:3983 }
84 item_mod(_mod) {
Brian Anderson03119fe2011-08-26 00:00:1285 add_to_index(ebml_w, path, index, it.ident);
Brian Anderson0fed5392011-08-12 05:58:1486 ebml::start_tag(ebml_w, tag_paths_data_mod);
Brian Anderson03119fe2011-08-26 00:00:1287 encode_name(ebml_w, it.ident);
Marijn Haverbekedf7f21d2011-07-27 12:19:3988 encode_def_id(ebml_w, local_def(it.id));
Brian Anderson5c49e4f2011-09-02 22:34:5889 encode_module_item_paths(ebml_w, _mod, path + [it.ident], index);
Brian Anderson0fed5392011-08-12 05:58:1490 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:3991 }
92 item_native_mod(nmod) {
Brian Anderson03119fe2011-08-26 00:00:1293 add_to_index(ebml_w, path, index, it.ident);
Brian Anderson0fed5392011-08-12 05:58:1494 ebml::start_tag(ebml_w, tag_paths_data_mod);
Brian Anderson03119fe2011-08-26 00:00:1295 encode_name(ebml_w, it.ident);
Marijn Haverbekedf7f21d2011-07-27 12:19:3996 encode_def_id(ebml_w, local_def(it.id));
Brian Anderson5c49e4f2011-09-02 22:34:5897 encode_native_module_item_paths(ebml_w, nmod, path + [it.ident],
98 index);
Brian Anderson0fed5392011-08-12 05:58:1499 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39100 }
101 item_ty(_, tps) {
Brian Anderson03119fe2011-08-26 00:00:12102 add_to_index(ebml_w, path, index, it.ident);
Brian Anderson0fed5392011-08-12 05:58:14103 ebml::start_tag(ebml_w, tag_paths_data_item);
Brian Anderson03119fe2011-08-26 00:00:12104 encode_name(ebml_w, it.ident);
Marijn Haverbekedf7f21d2011-07-27 12:19:39105 encode_def_id(ebml_w, local_def(it.id));
Brian Anderson0fed5392011-08-12 05:58:14106 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39107 }
108 item_res(_, _, tps, ctor_id) {
Brian Anderson03119fe2011-08-26 00:00:12109 add_to_index(ebml_w, path, index, it.ident);
Brian Anderson0fed5392011-08-12 05:58:14110 ebml::start_tag(ebml_w, tag_paths_data_item);
Brian Anderson03119fe2011-08-26 00:00:12111 encode_name(ebml_w, it.ident);
Marijn Haverbekedf7f21d2011-07-27 12:19:39112 encode_def_id(ebml_w, local_def(ctor_id));
Brian Anderson0fed5392011-08-12 05:58:14113 ebml::end_tag(ebml_w);
Brian Anderson03119fe2011-08-26 00:00:12114 add_to_index(ebml_w, path, index, it.ident);
Brian Anderson0fed5392011-08-12 05:58:14115 ebml::start_tag(ebml_w, tag_paths_data_item);
Brian Anderson03119fe2011-08-26 00:00:12116 encode_name(ebml_w, it.ident);
Marijn Haverbekedf7f21d2011-07-27 12:19:39117 encode_def_id(ebml_w, local_def(it.id));
Brian Anderson0fed5392011-08-12 05:58:14118 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39119 }
120 item_tag(variants, tps) {
Brian Anderson03119fe2011-08-26 00:00:12121 add_to_index(ebml_w, path, index, it.ident);
Brian Anderson0fed5392011-08-12 05:58:14122 ebml::start_tag(ebml_w, tag_paths_data_item);
Brian Anderson03119fe2011-08-26 00:00:12123 encode_name(ebml_w, it.ident);
Marijn Haverbekedf7f21d2011-07-27 12:19:39124 encode_def_id(ebml_w, local_def(it.id));
Brian Anderson0fed5392011-08-12 05:58:14125 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39126 encode_tag_variant_paths(ebml_w, variants, path, index);
127 }
128 item_obj(_, tps, ctor_id) {
Brian Anderson03119fe2011-08-26 00:00:12129 add_to_index(ebml_w, path, index, it.ident);
Brian Anderson0fed5392011-08-12 05:58:14130 ebml::start_tag(ebml_w, tag_paths_data_item);
Brian Anderson03119fe2011-08-26 00:00:12131 encode_name(ebml_w, it.ident);
Marijn Haverbekedf7f21d2011-07-27 12:19:39132 encode_def_id(ebml_w, local_def(ctor_id));
Brian Anderson0fed5392011-08-12 05:58:14133 ebml::end_tag(ebml_w);
Brian Anderson03119fe2011-08-26 00:00:12134 add_to_index(ebml_w, path, index, it.ident);
Brian Anderson0fed5392011-08-12 05:58:14135 ebml::start_tag(ebml_w, tag_paths_data_item);
Brian Anderson03119fe2011-08-26 00:00:12136 encode_name(ebml_w, it.ident);
Marijn Haverbekedf7f21d2011-07-27 12:19:39137 encode_def_id(ebml_w, local_def(it.id));
Brian Anderson0fed5392011-08-12 05:58:14138 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39139 }
Brian Anderson33294c72011-06-27 22:20:17140 }
141 }
142}
143
Marijn Haverbekefc6b7c82011-09-12 09:27:30144fn encode_item_paths(ebml_w: ebml::writer, crate: @crate) -> [entry<str>] {
Brian Anderson5c49e4f2011-09-02 22:34:58145 let index: [entry<str>] = [];
146 let path: [str] = [];
Brian Anderson0fed5392011-08-12 05:58:14147 ebml::start_tag(ebml_w, tag_paths);
Brian Anderson33294c72011-06-27 22:20:17148 encode_module_item_paths(ebml_w, crate.node.module, path, index);
Brian Anderson0fed5392011-08-12 05:58:14149 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17150 ret index;
151}
152
153
154// Item info table encoding
Marijn Haverbekefc6b7c82011-09-12 09:27:30155fn encode_family(ebml_w: ebml::writer, c: u8) {
Brian Anderson0fed5392011-08-12 05:58:14156 ebml::start_tag(ebml_w, tag_items_data_item_family);
Brian Anderson518dc522011-08-19 22:16:48157 ebml_w.writer.write([c]);
Brian Anderson0fed5392011-08-12 05:58:14158 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17159}
160
Marijn Haverbekefc6b7c82011-09-12 09:27:30161fn encode_inlineness(ebml_w: ebml::writer, c: u8) {
Brian Anderson0fed5392011-08-12 05:58:14162 ebml::start_tag(ebml_w, tag_items_data_item_inlineness);
Brian Anderson518dc522011-08-19 22:16:48163 ebml_w.writer.write([c]);
Brian Anderson0fed5392011-08-12 05:58:14164 ebml::end_tag(ebml_w);
Patrick Waltonb079e1a2011-08-05 20:58:33165}
166
Marijn Haverbekefc6b7c82011-09-12 09:27:30167fn def_to_str(did: def_id) -> str { ret #fmt["%d:%d", did.crate, did.node]; }
Brian Anderson33294c72011-06-27 22:20:17168
Marijn Haverbekefc6b7c82011-09-12 09:27:30169fn encode_type_param_kinds(ebml_w: ebml::writer, tps: [ty_param]) {
Brian Anderson0fed5392011-08-12 05:58:14170 ebml::start_tag(ebml_w, tag_items_data_item_ty_param_kinds);
Erick Tryzelaaraf21a272011-08-13 07:09:25171 ebml::write_vint(ebml_w.writer, vec::len::<ty_param>(tps));
Graydon Hoare59c441a2011-07-29 23:40:23172 for tp: ty_param in tps {
Brian Anderson518dc522011-08-19 22:16:48173 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 Hoare59c441a2011-07-29 23:40:23180 }
Brian Anderson0fed5392011-08-12 05:58:14181 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17182}
183
Marijn Haverbekefc6b7c82011-09-12 09:27:30184fn encode_variant_id(ebml_w: ebml::writer, vid: def_id) {
Brian Anderson0fed5392011-08-12 05:58:14185 ebml::start_tag(ebml_w, tag_items_data_item_variant);
Brian Andersonab6bb032011-09-02 00:27:58186 ebml_w.writer.write(str::bytes(def_to_str(vid)));
Brian Anderson0fed5392011-08-12 05:58:14187 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17188}
189
Marijn Haverbekefc6b7c82011-09-12 09:27:30190fn encode_type(ecx: @encode_ctxt, ebml_w: ebml::writer, typ: ty::t) {
Brian Anderson0fed5392011-08-12 05:58:14191 ebml::start_tag(ebml_w, tag_items_data_item_type);
Marijn Haverbekedf7f21d2011-07-27 12:19:39192 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 Anderson18576e52011-08-24 01:09:30197 tyencode::enc_ty(io::new_writer(ebml_w.writer), ty_str_ctxt, typ);
Brian Anderson0fed5392011-08-12 05:58:14198 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17199}
200
Marijn Haverbekefc6b7c82011-09-12 09:27:30201fn encode_symbol(ecx: @encode_ctxt, ebml_w: ebml::writer, id: node_id) {
Brian Anderson0fed5392011-08-12 05:58:14202 ebml::start_tag(ebml_w, tag_items_data_item_symbol);
Brian Andersonab6bb032011-09-02 00:27:58203 ebml_w.writer.write(str::bytes(ecx.ccx.item_symbols.get(id)));
Brian Anderson0fed5392011-08-12 05:58:14204 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17205}
206
Marijn Haverbekefc6b7c82011-09-12 09:27:30207fn encode_discriminant(ecx: @encode_ctxt, ebml_w: ebml::writer, id: node_id) {
Brian Anderson0fed5392011-08-12 05:58:14208 ebml::start_tag(ebml_w, tag_items_data_item_symbol);
Brian Andersonab6bb032011-09-02 00:27:58209 ebml_w.writer.write(str::bytes(ecx.ccx.discrim_symbols.get(id)));
Brian Anderson0fed5392011-08-12 05:58:14210 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17211}
212
Marijn Haverbekefc6b7c82011-09-12 09:27:30213fn encode_tag_id(ebml_w: ebml::writer, id: def_id) {
Brian Anderson0fed5392011-08-12 05:58:14214 ebml::start_tag(ebml_w, tag_items_data_item_tag_id);
Brian Andersonab6bb032011-09-02 00:27:58215 ebml_w.writer.write(str::bytes(def_to_str(id)));
Brian Anderson0fed5392011-08-12 05:58:14216 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17217}
218
Marijn Haverbekefc6b7c82011-09-12 09:27:30219fn encode_tag_variant_info(ecx: @encode_ctxt, ebml_w: ebml::writer,
220 id: node_id, variants: [variant],
Marijn Haverbekeca1df2b2011-09-12 10:39:38221 &index: [entry<int>], ty_params: [ty_param]) {
Lindsey Kuperf91351a2011-08-16 04:54:52222 for variant: variant in variants {
Brian Anderson518dc522011-08-19 22:16:48223 index += [{val: variant.node.id, pos: ebml_w.writer.tell()}];
Brian Anderson0fed5392011-08-12 05:58:14224 ebml::start_tag(ebml_w, tag_items_data_item);
Brian Anderson33294c72011-06-27 22:20:17225 encode_def_id(ebml_w, local_def(variant.node.id));
Graydon Hoare59c441a2011-07-29 23:40:23226 encode_family(ebml_w, 'v' as u8);
Brian Anderson33294c72011-06-27 22:20:17227 encode_tag_id(ebml_w, local_def(id));
Brian Andersond0a432f2011-07-08 06:55:41228 encode_type(ecx, ebml_w,
229 node_id_to_monotype(ecx.ccx.tcx, variant.node.id));
Erick Tryzelaaraf21a272011-08-13 07:09:25230 if vec::len::<variant_arg>(variant.node.args) > 0u {
Brian Andersond0a432f2011-07-08 06:55:41231 encode_symbol(ecx, ebml_w, variant.node.id);
Brian Anderson33294c72011-06-27 22:20:17232 }
Brian Andersond0a432f2011-07-08 06:55:41233 encode_discriminant(ecx, ebml_w, variant.node.id);
Graydon Hoare59c441a2011-07-29 23:40:23234 encode_type_param_kinds(ebml_w, ty_params);
Brian Anderson0fed5392011-08-12 05:58:14235 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17236 }
237}
238
Marijn Haverbekefc6b7c82011-09-12 09:27:30239fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item,
Marijn Haverbekeca1df2b2011-09-12 10:39:38240 &index: [entry<int>]) {
Marijn Haverbekedf7f21d2011-07-27 12:19:39241 alt item.node {
242 item_const(_, _) {
Brian Anderson0fed5392011-08-12 05:58:14243 ebml::start_tag(ebml_w, tag_items_data_item);
Marijn Haverbekedf7f21d2011-07-27 12:19:39244 encode_def_id(ebml_w, local_def(item.id));
Graydon Hoare59c441a2011-07-29 23:40:23245 encode_family(ebml_w, 'c' as u8);
Marijn Haverbekedf7f21d2011-07-27 12:19:39246 encode_type(ecx, ebml_w, node_id_to_monotype(ecx.ccx.tcx, item.id));
247 encode_symbol(ecx, ebml_w, item.id);
Brian Anderson0fed5392011-08-12 05:58:14248 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39249 }
Patrick Walton59e9b622011-08-05 18:38:06250 item_fn(fd, tps) {
Brian Anderson0fed5392011-08-12 05:58:14251 ebml::start_tag(ebml_w, tag_items_data_item);
Marijn Haverbekedf7f21d2011-07-27 12:19:39252 encode_def_id(ebml_w, local_def(item.id));
Graydon Hoare59c441a2011-07-29 23:40:23253 encode_family(ebml_w,
Brian Anderson518dc522011-08-19 22:16:48254 alt fd.decl.purity {
255 pure_fn. { 'p' }
256 impure_fn. { 'f' }
257 } as u8);
Patrick Waltonb079e1a2011-08-05 20:58:33258 encode_inlineness(ebml_w,
259 alt fd.decl.il {
260 il_normal. { 'n' }
261 il_inline. { 'i' }
262 } as u8);
Graydon Hoare59c441a2011-07-29 23:40:23263 encode_type_param_kinds(ebml_w, tps);
Marijn Haverbekedf7f21d2011-07-27 12:19:39264 encode_type(ecx, ebml_w, node_id_to_monotype(ecx.ccx.tcx, item.id));
265 encode_symbol(ecx, ebml_w, item.id);
Brian Anderson0fed5392011-08-12 05:58:14266 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39267 }
268 item_mod(_) {
Brian Anderson0fed5392011-08-12 05:58:14269 ebml::start_tag(ebml_w, tag_items_data_item);
Marijn Haverbekedf7f21d2011-07-27 12:19:39270 encode_def_id(ebml_w, local_def(item.id));
Graydon Hoare59c441a2011-07-29 23:40:23271 encode_family(ebml_w, 'm' as u8);
Brian Anderson0fed5392011-08-12 05:58:14272 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39273 }
274 item_native_mod(_) {
Brian Anderson0fed5392011-08-12 05:58:14275 ebml::start_tag(ebml_w, tag_items_data_item);
Marijn Haverbekedf7f21d2011-07-27 12:19:39276 encode_def_id(ebml_w, local_def(item.id));
Graydon Hoare59c441a2011-07-29 23:40:23277 encode_family(ebml_w, 'n' as u8);
Brian Anderson0fed5392011-08-12 05:58:14278 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39279 }
280 item_ty(_, tps) {
Brian Anderson0fed5392011-08-12 05:58:14281 ebml::start_tag(ebml_w, tag_items_data_item);
Marijn Haverbekedf7f21d2011-07-27 12:19:39282 encode_def_id(ebml_w, local_def(item.id));
Graydon Hoare59c441a2011-07-29 23:40:23283 encode_family(ebml_w, 'y' as u8);
284 encode_type_param_kinds(ebml_w, tps);
Marijn Haverbekedf7f21d2011-07-27 12:19:39285 encode_type(ecx, ebml_w, node_id_to_monotype(ecx.ccx.tcx, item.id));
Brian Anderson0fed5392011-08-12 05:58:14286 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39287 }
288 item_tag(variants, tps) {
Brian Anderson0fed5392011-08-12 05:58:14289 ebml::start_tag(ebml_w, tag_items_data_item);
Marijn Haverbekedf7f21d2011-07-27 12:19:39290 encode_def_id(ebml_w, local_def(item.id));
Graydon Hoare59c441a2011-07-29 23:40:23291 encode_family(ebml_w, 't' as u8);
292 encode_type_param_kinds(ebml_w, tps);
Marijn Haverbekedf7f21d2011-07-27 12:19:39293 encode_type(ecx, ebml_w, node_id_to_monotype(ecx.ccx.tcx, item.id));
Lindsey Kuperf91351a2011-08-16 04:54:52294 for v: variant in variants {
Marijn Haverbekedf7f21d2011-07-27 12:19:39295 encode_variant_id(ebml_w, local_def(v.node.id));
Brian Anderson33294c72011-06-27 22:20:17296 }
Brian Anderson0fed5392011-08-12 05:58:14297 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39298 encode_tag_variant_info(ecx, ebml_w, item.id, variants, index, tps);
299 }
300 item_res(_, _, tps, ctor_id) {
301 let fn_ty = node_id_to_monotype(ecx.ccx.tcx, ctor_id);
Brian Anderson33294c72011-06-27 22:20:17302
Brian Anderson0fed5392011-08-12 05:58:14303 ebml::start_tag(ebml_w, tag_items_data_item);
Marijn Haverbekedf7f21d2011-07-27 12:19:39304 encode_def_id(ebml_w, local_def(ctor_id));
Graydon Hoare59c441a2011-07-29 23:40:23305 encode_family(ebml_w, 'y' as u8);
306 encode_type_param_kinds(ebml_w, tps);
Marijn Haverbekedf7f21d2011-07-27 12:19:39307 encode_type(ecx, ebml_w, ty::ty_fn_ret(ecx.ccx.tcx, fn_ty));
308 encode_symbol(ecx, ebml_w, item.id);
Brian Anderson0fed5392011-08-12 05:58:14309 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17310
Brian Anderson518dc522011-08-19 22:16:48311 index += [{val: ctor_id, pos: ebml_w.writer.tell()}];
Brian Anderson0fed5392011-08-12 05:58:14312 ebml::start_tag(ebml_w, tag_items_data_item);
Marijn Haverbekedf7f21d2011-07-27 12:19:39313 encode_def_id(ebml_w, local_def(ctor_id));
Graydon Hoare59c441a2011-07-29 23:40:23314 encode_family(ebml_w, 'f' as u8);
315 encode_type_param_kinds(ebml_w, tps);
Marijn Haverbekedf7f21d2011-07-27 12:19:39316 encode_type(ecx, ebml_w, fn_ty);
317 encode_symbol(ecx, ebml_w, ctor_id);
Brian Anderson0fed5392011-08-12 05:58:14318 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39319 }
320 item_obj(_, tps, ctor_id) {
321 let fn_ty = node_id_to_monotype(ecx.ccx.tcx, ctor_id);
Brian Anderson33294c72011-06-27 22:20:17322
Brian Anderson0fed5392011-08-12 05:58:14323 ebml::start_tag(ebml_w, tag_items_data_item);
Marijn Haverbekedf7f21d2011-07-27 12:19:39324 encode_def_id(ebml_w, local_def(item.id));
Graydon Hoare59c441a2011-07-29 23:40:23325 encode_family(ebml_w, 'y' as u8);
326 encode_type_param_kinds(ebml_w, tps);
Marijn Haverbekedf7f21d2011-07-27 12:19:39327 encode_type(ecx, ebml_w, ty::ty_fn_ret(ecx.ccx.tcx, fn_ty));
Brian Anderson0fed5392011-08-12 05:58:14328 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17329
Brian Anderson518dc522011-08-19 22:16:48330 index += [{val: ctor_id, pos: ebml_w.writer.tell()}];
Brian Anderson0fed5392011-08-12 05:58:14331 ebml::start_tag(ebml_w, tag_items_data_item);
Marijn Haverbekedf7f21d2011-07-27 12:19:39332 encode_def_id(ebml_w, local_def(ctor_id));
Graydon Hoare59c441a2011-07-29 23:40:23333 encode_family(ebml_w, 'f' as u8);
334 encode_type_param_kinds(ebml_w, tps);
Marijn Haverbekedf7f21d2011-07-27 12:19:39335 encode_type(ecx, ebml_w, fn_ty);
336 encode_symbol(ecx, ebml_w, ctor_id);
Brian Anderson0fed5392011-08-12 05:58:14337 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39338 }
Brian Anderson33294c72011-06-27 22:20:17339 }
340}
341
Marijn Haverbekefc6b7c82011-09-12 09:27:30342fn encode_info_for_native_item(ecx: @encode_ctxt, ebml_w: ebml::writer,
343 nitem: @native_item) {
Brian Anderson0fed5392011-08-12 05:58:14344 ebml::start_tag(ebml_w, tag_items_data_item);
Marijn Haverbekedf7f21d2011-07-27 12:19:39345 alt nitem.node {
346 native_item_ty. {
347 encode_def_id(ebml_w, local_def(nitem.id));
Graydon Hoare59c441a2011-07-29 23:40:23348 encode_family(ebml_w, 'T' as u8);
Marijn Haverbekedf7f21d2011-07-27 12:19:39349 encode_type(ecx, ebml_w,
350 ty::mk_native(ecx.ccx.tcx, local_def(nitem.id)));
351 }
352 native_item_fn(_, _, tps) {
353 encode_def_id(ebml_w, local_def(nitem.id));
Graydon Hoare59c441a2011-07-29 23:40:23354 encode_family(ebml_w, 'F' as u8);
355 encode_type_param_kinds(ebml_w, tps);
Marijn Haverbekedf7f21d2011-07-27 12:19:39356 encode_type(ecx, ebml_w, node_id_to_monotype(ecx.ccx.tcx, nitem.id));
357 encode_symbol(ecx, ebml_w, nitem.id);
358 }
Brian Anderson33294c72011-06-27 22:20:17359 }
Brian Anderson0fed5392011-08-12 05:58:14360 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17361}
362
Marijn Haverbekefc6b7c82011-09-12 09:27:30363fn encode_info_for_items(ecx: @encode_ctxt, ebml_w: ebml::writer) ->
Erick Tryzelaare4a0f992011-08-12 14:15:18364 [entry<int>] {
Brian Anderson518dc522011-08-19 22:16:48365 let index: [entry<int>] = [];
Brian Anderson0fed5392011-08-12 05:58:14366 ebml::start_tag(ebml_w, tag_items_data);
Brian Anderson518dc522011-08-19 22:16:48367 for each kvp: @{key: node_id, val: middle::ast_map::ast_node} in
Marijn Haverbekedf7f21d2011-07-27 12:19:39368 ecx.ccx.ast_map.items() {
369 alt kvp.val {
370 middle::ast_map::node_item(i) {
Brian Anderson518dc522011-08-19 22:16:48371 index += [{val: kvp.key, pos: ebml_w.writer.tell()}];
Marijn Haverbekedf7f21d2011-07-27 12:19:39372 encode_info_for_item(ecx, ebml_w, i, index);
373 }
374 middle::ast_map::node_native_item(i) {
Brian Anderson518dc522011-08-19 22:16:48375 index += [{val: kvp.key, pos: ebml_w.writer.tell()}];
Marijn Haverbekedf7f21d2011-07-27 12:19:39376 encode_info_for_native_item(ecx, ebml_w, i);
377 }
378 _ { }
Brian Anderson33294c72011-06-27 22:20:17379 }
380 }
Brian Anderson0fed5392011-08-12 05:58:14381 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17382 ret index;
383}
384
385
386// Path and definition ID indexing
387
Marijn Haverbekefc6b7c82011-09-12 09:27:30388fn create_index<T>(index: [entry<T>], hash_fn: fn(T) -> uint) ->
Erick Tryzelaare4a0f992011-08-12 14:15:18389 [@[entry<T>]] {
Brian Anderson518dc522011-08-19 22:16:48390 let buckets: [@mutable [entry<T>]] = [];
391 for each i: uint in uint::range(0u, 256u) { buckets += [@mutable []]; }
Erick Tryzelaare4a0f992011-08-12 14:15:18392 for elt: entry<T> in index {
Marijn Haverbekedf7f21d2011-07-27 12:19:39393 let h = hash_fn(elt.val);
Brian Anderson518dc522011-08-19 22:16:48394 *buckets[h % 256u] += [elt];
Brian Anderson33294c72011-06-27 22:20:17395 }
Patrick Walton1a6419b2011-07-14 21:25:43396
Brian Anderson518dc522011-08-19 22:16:48397 let buckets_frozen = [];
Erick Tryzelaare4a0f992011-08-12 14:15:18398 for bucket: @mutable [entry<T>] in buckets {
Brian Anderson518dc522011-08-19 22:16:48399 buckets_frozen += [@*bucket];
Patrick Walton1a6419b2011-07-14 21:25:43400 }
401 ret buckets_frozen;
Brian Anderson33294c72011-06-27 22:20:17402}
403
Marijn Haverbekefc6b7c82011-09-12 09:27:30404fn encode_index<T>(ebml_w: ebml::writer, buckets: [@[entry<T>]],
405 write_fn: fn(io::writer, T)) {
Brian Anderson18576e52011-08-24 01:09:30406 let writer = io::new_writer(ebml_w.writer);
Brian Anderson0fed5392011-08-12 05:58:14407 ebml::start_tag(ebml_w, tag_index);
Brian Anderson518dc522011-08-19 22:16:48408 let bucket_locs: [uint] = [];
Brian Anderson0fed5392011-08-12 05:58:14409 ebml::start_tag(ebml_w, tag_index_buckets);
Erick Tryzelaare4a0f992011-08-12 14:15:18410 for bucket: @[entry<T>] in buckets {
Brian Anderson518dc522011-08-19 22:16:48411 bucket_locs += [ebml_w.writer.tell()];
Brian Anderson0fed5392011-08-12 05:58:14412 ebml::start_tag(ebml_w, tag_index_buckets_bucket);
Erick Tryzelaare4a0f992011-08-12 14:15:18413 for elt: entry<T> in *bucket {
Brian Anderson0fed5392011-08-12 05:58:14414 ebml::start_tag(ebml_w, tag_index_buckets_bucket_elt);
Marijn Haverbekeaea53772011-07-26 12:06:02415 writer.write_be_uint(elt.pos, 4u);
416 write_fn(writer, elt.val);
Brian Anderson0fed5392011-08-12 05:58:14417 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17418 }
Brian Anderson0fed5392011-08-12 05:58:14419 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17420 }
Brian Anderson0fed5392011-08-12 05:58:14421 ebml::end_tag(ebml_w);
422 ebml::start_tag(ebml_w, tag_index_table);
Lindsey Kuperf91351a2011-08-16 04:54:52423 for pos: uint in bucket_locs { writer.write_be_uint(pos, 4u); }
Brian Anderson0fed5392011-08-12 05:58:14424 ebml::end_tag(ebml_w);
425 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17426}
427
Marijn Haverbekefc6b7c82011-09-12 09:27:30428fn write_str(writer: io::writer, s: str) { writer.write_str(s); }
Brian Anderson33294c72011-06-27 22:20:17429
Marijn Haverbekefc6b7c82011-09-12 09:27:30430fn write_int(writer: io::writer, n: int) {
Brian Anderson33294c72011-06-27 22:20:17431 writer.write_be_uint(n as uint, 4u);
432}
433
Marijn Haverbekefc6b7c82011-09-12 09:27:30434fn encode_meta_item(ebml_w: ebml::writer, mi: meta_item) {
Marijn Haverbekedf7f21d2011-07-27 12:19:39435 alt mi.node {
436 meta_word(name) {
Brian Anderson0fed5392011-08-12 05:58:14437 ebml::start_tag(ebml_w, tag_meta_item_word);
438 ebml::start_tag(ebml_w, tag_meta_item_name);
Brian Andersonab6bb032011-09-02 00:27:58439 ebml_w.writer.write(str::bytes(name));
Brian Anderson0fed5392011-08-12 05:58:14440 ebml::end_tag(ebml_w);
441 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39442 }
443 meta_name_value(name, value) {
444 alt value.node {
Brian Anderson9c173f12011-09-02 05:08:59445 lit_str(value) {
Brian Anderson0fed5392011-08-12 05:58:14446 ebml::start_tag(ebml_w, tag_meta_item_name_value);
447 ebml::start_tag(ebml_w, tag_meta_item_name);
Brian Andersonab6bb032011-09-02 00:27:58448 ebml_w.writer.write(str::bytes(name));
Brian Anderson0fed5392011-08-12 05:58:14449 ebml::end_tag(ebml_w);
450 ebml::start_tag(ebml_w, tag_meta_item_value);
Brian Andersonab6bb032011-09-02 00:27:58451 ebml_w.writer.write(str::bytes(value));
Brian Anderson0fed5392011-08-12 05:58:14452 ebml::end_tag(ebml_w);
453 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39454 }
455 _ {/* FIXME (#611) */ }
Brian Andersonf53c4f72011-06-28 02:41:48456 }
Marijn Haverbekedf7f21d2011-07-27 12:19:39457 }
458 meta_list(name, items) {
Brian Anderson0fed5392011-08-12 05:58:14459 ebml::start_tag(ebml_w, tag_meta_item_list);
460 ebml::start_tag(ebml_w, tag_meta_item_name);
Brian Andersonab6bb032011-09-02 00:27:58461 ebml_w.writer.write(str::bytes(name));
Brian Anderson0fed5392011-08-12 05:58:14462 ebml::end_tag(ebml_w);
Lindsey Kuperf91351a2011-08-16 04:54:52463 for inner_item: @meta_item in items {
Marijn Haverbekedf7f21d2011-07-27 12:19:39464 encode_meta_item(ebml_w, *inner_item);
465 }
Brian Anderson0fed5392011-08-12 05:58:14466 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39467 }
Brian Andersonf53c4f72011-06-28 02:41:48468 }
Brian Andersonf53c4f72011-06-28 02:41:48469}
470
Marijn Haverbekefc6b7c82011-09-12 09:27:30471fn encode_attributes(ebml_w: ebml::writer, attrs: [attribute]) {
Brian Anderson0fed5392011-08-12 05:58:14472 ebml::start_tag(ebml_w, tag_attributes);
Lindsey Kuperf91351a2011-08-16 04:54:52473 for attr: attribute in attrs {
Brian Anderson0fed5392011-08-12 05:58:14474 ebml::start_tag(ebml_w, tag_attribute);
Brian Andersonf53c4f72011-06-28 02:41:48475 encode_meta_item(ebml_w, attr.node.value);
Brian Anderson0fed5392011-08-12 05:58:14476 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17477 }
Brian Anderson0fed5392011-08-12 05:58:14478 ebml::end_tag(ebml_w);
Brian Andersonf53c4f72011-06-28 02:41:48479}
480
Graydon Hoarec796a8f2011-06-29 22:11:20481// So there's a special crate attribute called 'link' which defines the
482// metadata that Rust cares about for linking crates. This attribute requires
Brian Anderson70a28dc2011-07-01 00:03:08483// 'name' and 'vers' items, so if the user didn't provide them we will throw
Graydon Hoarec796a8f2011-06-29 22:11:20484// them in anyway with default values.
Marijn Haverbekefc6b7c82011-09-12 09:27:30485fn synthesize_crate_attrs(ecx: @encode_ctxt, crate: @crate) -> [attribute] {
Brian Anderson29afe1a2011-06-29 21:17:23486
Marijn Haverbekefc6b7c82011-09-12 09:27:30487 fn synthesize_link_attr(ecx: @encode_ctxt, items: [@meta_item]) ->
Marijn Haverbekedf7f21d2011-07-27 12:19:39488 attribute {
Brian Anderson29afe1a2011-06-29 21:17:23489
Brian Anderson5c49e4f2011-09-02 22:34:58490 assert (ecx.ccx.link_meta.name != "");
491 assert (ecx.ccx.link_meta.vers != "");
Brian Anderson29afe1a2011-06-29 21:17:23492
Marijn Haverbekedf7f21d2011-07-27 12:19:39493 let name_item =
Brian Anderson5c49e4f2011-09-02 22:34:58494 attr::mk_name_value_item_str("name", ecx.ccx.link_meta.name);
Marijn Haverbekedf7f21d2011-07-27 12:19:39495 let vers_item =
Brian Anderson5c49e4f2011-09-02 22:34:58496 attr::mk_name_value_item_str("vers", ecx.ccx.link_meta.vers);
Brian Anderson29afe1a2011-06-29 21:17:23497
Marijn Haverbekedf7f21d2011-07-27 12:19:39498 let other_items =
499 {
Brian Anderson5c49e4f2011-09-02 22:34:58500 let tmp = attr::remove_meta_items_by_name(items, "name");
501 attr::remove_meta_items_by_name(tmp, "vers")
Marijn Haverbekedf7f21d2011-07-27 12:19:39502 };
Brian Anderson29afe1a2011-06-29 21:17:23503
Brian Anderson518dc522011-08-19 22:16:48504 let meta_items = [name_item, vers_item] + other_items;
Brian Anderson5c49e4f2011-09-02 22:34:58505 let link_item = attr::mk_list_item("link", meta_items);
Brian Anderson29afe1a2011-06-29 21:17:23506
Brian Anderson70a28dc2011-07-01 00:03:08507 ret attr::mk_attr(link_item);
Brian Anderson29afe1a2011-06-29 21:17:23508 }
509
Brian Anderson518dc522011-08-19 22:16:48510 let attrs: [attribute] = [];
Marijn Haverbekedf7f21d2011-07-27 12:19:39511 let found_link_attr = false;
Lindsey Kuperf91351a2011-08-16 04:54:52512 for attr: attribute in crate.node.attrs {
Marijn Haverbekedf7f21d2011-07-27 12:19:39513 attrs +=
Brian Anderson5c49e4f2011-09-02 22:34:58514 if attr::get_attr_name(attr) != "link" {
Brian Anderson518dc522011-08-19 22:16:48515 [attr]
Marijn Haverbekedf7f21d2011-07-27 12:19:39516 } else {
517 alt attr.node.value.node {
518 meta_list(n, l) {
Marijn Haverbekefc6b7c82011-09-12 09:27:30519 found_link_attr = true;;
Brian Anderson518dc522011-08-19 22:16:48520 [synthesize_link_attr(ecx, l)]
Marijn Haverbekedf7f21d2011-07-27 12:19:39521 }
Brian Anderson518dc522011-08-19 22:16:48522 _ { [attr] }
Brian Anderson29afe1a2011-06-29 21:17:23523 }
Marijn Haverbeke7298b8f2011-09-15 07:48:39524 };
Brian Anderson29afe1a2011-06-29 21:17:23525 }
526
Brian Anderson518dc522011-08-19 22:16:48527 if !found_link_attr { attrs += [synthesize_link_attr(ecx, [])]; }
Brian Anderson29afe1a2011-06-29 21:17:23528
529 ret attrs;
530}
531
Marijn Haverbekefc6b7c82011-09-12 09:27:30532fn encode_crate_deps(ebml_w: ebml::writer, cstore: cstore::cstore) {
Brian Anderson30704392011-07-08 18:29:56533
Marijn Haverbekefc6b7c82011-09-12 09:27:30534 fn get_ordered_names(cstore: cstore::cstore) -> [str] {
Marijn Haverbekedf7f21d2011-07-27 12:19:39535 type hashkv = @{key: crate_num, val: cstore::crate_metadata};
Brian Anderson5c49e4f2011-09-02 22:34:58536 type numname = {crate: crate_num, ident: str};
Brian Anderson30704392011-07-08 18:29:56537
538 // Pull the cnums and names out of cstore
Brian Anderson518dc522011-08-19 22:16:48539 let pairs: [mutable numname] = [mutable];
Lindsey Kuperf91351a2011-08-16 04:54:52540 for each hashkv: hashkv in cstore::iter_crate_data(cstore) {
Brian Anderson518dc522011-08-19 22:16:48541 pairs += [mutable {crate: hashkv.key, ident: hashkv.val.name}];
Brian Anderson30704392011-07-08 18:29:56542 }
543
544 // Sort by cnum
Marijn Haverbekefc6b7c82011-09-12 09:27:30545 fn lteq(kv1: numname, kv2: numname) -> bool { kv1.crate <= kv2.crate }
Brian Anderson7625ed52011-08-12 05:48:08546 std::sort::quick_sort(lteq, pairs);
Brian Anderson30704392011-07-08 18:29:56547
548 // Sanity-check the crate numbers
Marijn Haverbekedf7f21d2011-07-27 12:19:39549 let expected_cnum = 1;
Lindsey Kuperf91351a2011-08-16 04:54:52550 for n: numname in pairs {
Marijn Haverbekedf7f21d2011-07-27 12:19:39551 assert (n.crate == expected_cnum);
Brian Anderson30704392011-07-08 18:29:56552 expected_cnum += 1;
553 }
554
555 // Return just the names
Marijn Haverbekefc6b7c82011-09-12 09:27:30556 fn name(kv: numname) -> str { kv.ident }
Brian Andersonf05a91a2011-08-15 23:38:23557 // mutable -> immutable hack for vec::map
558 let immpairs = vec::slice(pairs, 0u, vec::len(pairs));
559 ret vec::map(name, immpairs);
Brian Anderson30704392011-07-08 18:29:56560 }
561
562 // We're just going to write a list of crate names, with the assumption
563 // that they are numbered 1 to n.
564 // FIXME: This is not nearly enough to support correct versioning
565 // but is enough to get transitive crate dependencies working.
Brian Anderson0fed5392011-08-12 05:58:14566 ebml::start_tag(ebml_w, tag_crate_deps);
Brian Anderson5c49e4f2011-09-02 22:34:58567 for cname: str in get_ordered_names(cstore) {
Brian Anderson0fed5392011-08-12 05:58:14568 ebml::start_tag(ebml_w, tag_crate_dep);
Brian Andersonab6bb032011-09-02 00:27:58569 ebml_w.writer.write(str::bytes(cname));
Brian Anderson0fed5392011-08-12 05:58:14570 ebml::end_tag(ebml_w);
Brian Anderson30704392011-07-08 18:29:56571 }
Brian Anderson0fed5392011-08-12 05:58:14572 ebml::end_tag(ebml_w);
Brian Anderson30704392011-07-08 18:29:56573}
574
Marijn Haverbekefc6b7c82011-09-12 09:27:30575fn encode_metadata(cx: @crate_ctxt, crate: @crate) -> str {
Brian Andersond0a432f2011-07-08 06:55:41576
Marijn Haverbekedf7f21d2011-07-27 12:19:39577 let abbrevs = map::mk_hashmap(ty::hash_ty, ty::eq_ty);
578 let ecx = @{ccx: cx, type_abbrevs: abbrevs};
Brian Andersond0a432f2011-07-08 06:55:41579
Brian Anderson7d05da92011-08-12 02:14:38580 let string_w = io::string_writer();
Marijn Haverbekedf7f21d2011-07-27 12:19:39581 let buf_w = string_w.get_writer().get_buf_writer();
Brian Anderson0fed5392011-08-12 05:58:14582 let ebml_w = ebml::create_writer(buf_w);
Brian Anderson33294c72011-06-27 22:20:17583
Marijn Haverbekedf7f21d2011-07-27 12:19:39584 let crate_attrs = synthesize_crate_attrs(ecx, crate);
Brian Anderson29afe1a2011-06-29 21:17:23585 encode_attributes(ebml_w, crate_attrs);
Brian Anderson30704392011-07-08 18:29:56586
587 encode_crate_deps(ebml_w, cx.sess.get_cstore());
588
Brian Anderson33294c72011-06-27 22:20:17589 // Encode and index the paths.
590
Brian Anderson0fed5392011-08-12 05:58:14591 ebml::start_tag(ebml_w, tag_paths);
Marijn Haverbekedf7f21d2011-07-27 12:19:39592 let paths_index = encode_item_paths(ebml_w, crate);
593 let paths_buckets = create_index(paths_index, hash_path);
Marijn Haverbekee949aab2011-07-25 13:07:48594 encode_index(ebml_w, paths_buckets, write_str);
Brian Anderson0fed5392011-08-12 05:58:14595 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17596 // Encode and index the items.
597
Brian Anderson0fed5392011-08-12 05:58:14598 ebml::start_tag(ebml_w, tag_items);
Marijn Haverbekedf7f21d2011-07-27 12:19:39599 let items_index = encode_info_for_items(ecx, ebml_w);
600 let items_buckets = create_index(items_index, hash_node_id);
Marijn Haverbekee949aab2011-07-25 13:07:48601 encode_index(ebml_w, items_buckets, write_int);
Brian Anderson0fed5392011-08-12 05:58:14602 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17603 // Pad this, since something (LLVM, presumably) is cutting off the
Brian Anderson2e7e5882011-08-11 23:36:20604 // remaining % 4 bytes.
Brian Anderson33294c72011-06-27 22:20:17605
Brian Anderson518dc522011-08-19 22:16:48606 buf_w.write([0u8, 0u8, 0u8, 0u8]);
Brian Anderson54691f92011-08-27 05:48:10607 ret string_w.get_str();
Brian Anderson33294c72011-06-27 22:20:17608}
Brian Anderson894e2222011-06-28 02:16:16609
Brian Anderson7d26d1d2011-07-07 19:47:39610// Get the encoded string for a type
Marijn Haverbekefc6b7c82011-09-12 09:27:30611fn encoded_ty(tcx: ty::ctxt, t: ty::t) -> str {
Marijn Haverbekedf7f21d2011-07-27 12:19:39612 let cx = @{ds: def_to_str, tcx: tcx, abbrevs: tyencode::ac_no_abbrevs};
Brian Anderson7d05da92011-08-12 02:14:38613 let sw = io::string_writer();
Brian Anderson7d26d1d2011-07-07 19:47:39614 tyencode::enc_ty(sw.get_writer(), cx, t);
Brian Andersonb2408d52011-08-25 05:13:16615 ret sw.get_str();
Brian Anderson7d26d1d2011-07-07 19:47:39616}
617
Brian Anderson894e2222011-06-28 02:16:16618
619// Local Variables:
620// mode: rust
621// fill-column: 78;
622// indent-tabs-mode: nil
623// c-basic-offset: 4
624// buffer-file-coding-system: utf-8-unix
625// compile-command: "make -k -C $RBUILD 2>&1 | sed -e 's/\\/x\\//x:\\//g'";
626// End: