blob: f392d2367e4d57a154149867fefe9dcad784be63 [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 {
Niko Matsakis29584cc2011-10-06 23:42:27255 unsafe_fn. { 'u' }
Brian Anderson518dc522011-08-19 22:16:48256 pure_fn. { 'p' }
257 impure_fn. { 'f' }
258 } as u8);
Patrick Waltonb079e1a2011-08-05 20:58:33259 encode_inlineness(ebml_w,
260 alt fd.decl.il {
261 il_normal. { 'n' }
262 il_inline. { 'i' }
263 } as u8);
Graydon Hoare59c441a2011-07-29 23:40:23264 encode_type_param_kinds(ebml_w, tps);
Marijn Haverbekedf7f21d2011-07-27 12:19:39265 encode_type(ecx, ebml_w, node_id_to_monotype(ecx.ccx.tcx, item.id));
266 encode_symbol(ecx, ebml_w, item.id);
Brian Anderson0fed5392011-08-12 05:58:14267 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39268 }
269 item_mod(_) {
Brian Anderson0fed5392011-08-12 05:58:14270 ebml::start_tag(ebml_w, tag_items_data_item);
Marijn Haverbekedf7f21d2011-07-27 12:19:39271 encode_def_id(ebml_w, local_def(item.id));
Graydon Hoare59c441a2011-07-29 23:40:23272 encode_family(ebml_w, 'm' as u8);
Brian Anderson0fed5392011-08-12 05:58:14273 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39274 }
275 item_native_mod(_) {
Brian Anderson0fed5392011-08-12 05:58:14276 ebml::start_tag(ebml_w, tag_items_data_item);
Marijn Haverbekedf7f21d2011-07-27 12:19:39277 encode_def_id(ebml_w, local_def(item.id));
Graydon Hoare59c441a2011-07-29 23:40:23278 encode_family(ebml_w, 'n' as u8);
Brian Anderson0fed5392011-08-12 05:58:14279 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39280 }
281 item_ty(_, tps) {
Brian Anderson0fed5392011-08-12 05:58:14282 ebml::start_tag(ebml_w, tag_items_data_item);
Marijn Haverbekedf7f21d2011-07-27 12:19:39283 encode_def_id(ebml_w, local_def(item.id));
Graydon Hoare59c441a2011-07-29 23:40:23284 encode_family(ebml_w, 'y' as u8);
285 encode_type_param_kinds(ebml_w, tps);
Marijn Haverbekedf7f21d2011-07-27 12:19:39286 encode_type(ecx, ebml_w, node_id_to_monotype(ecx.ccx.tcx, item.id));
Brian Anderson0fed5392011-08-12 05:58:14287 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39288 }
289 item_tag(variants, tps) {
Brian Anderson0fed5392011-08-12 05:58:14290 ebml::start_tag(ebml_w, tag_items_data_item);
Marijn Haverbekedf7f21d2011-07-27 12:19:39291 encode_def_id(ebml_w, local_def(item.id));
Graydon Hoare59c441a2011-07-29 23:40:23292 encode_family(ebml_w, 't' as u8);
293 encode_type_param_kinds(ebml_w, tps);
Marijn Haverbekedf7f21d2011-07-27 12:19:39294 encode_type(ecx, ebml_w, node_id_to_monotype(ecx.ccx.tcx, item.id));
Lindsey Kuperf91351a2011-08-16 04:54:52295 for v: variant in variants {
Marijn Haverbekedf7f21d2011-07-27 12:19:39296 encode_variant_id(ebml_w, local_def(v.node.id));
Brian Anderson33294c72011-06-27 22:20:17297 }
Brian Anderson0fed5392011-08-12 05:58:14298 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39299 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 Anderson33294c72011-06-27 22:20:17303
Brian Anderson0fed5392011-08-12 05:58:14304 ebml::start_tag(ebml_w, tag_items_data_item);
Marijn Haverbekedf7f21d2011-07-27 12:19:39305 encode_def_id(ebml_w, local_def(ctor_id));
Graydon Hoare59c441a2011-07-29 23:40:23306 encode_family(ebml_w, 'y' as u8);
307 encode_type_param_kinds(ebml_w, tps);
Marijn Haverbekedf7f21d2011-07-27 12:19:39308 encode_type(ecx, ebml_w, ty::ty_fn_ret(ecx.ccx.tcx, fn_ty));
309 encode_symbol(ecx, ebml_w, item.id);
Brian Anderson0fed5392011-08-12 05:58:14310 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17311
Brian Anderson518dc522011-08-19 22:16:48312 index += [{val: ctor_id, pos: ebml_w.writer.tell()}];
Brian Anderson0fed5392011-08-12 05:58:14313 ebml::start_tag(ebml_w, tag_items_data_item);
Marijn Haverbekedf7f21d2011-07-27 12:19:39314 encode_def_id(ebml_w, local_def(ctor_id));
Graydon Hoare59c441a2011-07-29 23:40:23315 encode_family(ebml_w, 'f' as u8);
316 encode_type_param_kinds(ebml_w, tps);
Marijn Haverbekedf7f21d2011-07-27 12:19:39317 encode_type(ecx, ebml_w, fn_ty);
318 encode_symbol(ecx, ebml_w, ctor_id);
Brian Anderson0fed5392011-08-12 05:58:14319 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39320 }
321 item_obj(_, tps, ctor_id) {
322 let fn_ty = node_id_to_monotype(ecx.ccx.tcx, ctor_id);
Brian Anderson33294c72011-06-27 22:20:17323
Brian Anderson0fed5392011-08-12 05:58:14324 ebml::start_tag(ebml_w, tag_items_data_item);
Marijn Haverbekedf7f21d2011-07-27 12:19:39325 encode_def_id(ebml_w, local_def(item.id));
Graydon Hoare59c441a2011-07-29 23:40:23326 encode_family(ebml_w, 'y' as u8);
327 encode_type_param_kinds(ebml_w, tps);
Marijn Haverbekedf7f21d2011-07-27 12:19:39328 encode_type(ecx, ebml_w, ty::ty_fn_ret(ecx.ccx.tcx, fn_ty));
Brian Anderson0fed5392011-08-12 05:58:14329 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17330
Brian Anderson518dc522011-08-19 22:16:48331 index += [{val: ctor_id, pos: ebml_w.writer.tell()}];
Brian Anderson0fed5392011-08-12 05:58:14332 ebml::start_tag(ebml_w, tag_items_data_item);
Marijn Haverbekedf7f21d2011-07-27 12:19:39333 encode_def_id(ebml_w, local_def(ctor_id));
Graydon Hoare59c441a2011-07-29 23:40:23334 encode_family(ebml_w, 'f' as u8);
335 encode_type_param_kinds(ebml_w, tps);
Marijn Haverbekedf7f21d2011-07-27 12:19:39336 encode_type(ecx, ebml_w, fn_ty);
337 encode_symbol(ecx, ebml_w, ctor_id);
Brian Anderson0fed5392011-08-12 05:58:14338 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39339 }
Brian Anderson33294c72011-06-27 22:20:17340 }
341}
342
Marijn Haverbekefc6b7c82011-09-12 09:27:30343fn encode_info_for_native_item(ecx: @encode_ctxt, ebml_w: ebml::writer,
344 nitem: @native_item) {
Brian Anderson0fed5392011-08-12 05:58:14345 ebml::start_tag(ebml_w, tag_items_data_item);
Marijn Haverbekedf7f21d2011-07-27 12:19:39346 alt nitem.node {
347 native_item_ty. {
348 encode_def_id(ebml_w, local_def(nitem.id));
Graydon Hoare59c441a2011-07-29 23:40:23349 encode_family(ebml_w, 'T' as u8);
Marijn Haverbekedf7f21d2011-07-27 12:19:39350 encode_type(ecx, ebml_w,
351 ty::mk_native(ecx.ccx.tcx, local_def(nitem.id)));
352 }
Niko Matsakis212707c2011-10-11 21:52:38353 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 Haverbekedf7f21d2011-07-27 12:19:39360 encode_def_id(ebml_w, local_def(nitem.id));
Niko Matsakis212707c2011-10-11 21:52:38361 encode_family(ebml_w, letter);
Graydon Hoare59c441a2011-07-29 23:40:23362 encode_type_param_kinds(ebml_w, tps);
Marijn Haverbekedf7f21d2011-07-27 12:19:39363 encode_type(ecx, ebml_w, node_id_to_monotype(ecx.ccx.tcx, nitem.id));
364 encode_symbol(ecx, ebml_w, nitem.id);
365 }
Brian Anderson33294c72011-06-27 22:20:17366 }
Brian Anderson0fed5392011-08-12 05:58:14367 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17368}
369
Marijn Haverbekefc6b7c82011-09-12 09:27:30370fn encode_info_for_items(ecx: @encode_ctxt, ebml_w: ebml::writer) ->
Erick Tryzelaare4a0f992011-08-12 14:15:18371 [entry<int>] {
Brian Anderson518dc522011-08-19 22:16:48372 let index: [entry<int>] = [];
Brian Anderson0fed5392011-08-12 05:58:14373 ebml::start_tag(ebml_w, tag_items_data);
Marijn Haverbeke4ebbbe52011-10-21 10:21:27374 ecx.ccx.ast_map.items {|key, val|
375 alt val {
Marijn Haverbekedf7f21d2011-07-27 12:19:39376 middle::ast_map::node_item(i) {
Marijn Haverbeke4ebbbe52011-10-21 10:21:27377 index += [{val: key, pos: ebml_w.writer.tell()}];
Marijn Haverbekedf7f21d2011-07-27 12:19:39378 encode_info_for_item(ecx, ebml_w, i, index);
379 }
380 middle::ast_map::node_native_item(i) {
Marijn Haverbeke4ebbbe52011-10-21 10:21:27381 index += [{val: key, pos: ebml_w.writer.tell()}];
Marijn Haverbekedf7f21d2011-07-27 12:19:39382 encode_info_for_native_item(ecx, ebml_w, i);
383 }
384 _ { }
Brian Anderson33294c72011-06-27 22:20:17385 }
Marijn Haverbeke4ebbbe52011-10-21 10:21:27386 };
Brian Anderson0fed5392011-08-12 05:58:14387 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17388 ret index;
389}
390
391
392// Path and definition ID indexing
393
Brian Anderson856acbf2011-09-24 01:50:00394fn create_index<@T>(index: [entry<T>], hash_fn: fn(T) -> uint) ->
Erick Tryzelaare4a0f992011-08-12 14:15:18395 [@[entry<T>]] {
Brian Anderson518dc522011-08-19 22:16:48396 let buckets: [@mutable [entry<T>]] = [];
397 for each i: uint in uint::range(0u, 256u) { buckets += [@mutable []]; }
Erick Tryzelaare4a0f992011-08-12 14:15:18398 for elt: entry<T> in index {
Marijn Haverbekedf7f21d2011-07-27 12:19:39399 let h = hash_fn(elt.val);
Brian Anderson518dc522011-08-19 22:16:48400 *buckets[h % 256u] += [elt];
Brian Anderson33294c72011-06-27 22:20:17401 }
Patrick Walton1a6419b2011-07-14 21:25:43402
Brian Anderson518dc522011-08-19 22:16:48403 let buckets_frozen = [];
Erick Tryzelaare4a0f992011-08-12 14:15:18404 for bucket: @mutable [entry<T>] in buckets {
Brian Anderson518dc522011-08-19 22:16:48405 buckets_frozen += [@*bucket];
Patrick Walton1a6419b2011-07-14 21:25:43406 }
407 ret buckets_frozen;
Brian Anderson33294c72011-06-27 22:20:17408}
409
Marijn Haverbekefc6b7c82011-09-12 09:27:30410fn encode_index<T>(ebml_w: ebml::writer, buckets: [@[entry<T>]],
411 write_fn: fn(io::writer, T)) {
Brian Anderson18576e52011-08-24 01:09:30412 let writer = io::new_writer(ebml_w.writer);
Brian Anderson0fed5392011-08-12 05:58:14413 ebml::start_tag(ebml_w, tag_index);
Brian Anderson518dc522011-08-19 22:16:48414 let bucket_locs: [uint] = [];
Brian Anderson0fed5392011-08-12 05:58:14415 ebml::start_tag(ebml_w, tag_index_buckets);
Erick Tryzelaare4a0f992011-08-12 14:15:18416 for bucket: @[entry<T>] in buckets {
Brian Anderson518dc522011-08-19 22:16:48417 bucket_locs += [ebml_w.writer.tell()];
Brian Anderson0fed5392011-08-12 05:58:14418 ebml::start_tag(ebml_w, tag_index_buckets_bucket);
Erick Tryzelaare4a0f992011-08-12 14:15:18419 for elt: entry<T> in *bucket {
Brian Anderson0fed5392011-08-12 05:58:14420 ebml::start_tag(ebml_w, tag_index_buckets_bucket_elt);
Marijn Haverbekeaea53772011-07-26 12:06:02421 writer.write_be_uint(elt.pos, 4u);
422 write_fn(writer, elt.val);
Brian Anderson0fed5392011-08-12 05:58:14423 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17424 }
Brian Anderson0fed5392011-08-12 05:58:14425 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17426 }
Brian Anderson0fed5392011-08-12 05:58:14427 ebml::end_tag(ebml_w);
428 ebml::start_tag(ebml_w, tag_index_table);
Lindsey Kuperf91351a2011-08-16 04:54:52429 for pos: uint in bucket_locs { writer.write_be_uint(pos, 4u); }
Brian Anderson0fed5392011-08-12 05:58:14430 ebml::end_tag(ebml_w);
431 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17432}
433
Marijn Haverbeke33167f72011-10-10 11:54:03434fn write_str(writer: io::writer, &&s: str) { writer.write_str(s); }
Brian Anderson33294c72011-06-27 22:20:17435
Marijn Haverbekef9fbd862011-10-06 10:26:12436fn write_int(writer: io::writer, &&n: int) {
Brian Anderson33294c72011-06-27 22:20:17437 writer.write_be_uint(n as uint, 4u);
438}
439
Marijn Haverbekefc6b7c82011-09-12 09:27:30440fn encode_meta_item(ebml_w: ebml::writer, mi: meta_item) {
Marijn Haverbekedf7f21d2011-07-27 12:19:39441 alt mi.node {
442 meta_word(name) {
Brian Anderson0fed5392011-08-12 05:58:14443 ebml::start_tag(ebml_w, tag_meta_item_word);
444 ebml::start_tag(ebml_w, tag_meta_item_name);
Brian Andersonab6bb032011-09-02 00:27:58445 ebml_w.writer.write(str::bytes(name));
Brian Anderson0fed5392011-08-12 05:58:14446 ebml::end_tag(ebml_w);
447 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39448 }
449 meta_name_value(name, value) {
450 alt value.node {
Brian Anderson9c173f12011-09-02 05:08:59451 lit_str(value) {
Brian Anderson0fed5392011-08-12 05:58:14452 ebml::start_tag(ebml_w, tag_meta_item_name_value);
453 ebml::start_tag(ebml_w, tag_meta_item_name);
Brian Andersonab6bb032011-09-02 00:27:58454 ebml_w.writer.write(str::bytes(name));
Brian Anderson0fed5392011-08-12 05:58:14455 ebml::end_tag(ebml_w);
456 ebml::start_tag(ebml_w, tag_meta_item_value);
Brian Andersonab6bb032011-09-02 00:27:58457 ebml_w.writer.write(str::bytes(value));
Brian Anderson0fed5392011-08-12 05:58:14458 ebml::end_tag(ebml_w);
459 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39460 }
461 _ {/* FIXME (#611) */ }
Brian Andersonf53c4f72011-06-28 02:41:48462 }
Marijn Haverbekedf7f21d2011-07-27 12:19:39463 }
464 meta_list(name, items) {
Brian Anderson0fed5392011-08-12 05:58:14465 ebml::start_tag(ebml_w, tag_meta_item_list);
466 ebml::start_tag(ebml_w, tag_meta_item_name);
Brian Andersonab6bb032011-09-02 00:27:58467 ebml_w.writer.write(str::bytes(name));
Brian Anderson0fed5392011-08-12 05:58:14468 ebml::end_tag(ebml_w);
Lindsey Kuperf91351a2011-08-16 04:54:52469 for inner_item: @meta_item in items {
Marijn Haverbekedf7f21d2011-07-27 12:19:39470 encode_meta_item(ebml_w, *inner_item);
471 }
Brian Anderson0fed5392011-08-12 05:58:14472 ebml::end_tag(ebml_w);
Marijn Haverbekedf7f21d2011-07-27 12:19:39473 }
Brian Andersonf53c4f72011-06-28 02:41:48474 }
Brian Andersonf53c4f72011-06-28 02:41:48475}
476
Marijn Haverbekefc6b7c82011-09-12 09:27:30477fn encode_attributes(ebml_w: ebml::writer, attrs: [attribute]) {
Brian Anderson0fed5392011-08-12 05:58:14478 ebml::start_tag(ebml_w, tag_attributes);
Lindsey Kuperf91351a2011-08-16 04:54:52479 for attr: attribute in attrs {
Brian Anderson0fed5392011-08-12 05:58:14480 ebml::start_tag(ebml_w, tag_attribute);
Brian Andersonf53c4f72011-06-28 02:41:48481 encode_meta_item(ebml_w, attr.node.value);
Brian Anderson0fed5392011-08-12 05:58:14482 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17483 }
Brian Anderson0fed5392011-08-12 05:58:14484 ebml::end_tag(ebml_w);
Brian Andersonf53c4f72011-06-28 02:41:48485}
486
Graydon Hoarec796a8f2011-06-29 22:11:20487// 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 Anderson70a28dc2011-07-01 00:03:08489// 'name' and 'vers' items, so if the user didn't provide them we will throw
Graydon Hoarec796a8f2011-06-29 22:11:20490// them in anyway with default values.
Marijn Haverbekefc6b7c82011-09-12 09:27:30491fn synthesize_crate_attrs(ecx: @encode_ctxt, crate: @crate) -> [attribute] {
Brian Anderson29afe1a2011-06-29 21:17:23492
Marijn Haverbekefc6b7c82011-09-12 09:27:30493 fn synthesize_link_attr(ecx: @encode_ctxt, items: [@meta_item]) ->
Marijn Haverbekedf7f21d2011-07-27 12:19:39494 attribute {
Brian Anderson29afe1a2011-06-29 21:17:23495
Brian Anderson5c49e4f2011-09-02 22:34:58496 assert (ecx.ccx.link_meta.name != "");
497 assert (ecx.ccx.link_meta.vers != "");
Brian Anderson29afe1a2011-06-29 21:17:23498
Marijn Haverbekedf7f21d2011-07-27 12:19:39499 let name_item =
Brian Anderson5c49e4f2011-09-02 22:34:58500 attr::mk_name_value_item_str("name", ecx.ccx.link_meta.name);
Marijn Haverbekedf7f21d2011-07-27 12:19:39501 let vers_item =
Brian Anderson5c49e4f2011-09-02 22:34:58502 attr::mk_name_value_item_str("vers", ecx.ccx.link_meta.vers);
Brian Anderson29afe1a2011-06-29 21:17:23503
Marijn Haverbekedf7f21d2011-07-27 12:19:39504 let other_items =
505 {
Brian Anderson5c49e4f2011-09-02 22:34:58506 let tmp = attr::remove_meta_items_by_name(items, "name");
507 attr::remove_meta_items_by_name(tmp, "vers")
Marijn Haverbekedf7f21d2011-07-27 12:19:39508 };
Brian Anderson29afe1a2011-06-29 21:17:23509
Brian Anderson518dc522011-08-19 22:16:48510 let meta_items = [name_item, vers_item] + other_items;
Brian Anderson5c49e4f2011-09-02 22:34:58511 let link_item = attr::mk_list_item("link", meta_items);
Brian Anderson29afe1a2011-06-29 21:17:23512
Brian Anderson70a28dc2011-07-01 00:03:08513 ret attr::mk_attr(link_item);
Brian Anderson29afe1a2011-06-29 21:17:23514 }
515
Brian Anderson518dc522011-08-19 22:16:48516 let attrs: [attribute] = [];
Marijn Haverbekedf7f21d2011-07-27 12:19:39517 let found_link_attr = false;
Lindsey Kuperf91351a2011-08-16 04:54:52518 for attr: attribute in crate.node.attrs {
Marijn Haverbekedf7f21d2011-07-27 12:19:39519 attrs +=
Brian Anderson5c49e4f2011-09-02 22:34:58520 if attr::get_attr_name(attr) != "link" {
Brian Anderson518dc522011-08-19 22:16:48521 [attr]
Marijn Haverbekedf7f21d2011-07-27 12:19:39522 } else {
523 alt attr.node.value.node {
524 meta_list(n, l) {
Marijn Haverbekefc6b7c82011-09-12 09:27:30525 found_link_attr = true;;
Brian Anderson518dc522011-08-19 22:16:48526 [synthesize_link_attr(ecx, l)]
Marijn Haverbekedf7f21d2011-07-27 12:19:39527 }
Brian Anderson518dc522011-08-19 22:16:48528 _ { [attr] }
Brian Anderson29afe1a2011-06-29 21:17:23529 }
Marijn Haverbeke7298b8f2011-09-15 07:48:39530 };
Brian Anderson29afe1a2011-06-29 21:17:23531 }
532
Brian Anderson518dc522011-08-19 22:16:48533 if !found_link_attr { attrs += [synthesize_link_attr(ecx, [])]; }
Brian Anderson29afe1a2011-06-29 21:17:23534
535 ret attrs;
536}
537
Marijn Haverbekefc6b7c82011-09-12 09:27:30538fn encode_crate_deps(ebml_w: ebml::writer, cstore: cstore::cstore) {
Brian Anderson30704392011-07-08 18:29:56539
Marijn Haverbekefc6b7c82011-09-12 09:27:30540 fn get_ordered_names(cstore: cstore::cstore) -> [str] {
Marijn Haverbekedf7f21d2011-07-27 12:19:39541 type hashkv = @{key: crate_num, val: cstore::crate_metadata};
Brian Anderson5c49e4f2011-09-02 22:34:58542 type numname = {crate: crate_num, ident: str};
Brian Anderson30704392011-07-08 18:29:56543
544 // Pull the cnums and names out of cstore
Brian Anderson518dc522011-08-19 22:16:48545 let pairs: [mutable numname] = [mutable];
Marijn Haverbeke4ebbbe52011-10-21 10:21:27546 cstore::iter_crate_data(cstore) {|key, val|
547 pairs += [mutable {crate: key, ident: val.name}];
548 };
Brian Anderson30704392011-07-08 18:29:56549
550 // Sort by cnum
Marijn Haverbekefc6b7c82011-09-12 09:27:30551 fn lteq(kv1: numname, kv2: numname) -> bool { kv1.crate <= kv2.crate }
Brian Anderson7625ed52011-08-12 05:48:08552 std::sort::quick_sort(lteq, pairs);
Brian Anderson30704392011-07-08 18:29:56553
554 // Sanity-check the crate numbers
Marijn Haverbekedf7f21d2011-07-27 12:19:39555 let expected_cnum = 1;
Lindsey Kuperf91351a2011-08-16 04:54:52556 for n: numname in pairs {
Marijn Haverbekedf7f21d2011-07-27 12:19:39557 assert (n.crate == expected_cnum);
Brian Anderson30704392011-07-08 18:29:56558 expected_cnum += 1;
559 }
560
561 // Return just the names
Marijn Haverbekefc6b7c82011-09-12 09:27:30562 fn name(kv: numname) -> str { kv.ident }
Brian Andersonf05a91a2011-08-15 23:38:23563 // mutable -> immutable hack for vec::map
564 let immpairs = vec::slice(pairs, 0u, vec::len(pairs));
565 ret vec::map(name, immpairs);
Brian Anderson30704392011-07-08 18:29:56566 }
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 Anderson0fed5392011-08-12 05:58:14572 ebml::start_tag(ebml_w, tag_crate_deps);
Brian Anderson5c49e4f2011-09-02 22:34:58573 for cname: str in get_ordered_names(cstore) {
Brian Anderson0fed5392011-08-12 05:58:14574 ebml::start_tag(ebml_w, tag_crate_dep);
Brian Andersonab6bb032011-09-02 00:27:58575 ebml_w.writer.write(str::bytes(cname));
Brian Anderson0fed5392011-08-12 05:58:14576 ebml::end_tag(ebml_w);
Brian Anderson30704392011-07-08 18:29:56577 }
Brian Anderson0fed5392011-08-12 05:58:14578 ebml::end_tag(ebml_w);
Brian Anderson30704392011-07-08 18:29:56579}
580
Marijn Haverbekefc6b7c82011-09-12 09:27:30581fn encode_metadata(cx: @crate_ctxt, crate: @crate) -> str {
Brian Andersond0a432f2011-07-08 06:55:41582
Marijn Haverbekedf7f21d2011-07-27 12:19:39583 let abbrevs = map::mk_hashmap(ty::hash_ty, ty::eq_ty);
584 let ecx = @{ccx: cx, type_abbrevs: abbrevs};
Brian Andersond0a432f2011-07-08 06:55:41585
Brian Anderson7d05da92011-08-12 02:14:38586 let string_w = io::string_writer();
Marijn Haverbekedf7f21d2011-07-27 12:19:39587 let buf_w = string_w.get_writer().get_buf_writer();
Brian Anderson0fed5392011-08-12 05:58:14588 let ebml_w = ebml::create_writer(buf_w);
Brian Anderson33294c72011-06-27 22:20:17589
Marijn Haverbekedf7f21d2011-07-27 12:19:39590 let crate_attrs = synthesize_crate_attrs(ecx, crate);
Brian Anderson29afe1a2011-06-29 21:17:23591 encode_attributes(ebml_w, crate_attrs);
Brian Anderson30704392011-07-08 18:29:56592
593 encode_crate_deps(ebml_w, cx.sess.get_cstore());
594
Brian Anderson33294c72011-06-27 22:20:17595 // Encode and index the paths.
596
Brian Anderson0fed5392011-08-12 05:58:14597 ebml::start_tag(ebml_w, tag_paths);
Marijn Haverbekedf7f21d2011-07-27 12:19:39598 let paths_index = encode_item_paths(ebml_w, crate);
599 let paths_buckets = create_index(paths_index, hash_path);
Marijn Haverbekee949aab2011-07-25 13:07:48600 encode_index(ebml_w, paths_buckets, write_str);
Brian Anderson0fed5392011-08-12 05:58:14601 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17602 // Encode and index the items.
603
Brian Anderson0fed5392011-08-12 05:58:14604 ebml::start_tag(ebml_w, tag_items);
Marijn Haverbekedf7f21d2011-07-27 12:19:39605 let items_index = encode_info_for_items(ecx, ebml_w);
606 let items_buckets = create_index(items_index, hash_node_id);
Marijn Haverbekee949aab2011-07-25 13:07:48607 encode_index(ebml_w, items_buckets, write_int);
Brian Anderson0fed5392011-08-12 05:58:14608 ebml::end_tag(ebml_w);
Brian Anderson33294c72011-06-27 22:20:17609 // Pad this, since something (LLVM, presumably) is cutting off the
Brian Anderson2e7e5882011-08-11 23:36:20610 // remaining % 4 bytes.
Brian Anderson33294c72011-06-27 22:20:17611
Brian Anderson518dc522011-08-19 22:16:48612 buf_w.write([0u8, 0u8, 0u8, 0u8]);
Brian Anderson54691f92011-08-27 05:48:10613 ret string_w.get_str();
Brian Anderson33294c72011-06-27 22:20:17614}
Brian Anderson894e2222011-06-28 02:16:16615
Brian Anderson7d26d1d2011-07-07 19:47:39616// Get the encoded string for a type
Marijn Haverbekefc6b7c82011-09-12 09:27:30617fn encoded_ty(tcx: ty::ctxt, t: ty::t) -> str {
Marijn Haverbekedf7f21d2011-07-27 12:19:39618 let cx = @{ds: def_to_str, tcx: tcx, abbrevs: tyencode::ac_no_abbrevs};
Brian Anderson7d05da92011-08-12 02:14:38619 let sw = io::string_writer();
Brian Anderson7d26d1d2011-07-07 19:47:39620 tyencode::enc_ty(sw.get_writer(), cx, t);
Brian Andersonb2408d52011-08-25 05:13:16621 ret sw.get_str();
Brian Anderson7d26d1d2011-07-07 19:47:39622}
623
Brian Anderson894e2222011-06-28 02:16:16624
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: