about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libsyntax/ext/asm.rs54
-rw-r--r--src/libsyntax/ext/base.rs2
-rw-r--r--src/libsyntax/print/pprust.rs2
-rw-r--r--src/libsyntax/syntax.rc1
4 files changed, 58 insertions, 1 deletions
diff --git a/src/libsyntax/ext/asm.rs b/src/libsyntax/ext/asm.rs
new file mode 100644
index 00000000000..bbf42389907
--- /dev/null
+++ b/src/libsyntax/ext/asm.rs
@@ -0,0 +1,54 @@
+// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+
+
+/*
+ * Inline assembly support.
+ */
+
+use core::prelude::*;
+
+use ast;
+use codemap::span;
+use ext::base;
+use ext::base::*;
+
+pub fn expand_asm(cx: ext_ctxt, sp: span, tts: &[ast::token_tree])
+    -> base::MacResult {
+    let args = get_exprs_from_tts(cx, tts);
+    if args.len() == 0 {
+        cx.span_fatal(sp, "ast! takes at least 1 argument.");
+    }
+    let asm =
+        expr_to_str(cx, args[0],
+                    ~"inline assembly must be a string literal.");
+    let cons = if args.len() > 1 {
+        expr_to_str(cx, args[1],
+                    ~"constraints must be a string literal.")
+    } else { ~"" };
+
+    MRExpr(@ast::expr {
+        id: cx.next_id(),
+        callee_id: cx.next_id(),
+        node: ast::expr_inline_asm(@asm, @cons),
+        span: sp
+    })
+}
+
+//
+// Local Variables:
+// mode: rust
+// fill-column: 78;
+// indent-tabs-mode: nil
+// c-basic-offset: 4
+// buffer-file-coding-system: utf-8-unix
+// End:
+//
diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs
index 23cabc09946..1eae4b84cc9 100644
--- a/src/libsyntax/ext/base.rs
+++ b/src/libsyntax/ext/base.rs
@@ -198,6 +198,8 @@ pub fn syntax_expander_table() -> SyntaxEnv {
                                 ext::source_util::expand_mod));
     syntax_expanders.insert(@~"proto",
                             builtin_item_tt(ext::pipes::expand_proto));
+    syntax_expanders.insert(@~"asm",
+                            builtin_normal_tt(ext::asm::expand_asm));
     syntax_expanders.insert(
         @~"trace_macros",
         builtin_normal_tt(ext::trace_macros::expand_trace_macros));
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs
index 350ab0cf9b2..25c18adb2fb 100644
--- a/src/libsyntax/print/pprust.rs
+++ b/src/libsyntax/print/pprust.rs
@@ -1402,7 +1402,7 @@ pub fn print_expr(s: @ps, &&expr: @ast::expr) {
         word(s.s, ~"__asm__");
         popen(s);
         print_string(s, *a);
-        word_space(s, ~", ");
+        word_space(s, ~",");
         print_string(s, *c);
         pclose(s);
       }
diff --git a/src/libsyntax/syntax.rc b/src/libsyntax/syntax.rc
index 7f84d6a3010..e13ef976d97 100644
--- a/src/libsyntax/syntax.rc
+++ b/src/libsyntax/syntax.rc
@@ -60,6 +60,7 @@ pub mod print {
 }
 
 pub mod ext {
+    pub mod asm;
     pub mod base;
     pub mod expand;