Use attributes for native module ABI and link name [temp]

This patch adds support of using attributes to specify native mode ABI
and link name. The old optional syntax like:
  native "cdecl" mod llvm = "rustllvm" { ... }
is still supported.

This is a transitional commit to avoid making a stage1 (backward
imcompatible) snapshot.
This commit is contained in:
Haitao Li 2011-11-16 21:50:50 -06:00
parent 3b683f5205
commit fba0df72d3

View file

@ -7,6 +7,7 @@
import codemap::span;
import util::interner;
import ast::{node_id, spanned};
import front::attr;
tag restriction { UNRESTRICTED; RESTRICT_NO_CALL_EXPRS; }
@ -2012,6 +2013,23 @@ fn parse_item_native_mod(p: parser, attrs: [ast::attribute]) -> @ast::item {
} else {
p.fatal("unsupported abi: " + t);
}
} else {
abi =
alt attr::get_meta_item_value_str_by_name(attrs, "abi") {
none. { ast::native_abi_cdecl }
some("rust-intrinsic") {
ast::native_abi_rust_intrinsic
}
some("cdecl") {
ast::native_abi_cdecl
}
some("stdcall") {
ast::native_abi_stdcall
}
some(t) {
p.fatal("unsupported abi: " + t);
}
};
}
expect_word(p, "mod");
let id = parse_ident(p);
@ -2019,7 +2037,13 @@ fn parse_item_native_mod(p: parser, attrs: [ast::attribute]) -> @ast::item {
if p.peek() == token::EQ {
expect(p, token::EQ);
native_name = parse_str(p);
} else { native_name = id; }
} else {
native_name =
alt attr::get_meta_item_value_str_by_name(attrs, "link_name") {
none. { id }
some(nn) { nn }
};
}
expect(p, token::LBRACE);
let more_attrs = parse_inner_attrs_and_next(p);
let inner_attrs = more_attrs.inner;