From fd465f91a89450b7daebecdde9c280a923bbe394 Mon Sep 17 00:00:00 2001 From: Marijn Haverbeke Date: Wed, 7 Mar 2012 12:21:08 +0100 Subject: Drop collect_items pass, create decls on demand This solves a problem with inlined functions that have inner functions. --- src/rustc/metadata/encoder.rs | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) (limited to 'src/rustc/metadata/encoder.rs') diff --git a/src/rustc/metadata/encoder.rs b/src/rustc/metadata/encoder.rs index c2c0cbc9150..0b24b3325d9 100644 --- a/src/rustc/metadata/encoder.rs +++ b/src/rustc/metadata/encoder.rs @@ -328,7 +328,7 @@ fn purity_fn_family(p: purity) -> char { } fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item, - &index: [entry], path: ast_map::path) { + &index: [entry], path: ast_map::path) -> bool { fn should_inline(attrs: [attribute]) -> bool { alt attr::find_inline_attr(attrs) { @@ -342,7 +342,7 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item, item_enum(_, _) | item_res(_, _, _, _, _) { true } _ { false } }; - if !must_write && !ecx.reachable.contains_key(item.id) { ret; } + if !must_write && !ecx.reachable.contains_key(item.id) { ret false; } alt item.node { item_const(_, _) { @@ -494,11 +494,13 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item, ebml_w.end_tag(); } } + ret true; } fn encode_info_for_native_item(ecx: @encode_ctxt, ebml_w: ebml::writer, - nitem: @native_item, path: ast_map::path) { - if !ecx.reachable.contains_key(nitem.id) { ret; } + nitem: @native_item, path: ast_map::path) + -> bool { + if !ecx.reachable.contains_key(nitem.id) { ret false; } ebml_w.start_tag(tag_items_data_item); alt nitem.node { native_item_fn(fn_decl, tps) { @@ -511,6 +513,7 @@ fn encode_info_for_native_item(ecx: @encode_ctxt, ebml_w: ebml::writer, } } ebml_w.end_tag(); + ret true; } fn encode_info_for_items(ecx: @encode_ctxt, ebml_w: ebml::writer, @@ -520,17 +523,17 @@ fn encode_info_for_items(ecx: @encode_ctxt, ebml_w: ebml::writer, index += [{val: crate_node_id, pos: ebml_w.writer.tell()}]; encode_info_for_mod(ecx, ebml_w, crate_mod, crate_node_id, [], ""); ecx.ccx.tcx.items.items {|key, val| - alt val { + let where = ebml_w.writer.tell(); + let written = alt val { middle::ast_map::node_item(i, path) { - index += [{val: key, pos: ebml_w.writer.tell()}]; - encode_info_for_item(ecx, ebml_w, i, index, *path); + encode_info_for_item(ecx, ebml_w, i, index, *path) } - middle::ast_map::node_native_item(i, path) { - index += [{val: key, pos: ebml_w.writer.tell()}]; - encode_info_for_native_item(ecx, ebml_w, i, *path); + middle::ast_map::node_native_item(i, _, path) { + encode_info_for_native_item(ecx, ebml_w, i, *path) } - _ { } - } + _ { false } + }; + if written { index += [{val: key, pos: where}]; } }; ebml_w.end_tag(); ret index; -- cgit 1.4.1-3-g733a5