Skip to content

Commit 401b636

Browse files
committed
rustc: Make meta items into interior vectors
1 parent 479ce4d commit 401b636

File tree

10 files changed

+90
-66
lines changed

10 files changed

+90
-66
lines changed

src/comp/driver/rustc.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,13 @@ fn default_configuration(session::session sess, str argv0, str input) ->
5050

5151
auto mk = attr::mk_name_value_item_str;
5252

53-
ret [ // Target bindings.
54-
mk("target_os", std::os::target_os()),
55-
mk("target_arch", "x86"),
56-
mk("target_libc", libc),
57-
// Build bindings.
58-
mk("build_compiler", argv0),
59-
mk("build_input", input)];
53+
ret ~[ // Target bindings.
54+
mk("target_os", std::os::target_os()),
55+
mk("target_arch", "x86"),
56+
mk("target_libc", libc),
57+
// Build bindings.
58+
mk("build_compiler", argv0),
59+
mk("build_input", input)];
6060
}
6161

6262
fn build_configuration(session::session sess, str argv0,
@@ -70,10 +70,9 @@ fn build_configuration(session::session sess, str argv0,
7070
fn parse_cfgspecs(&vec[str] cfgspecs) -> ast::crate_cfg {
7171
// FIXME: It would be nice to use the parser to parse all varieties of
7272
// meta_item here. At the moment we just support the meta_word variant.
73-
fn to_meta_word(&str cfgspec) -> @ast::meta_item {
74-
attr::mk_word_item(cfgspec)
75-
}
76-
ret vec::map(to_meta_word, cfgspecs);
73+
auto words = ~[];
74+
for (str s in cfgspecs) { words += ~[attr::mk_word_item(s)]; }
75+
ret words;
7776
}
7877

7978
fn parse_input(session::session sess, &ast::crate_cfg cfg, str input)

src/comp/front/attr.rs

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,11 @@ export mk_attr;
2929

3030
// From a list of crate attributes get only the meta_items that impact crate
3131
// linkage
32-
fn find_linkage_metas(&ast::attribute[] attrs) -> vec[@ast::meta_item] {
33-
let vec[@ast::meta_item] metas = [];
32+
fn find_linkage_metas(&ast::attribute[] attrs) -> (@ast::meta_item)[] {
33+
let (@ast::meta_item)[] metas = ~[];
3434
for (ast::attribute attr in find_attrs_by_name(attrs, "link")) {
3535
alt (attr.node.value.node) {
36-
case (ast::meta_list(_, ?items)) {
37-
metas += items;
38-
}
36+
case (ast::meta_list(_, ?items)) { metas += items; }
3937
case (_) {
4038
log "ignoring link attribute that has incorrect type";
4139
}
@@ -62,8 +60,8 @@ fn get_attr_name(&ast::attribute attr) -> ast::ident {
6260
get_meta_item_name(@attr.node.value)
6361
}
6462

65-
fn find_meta_items_by_name(vec[@ast::meta_item] metas,
66-
ast::ident name) -> vec[@ast::meta_item] {
63+
fn find_meta_items_by_name(&(@ast::meta_item)[] metas,
64+
ast::ident name) -> (@ast::meta_item)[] {
6765
auto filter = bind fn(&@ast::meta_item m,
6866
ast::ident name) -> option::t[@ast::meta_item] {
6967
if (get_meta_item_name(m) == name) {
@@ -72,7 +70,7 @@ fn find_meta_items_by_name(vec[@ast::meta_item] metas,
7270
option::none
7371
}
7472
} (_, name);
75-
ret vec::filter_map(filter, metas);
73+
ret ivec::filter_map(filter, metas);
7674
}
7775

7876
fn get_meta_item_name(&@ast::meta_item meta) -> ast::ident {
@@ -102,9 +100,9 @@ fn get_meta_item_value_str(&@ast::meta_item meta) -> option::t[str] {
102100
fn attr_meta(&ast::attribute attr) -> @ast::meta_item { @attr.node.value }
103101

104102
// Get the meta_items from inside a vector of attributes
105-
fn attr_metas(&ast::attribute[] attrs) -> vec[@ast::meta_item] {
106-
auto mitems = [];
107-
for (ast::attribute a in attrs) { mitems += [attr_meta(a)]; }
103+
fn attr_metas(&ast::attribute[] attrs) -> (@ast::meta_item)[] {
104+
auto mitems = ~[];
105+
for (ast::attribute a in attrs) { mitems += ~[attr_meta(a)]; }
108106
ret mitems;
109107
}
110108

@@ -133,7 +131,7 @@ fn eq(@ast::meta_item a, @ast::meta_item b) -> bool {
133131
}
134132
}
135133

136-
fn contains(&vec[@ast::meta_item] haystack, @ast::meta_item needle) -> bool {
134+
fn contains(&(@ast::meta_item)[] haystack, @ast::meta_item needle) -> bool {
137135
log #fmt("looking for %s",
138136
syntax::print::pprust::meta_item_to_str(*needle));
139137
for (@ast::meta_item item in haystack) {
@@ -182,8 +180,8 @@ fn sort_meta_items(&vec[@ast::meta_item] items) -> vec[@ast::meta_item] {
182180
ret v2;
183181
}
184182

185-
fn remove_meta_items_by_name(&vec[@ast::meta_item] items,
186-
str name) -> vec[@ast::meta_item] {
183+
fn remove_meta_items_by_name(&(@ast::meta_item)[] items,
184+
str name) -> (@ast::meta_item)[] {
187185

188186
auto filter = bind fn(&@ast::meta_item item,
189187
str name) -> option::t[@ast::meta_item] {
@@ -194,10 +192,10 @@ fn remove_meta_items_by_name(&vec[@ast::meta_item] items,
194192
}
195193
} (_, name);
196194

197-
ret vec::filter_map(filter, items);
195+
ret ivec::filter_map(filter, items);
198196
}
199197

200-
fn require_unique_names(&session::session sess, &vec[@ast::meta_item] metas) {
198+
fn require_unique_names(&session::session sess, &(@ast::meta_item)[] metas) {
201199
auto map = map::mk_hashmap[str, ()](str::hash, str::eq);
202200
for (@ast::meta_item meta in metas) {
203201
auto name = get_meta_item_name(meta);
@@ -222,8 +220,8 @@ fn mk_name_value_item(ast::ident name, ast::lit value) -> @ast::meta_item {
222220
ret @span(ast::meta_name_value(name, value));
223221
}
224222

225-
fn mk_list_item(ast::ident name,
226-
&vec[@ast::meta_item] items) -> @ast::meta_item {
223+
fn mk_list_item(ast::ident name, &(@ast::meta_item)[] items)
224+
-> @ast::meta_item {
227225
ret @span(ast::meta_list(name, items));
228226
}
229227

src/comp/front/config.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,9 @@ fn in_cfg(&ast::crate_cfg cfg, &ast::attribute[] attrs) -> bool {
109109
// so we can match against them. This is the list of configurations for
110110
// which the item is valid
111111
auto item_cfg_metas = {
112-
fn extract_metas(&vec[@ast::meta_item] inner_items,
112+
fn extract_metas(&(@ast::meta_item)[] inner_items,
113113
&@ast::meta_item cfg_item)
114-
-> vec[@ast::meta_item] {
114+
-> (@ast::meta_item)[] {
115115

116116
alt (cfg_item.node) {
117117
case (ast::meta_list(?name, ?items)) {
@@ -122,13 +122,11 @@ fn in_cfg(&ast::crate_cfg cfg, &ast::attribute[] attrs) -> bool {
122122
}
123123
}
124124
auto cfg_metas = attr::attr_metas(item_cfg_attrs);
125-
vec::foldl(extract_metas, [], cfg_metas)
125+
ivec::foldl(extract_metas, ~[], cfg_metas)
126126
};
127127

128128
for (@ast::meta_item cfg_mi in item_cfg_metas) {
129-
if (attr::contains(cfg, cfg_mi)) {
130-
ret true;
131-
}
129+
if (attr::contains(cfg, cfg_mi)) { ret true; }
132130
}
133131

134132
ret false;

src/comp/metadata/creader.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import syntax::walk;
1212
import syntax::codemap::span;
1313
import back::x86;
1414
import util::common;
15+
import std::ivec;
1516
import std::str;
1617
import std::vec;
1718
import std::ebml;
@@ -28,12 +29,12 @@ export read_crates;
2829
export list_file_metadata;
2930

3031
fn metadata_matches(&vec[u8] crate_data,
31-
&vec[@ast::meta_item] metas) -> bool {
32+
&(@ast::meta_item)[] metas) -> bool {
3233
auto attrs = decoder::get_crate_attributes(crate_data);
3334
auto linkage_metas = attr::find_linkage_metas(attrs);
3435

3536
log #fmt("matching %u metadata requirements against %u items",
36-
vec::len(metas), vec::len(linkage_metas));
37+
ivec::len(metas), ivec::len(linkage_metas));
3738

3839
for (@ast::meta_item needed in metas) {
3940
if (!attr::contains(linkage_metas, needed)) {
@@ -54,15 +55,15 @@ fn default_native_lib_naming(session::session sess) ->
5455
}
5556

5657
fn find_library_crate(&session::session sess, &ast::ident ident,
57-
&vec[@ast::meta_item] metas,
58+
&(@ast::meta_item)[] metas,
5859
&vec[str] library_search_paths) ->
5960
option::t[tup(str, vec[u8])] {
6061

6162
attr::require_unique_names(sess, metas);
6263

6364
auto crate_name = {
6465
auto name_items = attr::find_meta_items_by_name(metas, "name");
65-
alt (vec::last(name_items)) {
66+
alt (ivec::last(name_items)) {
6667
case (some(?i)) {
6768
alt (attr::get_meta_item_value_str(i)) {
6869
case (some(?n)) { n }
@@ -133,7 +134,7 @@ fn get_metadata_section(str filename) -> option::t[vec[u8]] {
133134
}
134135

135136
fn load_library_crate(&session::session sess, span span, int cnum,
136-
&ast::ident ident, vec[@ast::meta_item] metas,
137+
&ast::ident ident, &(@ast::meta_item)[] metas,
137138
&vec[str] library_search_paths) {
138139
alt (find_library_crate(sess, ident, metas, library_search_paths)) {
139140
case (some(?t)) {

src/comp/metadata/decoder.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Metadata decoding
22

33
import std::ebml;
4+
import std::ivec;
45
import std::option;
56
import std::vec;
67
import std::str;
@@ -262,13 +263,13 @@ fn item_kind_to_str(u8 kind) -> str {
262263
}
263264
}
264265

265-
fn get_meta_items(&ebml::doc md) -> vec[@ast::meta_item] {
266-
let vec[@ast::meta_item] items = [];
266+
fn get_meta_items(&ebml::doc md) -> (@ast::meta_item)[] {
267+
let (@ast::meta_item)[] items = ~[];
267268
for each (ebml::doc meta_item_doc in
268269
ebml::tagged_docs(md, tag_meta_item_word)) {
269270
auto nd = ebml::get_doc(meta_item_doc, tag_meta_item_name);
270271
auto n = str::unsafe_from_bytes(ebml::doc_data(nd));
271-
items += [attr::mk_word_item(n)];
272+
items += ~[attr::mk_word_item(n)];
272273
}
273274
for each (ebml::doc meta_item_doc in
274275
ebml::tagged_docs(md, tag_meta_item_name_value)) {
@@ -278,14 +279,14 @@ fn get_meta_items(&ebml::doc md) -> vec[@ast::meta_item] {
278279
auto v = str::unsafe_from_bytes(ebml::doc_data(vd));
279280
// FIXME (#611): Should be able to decode meta_name_value variants,
280281
// but currently they can't be encoded
281-
items += [attr::mk_name_value_item_str(n, v)];
282+
items += ~[attr::mk_name_value_item_str(n, v)];
282283
}
283284
for each (ebml::doc meta_item_doc in
284285
ebml::tagged_docs(md, tag_meta_item_list)) {
285286
auto nd = ebml::get_doc(meta_item_doc, tag_meta_item_name);
286287
auto n = str::unsafe_from_bytes(ebml::doc_data(nd));
287288
auto subitems = get_meta_items(meta_item_doc);
288-
items += [attr::mk_list_item(n, subitems)];
289+
items += ~[attr::mk_list_item(n, subitems)];
289290
}
290291
ret items;
291292
}
@@ -299,7 +300,7 @@ fn get_attributes(&ebml::doc md) -> ast::attribute[] {
299300
auto meta_items = get_meta_items(attr_doc);
300301
// Currently it's only possible to have a single meta item on
301302
// an attribute
302-
assert (vec::len(meta_items) == 1u);
303+
assert (ivec::len(meta_items) == 1u);
303304
auto meta_item = meta_items.(0);
304305
attrs += ~[rec(node=rec(style=ast::attr_outer,
305306
value=*meta_item),

src/comp/metadata/encoder.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -473,9 +473,8 @@ fn encode_attributes(&ebml::writer ebml_w, &vec[attribute] attrs) {
473473
fn synthesize_crate_attrs(&@crate_ctxt cx,
474474
&@crate crate) -> vec[attribute] {
475475

476-
fn synthesize_link_attr(&@crate_ctxt cx,
477-
&vec[@meta_item] items)
478-
-> attribute {
476+
fn synthesize_link_attr(&@crate_ctxt cx, &(@meta_item)[] items)
477+
-> attribute {
479478

480479
assert cx.link_meta.name != "";
481480
assert cx.link_meta.vers != "";
@@ -490,7 +489,7 @@ fn synthesize_crate_attrs(&@crate_ctxt cx,
490489
attr::remove_meta_items_by_name(tmp, "vers")
491490
};
492491

493-
auto meta_items = [name_item] + [vers_item] + other_items;
492+
auto meta_items = ~[name_item, vers_item] + other_items;
494493
auto link_item = attr::mk_list_item("link", meta_items);
495494

496495
ret attr::mk_attr(link_item);
@@ -513,7 +512,7 @@ fn synthesize_crate_attrs(&@crate_ctxt cx,
513512
}
514513

515514
if (!found_link_attr) {
516-
attrs += [synthesize_link_attr(cx, [])];
515+
attrs += [synthesize_link_attr(cx, ~[])];
517516
}
518517

519518
ret attrs;

src/comp/syntax/ast.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ fn def_id_of_def(def d) -> def_id {
8181

8282
// The set of meta_items that define the compilation environment of the crate,
8383
// used to drive conditional compilation
84-
type crate_cfg = vec[@meta_item];
84+
type crate_cfg = (@meta_item)[];
8585

8686
type crate = spanned[crate_];
8787

@@ -105,7 +105,7 @@ type meta_item = spanned[meta_item_];
105105

106106
tag meta_item_ {
107107
meta_word(ident);
108-
meta_list(ident, vec[@meta_item]);
108+
meta_list(ident, (@meta_item)[]);
109109
meta_name_value(ident, lit);
110110
}
111111

@@ -505,7 +505,7 @@ type variant = spanned[variant_];
505505
type view_item = spanned[view_item_];
506506

507507
tag view_item_ {
508-
view_item_use(ident, vec[@meta_item], node_id);
508+
view_item_use(ident, (@meta_item)[], node_id);
509509
view_item_import(ident, vec[ident], node_id);
510510
view_item_import_glob(vec[ident], node_id);
511511
view_item_export(ident, node_id);

src/comp/syntax/fold.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ fn fold_meta_item_(&@meta_item mi, ast_fold fld) -> @meta_item {
104104
case (meta_word(?id)) { meta_word(fld.fold_ident(id)) }
105105
case (meta_list(?id, ?mis)) {
106106
auto fold_meta_item = bind fold_meta_item_(_,fld);
107-
meta_list(id, map(fold_meta_item, mis))
107+
meta_list(id, ivec::map(fold_meta_item, mis))
108108
}
109109
case (meta_name_value(?id,?s)) {
110110
meta_name_value(fld.fold_ident(id),s)
@@ -135,7 +135,7 @@ fn noop_fold_crate(&crate_ c, ast_fold fld) -> crate_ {
135135
ret rec(directives=ivec::map(fld.fold_crate_directive, c.directives),
136136
module=fld.fold_mod(c.module),
137137
attrs=ivec::map(fold_attribute, c.attrs),
138-
config=vec::map(fold_meta_item, c.config));
138+
config=ivec::map(fold_meta_item, c.config));
139139
}
140140

141141
fn noop_fold_crate_directive(&crate_directive_ cd, ast_fold fld)

0 commit comments

Comments
 (0)