Skip to content

Commit 3fd2dfb

Browse files
committed
---
yaml --- r: 20655 b: refs/heads/snap-stage3 c: da80bd1 h: refs/heads/master i: 20653: 656a4ea 20651: b794dde 20647: 5bae4b4 20639: b5e2f7e v: v3
1 parent 67d1747 commit 3fd2dfb

File tree

9 files changed

+243
-1
lines changed

9 files changed

+243
-1
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
refs/heads/master: e430a699f2c60890d9b86069fd0c68a70ece7120
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
4-
refs/heads/snap-stage3: e1d4bd463c29e4224f0ac41652d75ffac8080683
4+
refs/heads/snap-stage3: da80bd17c30db599de43355f07783ee0bf846162
55
refs/heads/try: ffbe0e0e00374358b789b0037bcb3a577cd218be
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b

branches/snap-stage3/src/libcore/core.rc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ mod tuple;
161161

162162
// Ubiquitous-utility-type modules
163163

164+
mod ops;
164165
mod cmp;
165166
mod num;
166167
mod hash;

branches/snap-stage3/src/libcore/core.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ import float::num;
3030
import f32::num;
3131
import f64::num;
3232
import num::num;
33+
import ops::{const, copy, send, owned};
34+
import ops::{add, sub, mul, div, modulo, neg, bitops, index};
3335

3436
export path, option, some, none, unreachable;
3537
export extensions;
@@ -42,6 +44,9 @@ export immutable_copyable_vector, iter_trait_extensions, vec_concat;
4244
export base_iter, copyable_iter, extended_iter;
4345
export tuple_ops, extended_tuple_ops;
4446
export ptr;
47+
// The following exports are the core operators and kinds
48+
export const, copy, send, owned;
49+
export add, sub, mul, div, modulo, neg, bitops, index;
4550

4651
// Export the log levels as global constants. Higher levels mean
4752
// more-verbosity. Error is the bottom level, default logging level is

branches/snap-stage3/src/rustc/driver/driver.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,9 @@ fn compile_upto(sess: session, cfg: ast::crate_cfg,
170170
session::sess_os_to_meta_os(sess.targ_cfg.os),
171171
sess.opts.static));
172172

173+
time(time_passes, ~"language item collection", ||
174+
middle::lang_items::collect_language_items(crate, sess));
175+
173176
let { def_map: def_map,
174177
exp_map: exp_map,
175178
impl_map: impl_map,

branches/snap-stage3/src/rustc/metadata/csearch.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export get_enum_variants;
2525
export get_impls_for_mod;
2626
export get_trait_methods;
2727
export get_method_names_if_trait;
28+
export get_item_attrs;
2829
export each_path;
2930
export get_type;
3031
export get_impl_traits;
@@ -149,6 +150,14 @@ fn get_method_names_if_trait(cstore: cstore::cstore, def: ast::def_id)
149150
ret decoder::get_method_names_if_trait(cdata, def.node);
150151
}
151152

153+
fn get_item_attrs(cstore: cstore::cstore,
154+
def_id: ast::def_id,
155+
f: fn(~[@ast::meta_item])) {
156+
157+
let cdata = cstore::get_crate_data(cstore, def_id.crate);
158+
decoder::get_item_attrs(cdata, def_id.node, f)
159+
}
160+
152161
fn get_class_fields(tcx: ty::ctxt, def: ast::def_id) -> ~[ty::field_ty] {
153162
let cstore = tcx.cstore;
154163
let cdata = cstore::get_crate_data(cstore, def.crate);

branches/snap-stage3/src/rustc/metadata/decoder.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export get_crate_vers;
3939
export get_impls_for_mod;
4040
export get_trait_methods;
4141
export get_method_names_if_trait;
42+
export get_item_attrs;
4243
export get_crate_module_paths;
4344
export def_like;
4445
export dl_def;
@@ -659,6 +660,18 @@ fn get_method_names_if_trait(cdata: cmd, node_id: ast::node_id)
659660
ret some(resulting_method_names);
660661
}
661662

