From fba0df72d320a5b2e19678c9490825568de6f9a4 Mon Sep 17 00:00:00 2001 From: Haitao Li Date: Wed, 16 Nov 2011 21:50:50 -0600 Subject: [PATCH] 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. --- src/comp/syntax/parse/parser.rs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs index bb5bf4f7faa9..580822d9f1d8 100644 --- a/src/comp/syntax/parse/parser.rs +++ b/src/comp/syntax/parse/parser.rs @@ -7,6 +7,7 @@ import token::can_begin_expr; 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;