Skip to content

Commit e650357

Browse files
committed
---
yaml --- r: 35263 b: refs/heads/master c: 61cfec3 h: refs/heads/master i: 35261: 09a0869 35259: 0367dcb 35255: 3b63ff5 35247: 24b8558 35231: c082bee 35199: e5801a3 v: v3
1 parent 47f46c4 commit e650357

File tree

8 files changed

+55
-9
lines changed

8 files changed

+55
-9
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: d2d6d955f45682399bce2a270e1ffaf2908fe0b0
2+
refs/heads/master: 61cfec3c52d3ac316b627c4b20c9c6e81e7521f2
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: eb8fd119c65c67f3b1b8268cc7341c22d39b7b61
55
refs/heads/try: d324a424d8f84b1eb049b12cf34182bda91b0024

trunk/src/librustc/front/config.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ fn fold_foreign_mod(cx: ctxt, nm: ast::foreign_mod,
7575
|a| filter_view_item(cx, *a));
7676
return {
7777
sort: nm.sort,
78+
abi: nm.abi,
7879
view_items: vec::map(filtered_view_items, |x| fld.fold_view_item(*x)),
7980
items: filtered_items
8081
};

trunk/src/libsyntax/ast.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1861,6 +1861,7 @@ impl foreign_abi : cmp::Eq {
18611861
#[auto_deserialize]
18621862
type foreign_mod =
18631863
{sort: foreign_mod_sort,
1864+
abi: ident,
18641865
view_items: ~[@view_item],
18651866
items: ~[@foreign_item]};
18661867

trunk/src/libsyntax/fold.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -546,8 +546,9 @@ fn noop_fold_mod(m: _mod, fld: ast_fold) -> _mod {
546546

547547
fn noop_fold_foreign_mod(nm: foreign_mod, fld: ast_fold) -> foreign_mod {
548548
return {sort: nm.sort,
549-
view_items: vec::map(nm.view_items, |x| fld.fold_view_item(*x)),
550-
items: vec::map(nm.items, |x| fld.fold_foreign_item(*x))}
549+
abi: nm.abi,
550+
view_items: vec::map(nm.view_items, |x| fld.fold_view_item(*x)),
551+
items: vec::map(nm.items, |x| fld.fold_foreign_item(*x))}
551552
}
552553

553554
fn noop_fold_variant(v: variant_, fld: ast_fold) -> variant_ {

trunk/src/libsyntax/parse/parser.rs

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3043,8 +3043,9 @@ impl Parser {
30433043
}
30443044
30453045
fn parse_foreign_mod_items(sort: ast::foreign_mod_sort,
3046-
+first_item_attrs: ~[attribute]) ->
3047-
foreign_mod {
3046+
+abi: ast::ident,
3047+
+first_item_attrs: ~[attribute])
3048+
-> foreign_mod {
30483049
// Shouldn't be any view items since we've already parsed an item attr
30493050
let {attrs_remaining, view_items, items: _, foreign_items} =
30503051
self.parse_items_and_view_items(first_item_attrs,
@@ -3058,8 +3059,12 @@ impl Parser {
30583059
initial_attrs = ~[];
30593060
items.push(self.parse_foreign_item(attrs));
30603061
}
3061-
return {sort: sort, view_items: view_items,
3062-
items: items};
3062+
return {
3063+
sort: sort,
3064+
abi: move abi,
3065+
view_items: view_items,
3066+
items: items
3067+
};
30633068
}
30643069
30653070
fn parse_item_foreign_mod(lo: BytePos,
@@ -3068,6 +3073,18 @@ impl Parser {
30683073
items_allowed: bool)
30693074
-> item_or_view_item {
30703075
3076+
// Parse the ABI.
3077+
let abi_opt;
3078+
match self.token {
3079+
token::LIT_STR(copy found_abi) => {
3080+
self.bump();
3081+
abi_opt = Some(found_abi);
3082+
}
3083+
_ => {
3084+
abi_opt = None;
3085+
}
3086+
}
3087+
30713088
let mut must_be_named_mod = false;
30723089
if self.is_keyword(~"mod") {
30733090
must_be_named_mod = true;
@@ -3096,16 +3113,33 @@ impl Parser {
30963113
30973114
// extern mod { ... }
30983115
if items_allowed && self.eat(token::LBRACE) {
3116+
let abi;
3117+
match move abi_opt {
3118+
Some(move found_abi) => abi = move found_abi,
3119+
None => abi = special_idents::c_abi,
3120+
}
3121+
30993122
let extra_attrs = self.parse_inner_attrs_and_next();
3100-
let m = self.parse_foreign_mod_items(sort, extra_attrs.next);
3123+
let m = self.parse_foreign_mod_items(sort,
3124+
move abi,
3125+
extra_attrs.next);
31013126
self.expect(token::RBRACE);
3127+
31023128
return iovi_item(self.mk_item(lo, self.last_span.hi, ident,
31033129
item_foreign_mod(m), visibility,
31043130
maybe_append(attrs,
31053131
Some(extra_attrs.
31063132
inner))));
31073133
}
31083134
3135+
match abi_opt {
3136+
None => {} // OK.
3137+
Some(_) => {
3138+
self.span_err(copy self.span, ~"an ABI may not be specified \
3139+
here");
3140+
}
3141+
}
3142+
31093143
// extern mod foo;
31103144
let metadata = self.parse_optional_meta();
31113145
self.expect(token::SEMI);

trunk/src/libsyntax/parse/token.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ mod special_idents {
322322
const intrinsic : ident = ident { repr: 32u };
323323
const clownshoes_foreign_mod: ident = ident { repr: 33 };
324324
const unnamed_field: ident = ident { repr: 34 };
325+
const c_abi: ident = ident { repr: 35 };
325326
}
326327

327328
struct ident_interner {
@@ -368,7 +369,8 @@ fn mk_ident_interner() -> @ident_interner {
368369
@~"str", @~"TyVisitor", @~"arg", @~"descrim",
369370
@~"__rust_abi", @~"__rust_stack_shim", @~"TyDesc",
370371
@~"dtor", @~"main", @~"<opaque>", @~"blk", @~"static",
371-
@~"intrinsic", @~"__foreign_mod__"
372+
@~"intrinsic", @~"__foreign_mod__", @~"__field__",
373+
@~"C"
372374
];
373375

374376
let rv = @ident_interner {

trunk/src/libsyntax/print/pprust.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,7 @@ fn print_item(s: ps, &&item: @ast::item) {
485485
}
486486
ast::item_foreign_mod(nmod) => {
487487
head(s, visibility_qualified(item.vis, ~"extern"));
488+
print_string(s, *s.intr.get(nmod.abi));
488489
match nmod.sort {
489490
ast::named => {
490491
word_nbsp(s, ~"mod");
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
extern "C" {
2+
fn pow(x: f64, y: f64) -> f64;
3+
}
4+
5+
fn main() {}
6+

0 commit comments

Comments
 (0)