Skip to content

Commit 8ac60e9

Browse files
committed
Extract meta_item sorting from back::link to middle::attr
1 parent aecc5e6 commit 8ac60e9

File tree

2 files changed

+40
-23
lines changed

2 files changed

+40
-23
lines changed

src/comp/back/link.rs

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -306,32 +306,15 @@ fn crate_link_metas(&ast::crate c) -> link_metas {
306306

307307
// This calculates CMH as defined above
308308
fn crate_meta_extras_hash(sha1 sha, &ast::crate crate) -> str {
309-
// FIXME (#487) Move this sorting stuff into middle::attr
310-
fn lteq(&@ast::meta_item ma, &@ast::meta_item mb) -> bool {
311-
fn key(&@ast::meta_item m) -> ast::ident {
312-
alt (m.node) {
313-
case (ast::meta_word(?name)) {
314-
name
315-
}
316-
case (ast::meta_name_value(?name, _)) {
317-
name
318-
}
319-
case (ast::meta_list(?name, _)) {
320-
name
321-
}
322-
}
323-
}
324-
ret key(ma) <= key(mb);
325-
}
326309
fn len_and_str(&str s) -> str { ret #fmt("%u_%s", str::byte_len(s), s); }
310+
311+
auto cmh_items = {
312+
auto cmh_items = crate_link_metas(crate).cmh_items;
313+
attr::sort_meta_items(cmh_items)
314+
};
327315

328-
let vec[mutable @ast::meta_item] v = [mutable ];
329-
for (@ast::meta_item mi in crate_link_metas(crate).cmh_items) {
330-
v += [mutable mi];
331-
}
332-
sort::quick_sort(lteq, v);
333316
sha.reset();
334-
for (@ast::meta_item m_ in v) {
317+
for (@ast::meta_item m_ in cmh_items) {
335318
auto m = m_;
336319
alt (m.node) {
337320
case (ast::meta_name_value(?key, ?value)) {

src/comp/middle/attr.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export attr_metas;
88
export find_linkage_metas;
99
export find_attrs_by_name;
1010
export contains;
11+
export sort_meta_items;
1112

1213
// From a list of crate attributes get only the meta_items that impact crate
1314
// linkage
@@ -103,6 +104,39 @@ fn contains(&vec[@ast::meta_item] haystack, @ast::meta_item needle) -> bool {
103104
ret false;
104105
}
105106

107+
fn sort_meta_items(&vec[@ast::meta_item] items) -> vec[@ast::meta_item] {
108+
fn lteq(&@ast::meta_item ma, &@ast::meta_item mb) -> bool {
109+
fn key(&@ast::meta_item m) -> ast::ident {
110+
alt (m.node) {
111+
case (ast::meta_word(?name)) {
112+
name
113+
}
114+
case (ast::meta_name_value(?name, _)) {
115+
name
116+
}
117+
case (ast::meta_list(?name, _)) {
118+
name
119+
}
120+
}
121+
}
122+
ret key(ma) <= key(mb);
123+
}
124+
125+
// This is sort of stupid here, converting to a vec of mutables and back
126+
let vec[mutable @ast::meta_item] v = [mutable ];
127+
for (@ast::meta_item mi in items) {
128+
v += [mutable mi];
129+
}
130+
131+
std::sort::quick_sort(lteq, v);
132+
133+
let vec[@ast::meta_item] v2 = [];
134+
for (@ast::meta_item mi in v) {
135+
v2 += [mi]
136+
}
137+
ret v2;
138+
}
139+
106140
//
107141
// Local Variables:
108142
// mode: rust

0 commit comments

Comments
 (0)