]> git.lizzy.rs Git - rust.git/commitdiff
Use attributes for native module ABI and link name [temp]
authorHaitao Li <lihaitao@gmail.com>
Thu, 17 Nov 2011 03:50:50 +0000 (21:50 -0600)
committerHaitao Li <lihaitao@gmail.com>
Wed, 16 Nov 2011 15:45:07 +0000 (23:45 +0800)
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

index bb5bf4f7faa9dc26baefd36f3bb45e3e6565a6ca..580822d9f1d87c10cd4e7d8d7d35cfa21d18fd1d 100644 (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;