8
8
// option. This file may not be copied, modified, or distributed
9
9
// except according to those terms.
10
10
11
- /*
12
- * Inline assembly support.
13
- */
11
+ // Inline assembly support.
12
+ //
14
13
use self :: State :: * ;
15
14
16
15
use syntax:: ast;
@@ -31,43 +30,48 @@ enum State {
31
30
Inputs ,
32
31
Clobbers ,
33
32
Options ,
34
- StateNone
33
+ StateNone ,
35
34
}
36
35
37
36
impl State {
38
37
fn next ( & self ) -> State {
39
38
match * self {
40
- Asm => Outputs ,
41
- Outputs => Inputs ,
42
- Inputs => Clobbers ,
43
- Clobbers => Options ,
44
- Options => StateNone ,
45
- StateNone => StateNone
39
+ Asm => Outputs ,
40
+ Outputs => Inputs ,
41
+ Inputs => Clobbers ,
42
+ Clobbers => Options ,
43
+ Options => StateNone ,
44
+ StateNone => StateNone ,
46
45
}
47
46
}
48
47
}
49
48
50
49
const OPTIONS : & ' static [ & ' static str ] = & [ "volatile" , "alignstack" , "intel" ] ;
51
50
52
- pub fn expand_asm < ' cx > ( cx : & ' cx mut ExtCtxt , sp : Span , tts : & [ tokenstream:: TokenTree ] )
53
- -> Box < base:: MacResult +' cx > {
51
+ pub fn expand_asm < ' cx > ( cx : & ' cx mut ExtCtxt ,
52
+ sp : Span ,
53
+ tts : & [ tokenstream:: TokenTree ] )
54
+ -> Box < base:: MacResult + ' cx > {
54
55
if !cx. ecfg . enable_asm ( ) {
55
- feature_gate:: emit_feature_err (
56
- & cx. parse_sess . span_diagnostic , "asm" , sp,
57
- feature_gate:: GateIssue :: Language ,
58
- feature_gate:: EXPLAIN_ASM ) ;
56
+ feature_gate:: emit_feature_err ( & cx. parse_sess . span_diagnostic ,
57
+ "asm" ,
58
+ sp,
59
+ feature_gate:: GateIssue :: Language ,
60
+ feature_gate:: EXPLAIN_ASM ) ;
59
61
return DummyResult :: expr ( sp) ;
60
62
}
61
63
62
64
// Split the tts before the first colon, to avoid `asm!("x": y)` being
63
65
// parsed as `asm!(z)` with `z = "x": y` which is type ascription.
64
- let first_colon = tts. iter ( ) . position ( |tt| {
65
- match * tt {
66
- tokenstream:: TokenTree :: Token ( _, token:: Colon ) |
67
- tokenstream:: TokenTree :: Token ( _, token:: ModSep ) => true ,
68
- _ => false
69
- }
70
- } ) . unwrap_or ( tts. len ( ) ) ;
66
+ let first_colon = tts. iter ( )
67
+ . position ( |tt| {
68
+ match * tt {
69
+ tokenstream:: TokenTree :: Token ( _, token:: Colon ) |
70
+ tokenstream:: TokenTree :: Token ( _, token:: ModSep ) => true ,
71
+ _ => false ,
72
+ }
73
+ } )
74
+ . unwrap_or ( tts. len ( ) ) ;
71
75
let mut p = cx. new_parser_from_tts ( & tts[ first_colon..] ) ;
72
76
let mut asm = token:: InternedString :: new ( "" ) ;
73
77
let mut asm_str_style = None ;
@@ -91,8 +95,9 @@ pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[tokenstream::Token
91
95
}
92
96
// Nested parser, stop before the first colon (see above).
93
97
let mut p2 = cx. new_parser_from_tts ( & tts[ ..first_colon] ) ;
94
- let ( s, style) = match expr_to_string ( cx, panictry ! ( p2. parse_expr( ) ) ,
95
- "inline assembly must be a string literal" ) {
98
+ let ( s, style) = match expr_to_string ( cx,
99
+ panictry ! ( p2. parse_expr( ) ) ,
100
+ "inline assembly must be a string literal" ) {
96
101
Some ( ( s, st) ) => ( s, st) ,
97
102
// let compilation continue
98
103
None => return DummyResult :: expr ( sp) ,
@@ -109,9 +114,7 @@ pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[tokenstream::Token
109
114
asm_str_style = Some ( style) ;
110
115
}
111
116
Outputs => {
112
- while p. token != token:: Eof &&
113
- p. token != token:: Colon &&
114
- p. token != token:: ModSep {
117
+ while p. token != token:: Eof && p. token != token:: Colon && p. token != token:: ModSep {
115
118
116
119
if !outputs. is_empty ( ) {
117
120
p. eat ( & token:: Comma ) ;
@@ -136,8 +139,7 @@ pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[tokenstream::Token
136
139
let output = match ch. next ( ) {
137
140
Some ( '=' ) => None ,
138
141
Some ( '+' ) => {
139
- Some ( token:: intern_and_get_ident ( & format ! (
140
- "={}" , ch. as_str( ) ) ) )
142
+ Some ( token:: intern_and_get_ident ( & format ! ( "={}" , ch. as_str( ) ) ) )
141
143
}
142
144
_ => {
143
145
cx. span_err ( span, "output operand constraint lacks '=' or '+'" ) ;
@@ -156,9 +158,7 @@ pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[tokenstream::Token
156
158
}
157
159
}
158
160
Inputs => {
159
- while p. token != token:: Eof &&
160
- p. token != token:: Colon &&
161
- p. token != token:: ModSep {
161
+ while p. token != token:: Eof && p. token != token:: Colon && p. token != token:: ModSep {
162
162
163
163
if !inputs. is_empty ( ) {
164
164
p. eat ( & token:: Comma ) ;
@@ -180,9 +180,7 @@ pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[tokenstream::Token
180
180
}
181
181
}
182
182
Clobbers => {
183
- while p. token != token:: Eof &&
184
- p. token != token:: Colon &&
185
- p. token != token:: ModSep {
183
+ while p. token != token:: Eof && p. token != token:: Colon && p. token != token:: ModSep {
186
184
187
185
if !clobs. is_empty ( ) {
188
186
p. eat ( & token:: Comma ) ;
@@ -218,25 +216,25 @@ pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[tokenstream::Token
218
216
p. eat ( & token:: Comma ) ;
219
217
}
220
218
}
221
- StateNone => ( )
219
+ StateNone => ( ) ,
222
220
}
223
221
224
222
loop {
225
223
// MOD_SEP is a double colon '::' without space in between.
226
224
// When encountered, the state must be advanced twice.
227
225
match ( & p. token , state. next ( ) , state. next ( ) . next ( ) ) {
228
- ( & token:: Colon , StateNone , _) |
226
+ ( & token:: Colon , StateNone , _) |
229
227
( & token:: ModSep , _, StateNone ) => {
230
228
p. bump ( ) ;
231
229
break ' statement;
232
230
}
233
- ( & token:: Colon , st, _) |
231
+ ( & token:: Colon , st, _) |
234
232
( & token:: ModSep , _, st) => {
235
233
p. bump ( ) ;
236
234
state = st;
237
235
}
238
236
( & token:: Eof , _, _) => break ' statement,
239
- _ => break
237
+ _ => break ,
240
238
}
241
239
}
242
240
}
0 commit comments