663+
fn get_item_attrs(cdata: cmd,
664+
node_id: ast::node_id,
665+
f: fn(~[@ast::meta_item])) {
666+
667+
let item = lookup_item(node_id, cdata.data);
668+
do ebml::tagged_docs(item, tag_attributes) |attributes| {
669+
do ebml::tagged_docs(attributes, tag_attribute) |attribute| {
670+
f(get_meta_items(attribute));
671+
}
672+
}
673+
}
674+
662675
// Helper function that gets either fields or methods
663676
fn get_class_members(cdata: cmd, id: ast::node_id,
664677
p: fn(char) -> bool) -> ~[ty::field_ty] {

branches/snap-stage3/src/rustc/metadata/encoder.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,7 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item,
759759
encode_type_param_bounds(ebml_w, ecx, tps);
760760
encode_type(ecx, ebml_w, node_id_to_type(tcx, item.id));
761761
encode_name(ebml_w, item.ident);
762+
encode_attributes(ebml_w, item.attrs);
762763
let mut i = 0u;
763764
for vec::each(*ty::trait_methods(tcx, local_def(item.id))) |mty| {
764765
alt ms[i] {
Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
// Detecting language items.
2+
//
3+
// Language items are items that represent concepts intrinsic to the language
4+
// itself. Examples are:
5+
//
6+
// * Traits that specify "kinds"; e.g. "const", "copy", "send".
7+
//
8+
// * Traits that represent operators; e.g. "add", "sub", "index".
9+
//
10+
// * Functions called by the compiler itself.
11+
12+
import driver::session::session;
13+
import metadata::csearch::{each_path, get_item_attrs};
14+
import metadata::cstore::{iter_crate_data};
15+
import metadata::decoder::{dl_def, dl_field, dl_impl};
16+
import syntax::ast::{crate, def_id, def_ty, lit_str, meta_item, meta_list};
17+
import syntax::ast::{meta_name_value, meta_word};
18+
import syntax::ast_util::{local_def};
19+
import syntax::visit::{default_simple_visitor, mk_simple_visitor};
20+
import syntax::visit::{visit_crate, visit_item};
21+
22+
import std::map::{hashmap, str_hash};
23+
import str_eq = str::eq;
24+
25+
class LanguageItems {
26+
let mut const_trait: option<def_id>;
27+
let mut copy_trait: option<def_id>;
28+
let mut send_trait: option<def_id>;
29+
let mut owned_trait: option<def_id>;
30+
31+
let mut add_trait: option<def_id>;
32+
let mut sub_trait: option<def_id>;
33+
let mut mul_trait: option<def_id>;
34+
let mut div_trait: option<def_id>;
35+
let mut modulo_trait: option<def_id>;
36+
let mut neg_trait: option<def_id>;
37+
let mut bitops_trait: option<def_id>;
38+
let mut index_trait: option<def_id>;
39+
40+
new() {
41+
self.const_trait = none;
42+
self.copy_trait = none;
43+
self.send_trait = none;
44+
self.owned_trait = none;
45+
46+
self.add_trait = none;
47+
self.sub_trait = none;
48+
self.mul_trait = none;
49+
self.div_trait = none;
50+
self.modulo_trait = none;
51+
self.neg_trait = none;
52+
self.bitops_trait = none;
53+
self.index_trait = none;
54+
}
55+
}
56+
57+
class LanguageItemCollector {
58+
let items: LanguageItems;
59+
60+
let crate: @crate;
61+
let session: session;
62+
63+
let item_refs: hashmap<~str,&mut option<def_id>>;
64+
65+
new(crate: @crate, session: session) {
66+
self.crate = crate;
67+
self.session = session;
68+
69+
self.items = LanguageItems();
70+
71+
self.item_refs = str_hash();
72+
}
73+
74+
// XXX: Needed to work around an issue with constructors.
75+
fn init() {
76+
self.item_refs.insert(~"const", &mut self.items.const_trait);
77+
self.item_refs.insert(~"copy", &mut self.items.copy_trait);
78+
self.item_refs.insert(~"send", &mut self.items.send_trait);
79+
self.item_refs.insert(~"owned", &mut self.items.owned_trait);
80+
81+
self.item_refs.insert(~"add", &mut self.items.add_trait);
82+
self.item_refs.insert(~"sub", &mut self.items.sub_trait);
83+
self.item_refs.insert(~"mul", &mut self.items.mul_trait);
84+
self.item_refs.insert(~"div", &mut self.items.div_trait);
85+
self.item_refs.insert(~"modulo", &mut self.items.modulo_trait);
86+
self.item_refs.insert(~"neg", &mut self.items.neg_trait);
87+
self.item_refs.insert(~"bitops", &mut self.items.bitops_trait);
88+
self.item_refs.insert(~"index", &mut self.items.index_trait);
89+
}
90+
91+
fn match_and_collect_meta_item(item_def_id: def_id,
92+
meta_item: meta_item) {
93+
94+
alt meta_item.node {
95+
meta_name_value(key, literal) => {
96+
alt literal.node {
97+
lit_str(value) => {
98+
self.match_and_collect_item(item_def_id,
99+
*key,
100+
*value);
101+
}
102+
_ => {
103+
// Skip.
104+
}
105+
}
106+
}
107+
meta_word(*) | meta_list(*) {
108+
// Skip.
109+
}
110+
}
111+
}
112+
113+
fn match_and_collect_item(item_def_id: def_id, key: ~str, value: ~str) {
114+
if !str_eq(key, ~"lang") {
115+
ret; // Didn't match.
116+
}
117+
118+
alt self.item_refs.find(value) {
119+
none => {
120+
// Didn't match.
121+
}
122+
some(item_ref) => {
123+
// Check for duplicates.
124+
alt copy *item_ref {
125+
some(original_def_id)
126+
if original_def_id != item_def_id => {
127+
128+
self.session.warn(#fmt("duplicate entry for `%s`",
129+
value));
130+
}
131+
some(_) | none => {
132+
// OK.
133+
}
134+
}
135+
136+
// Matched.
137+
*item_ref = some(item_def_id);
138+
}
139+
}
140+
}
141+
142+
fn collect_local_language_items() {
143+
let this = unsafe { ptr::addr_of(self) };
144+
visit_crate(*self.crate, (), mk_simple_visitor(@{
145+
visit_item: |item| {
146+
for item.attrs.each |attribute| {
147+
unsafe {
148+
(*this).match_and_collect_meta_item(local_def(item
149+
.id),
150+
attribute.node
151+
.value);
152+
}
153+
}
154+
}
155+
with *default_simple_visitor()
156+
}));
157+
}
158+
159+
fn collect_external_language_items() {
160+
let crate_store = self.session.cstore;
161+
do iter_crate_data(crate_store) |crate_number, _crate_metadata| {
162+
for each_path(crate_store, crate_number) |path_entry| {
163+
let def_id;
164+
alt path_entry.def_like {
165+
dl_def(def_ty(did)) => {
166+
def_id = did;
167+
}
168+
dl_def(_) | dl_impl(_) | dl_field {
169+
// Skip this.
170+
again;
171+
}
172+
}
173+
174+
do get_item_attrs(crate_store, def_id) |meta_items| {
175+
for meta_items.each |meta_item| {
176+
self.match_and_collect_meta_item(def_id, *meta_item);
177+
}
178+
}
179+
}
180+
}
181+
}
182+
183+
fn check_completeness() {
184+
for self.item_refs.each |key, item_ref| {
185+
alt copy *item_ref {
186+
none => {
187+
self.session.warn(#fmt("no item found for `%s`", key));
188+
}
189+
some(did) => {
190+
// OK.
191+
}
192+
}
193+
}
194+
}
195+
196+
fn collect() {
197+
self.init();
198+
self.collect_local_language_items();
199+
self.collect_external_language_items();
200+
self.check_completeness();
201+
}
202+
}
203+
204+
fn collect_language_items(crate: @crate, session: session) -> LanguageItems {
205+
let collector = LanguageItemCollector(crate, session);
206+
collector.collect();
207+
copy collector.items
208+
}
209+

branches/snap-stage3/src/rustc/rustc.rc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ mod middle {
8888
mod region;
8989
mod const_eval;
9090
mod astencode;
91+
mod lang_items;
9192
}
9293

9394
mod front {

0 commit comments

Comments
 (0)