From b6ad34bef4f0b3613d51557cd327055a2c5311fd Mon Sep 17 00:00:00 2001 From: Marijn Haverbeke Date: Fri, 9 Mar 2012 13:35:20 +0100 Subject: Properly recognize external intrinsics --- src/rustc/metadata/common.rs | 1 + src/rustc/metadata/csearch.rs | 6 ++++++ src/rustc/metadata/decoder.rs | 8 ++++++++ src/rustc/metadata/encoder.rs | 24 +++++++++++++++--------- 4 files changed, 30 insertions(+), 9 deletions(-) (limited to 'src/rustc/metadata') diff --git a/src/rustc/metadata/common.rs b/src/rustc/metadata/common.rs index db3dc4078ed..88800e17aff 100644 --- a/src/rustc/metadata/common.rs +++ b/src/rustc/metadata/common.rs @@ -68,6 +68,7 @@ const tag_mod_impl: uint = 0x30u; const tag_item_method: uint = 0x31u; const tag_impl_iface: uint = 0x32u; +const tag_item_is_intrinsic: uint = 0x33u; // discriminator value for variants const tag_disr_val: uint = 0x34u; diff --git a/src/rustc/metadata/csearch.rs b/src/rustc/metadata/csearch.rs index 6be4124d5e6..08836703836 100644 --- a/src/rustc/metadata/csearch.rs +++ b/src/rustc/metadata/csearch.rs @@ -19,6 +19,7 @@ export get_type; export get_impl_iface; export get_impl_method; export get_item_path; +export item_is_intrinsic; export maybe_get_item_ast, found_ast, found, found_parent, not_found; fn get_symbol(cstore: cstore::cstore, def: ast::def_id) -> str { @@ -134,6 +135,11 @@ fn get_impl_method(cstore: cstore::cstore, def: ast::def_id, mname: str) decoder::get_impl_method(cdata, def.node, mname) } +fn item_is_intrinsic(cstore: cstore::cstore, def: ast::def_id) -> bool { + let cdata = cstore::get_crate_data(cstore, def.crate); + decoder::item_is_intrinsic(cdata, def.node) +} + // Local Variables: // mode: rust // fill-column: 78; diff --git a/src/rustc/metadata/decoder.rs b/src/rustc/metadata/decoder.rs index ac6e32f292d..70c771b85c1 100644 --- a/src/rustc/metadata/decoder.rs +++ b/src/rustc/metadata/decoder.rs @@ -34,6 +34,7 @@ export get_iface_methods; export get_crate_module_paths; export get_item_path; export maybe_get_item_ast; +export item_is_intrinsic; // Used internally by astencode: export translate_def_id; @@ -272,6 +273,13 @@ fn get_impl_method(cdata: cmd, id: ast::node_id, name: str) -> ast::def_id { option::get(found) } +fn item_is_intrinsic(cdata: cmd, id: ast::node_id) -> bool { + let intrinsic = false; + ebml::tagged_docs(lookup_item(id, cdata.data), tag_item_is_intrinsic, + {|_i| intrinsic = true;}); + intrinsic +} + fn get_symbol(data: @[u8], id: ast::node_id) -> str { ret item_symbol(lookup_item(id, data)); } diff --git a/src/rustc/metadata/encoder.rs b/src/rustc/metadata/encoder.rs index 57813f1791b..fee50a927e6 100644 --- a/src/rustc/metadata/encoder.rs +++ b/src/rustc/metadata/encoder.rs @@ -502,7 +502,7 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item, fn encode_info_for_native_item(ecx: @encode_ctxt, ebml_w: ebml::writer, nitem: @native_item, index: @mutable [entry], - path: ast_map::path) { + path: ast_map::path, abi: native_abi) { if !ecx.reachable.contains_key(nitem.id) { ret; } *index += [{val: nitem.id, pos: ebml_w.writer.tell()}]; @@ -512,6 +512,10 @@ fn encode_info_for_native_item(ecx: @encode_ctxt, ebml_w: ebml::writer, encode_def_id(ebml_w, local_def(nitem.id)); encode_family(ebml_w, purity_fn_family(fn_decl.purity)); encode_type_param_bounds(ebml_w, ecx, tps); + if abi == native_abi_rust_intrinsic { + ebml_w.start_tag(tag_item_is_intrinsic); + ebml_w.end_tag(); + } encode_type(ecx, ebml_w, node_id_to_type(ecx.ccx.tcx, nitem.id)); encode_symbol(ecx, ebml_w, nitem.id); encode_path(ebml_w, path, ast_map::path_name(nitem.ident)); @@ -531,17 +535,19 @@ fn encode_info_for_items(ecx: @encode_ctxt, ebml_w: ebml::writer, visit_expr: {|_e, _cx, _v|}, visit_item: {|i, cx, v| visit::visit_item(i, cx, v); - let path = alt check ecx.ccx.tcx.items.get(i.id) { - ast_map::node_item(_, pt) { pt } - }; - encode_info_for_item(ecx, ebml_w, i, index, *path); + alt check ecx.ccx.tcx.items.get(i.id) { + ast_map::node_item(_, pt) { + encode_info_for_item(ecx, ebml_w, i, index, *pt); + } + } }, visit_native_item: {|ni, cx, v| visit::visit_native_item(ni, cx, v); - let path = alt check ecx.ccx.tcx.items.get(ni.id) { - ast_map::node_native_item(_, _, pt) { pt } - }; - encode_info_for_native_item(ecx, ebml_w, ni, index, *path); + alt check ecx.ccx.tcx.items.get(ni.id) { + ast_map::node_native_item(_, abi, pt) { + encode_info_for_native_item(ecx, ebml_w, ni, index, *pt, abi); + } + } } with *visit::default_visitor() })); -- cgit 1.4.1-3-g733a5