@@ -20,53 +20,20 @@ use attr;
20
20
use attr:: AttrMetaMethods ;
21
21
use codemap;
22
22
use codemap:: { Span , Spanned , ExpnInfo , NameAndSpan , MacroBang , MacroAttribute } ;
23
- use codemap:: { CompilerExpansion , CompilerExpansionFormat } ;
24
23
use ext:: base:: * ;
25
24
use feature_gate:: { self , Features , GatedCfg } ;
26
25
use fold;
27
26
use fold:: * ;
28
27
use parse;
29
28
use parse:: token:: { fresh_mark, fresh_name, intern} ;
30
- use parse:: token;
31
29
use ptr:: P ;
32
30
use util:: small_vector:: SmallVector ;
33
31
use visit;
34
32
use visit:: Visitor ;
35
33
use std_inject;
36
34
37
- // Given suffix ["b","c","d"], returns path `::std::b::c::d` when
38
- // `fld.cx.use_std`, and `::core::b::c::d` otherwise.
39
- fn mk_core_path ( fld : & mut MacroExpander ,
40
- span : Span ,
41
- suffix : & [ & ' static str ] ) -> ast:: Path {
42
- let idents = fld. cx . std_path ( suffix) ;
43
- fld. cx . path_global ( span, idents)
44
- }
45
35
46
36
pub fn expand_expr ( e : P < ast:: Expr > , fld : & mut MacroExpander ) -> P < ast:: Expr > {
47
- fn push_compiler_expansion ( fld : & mut MacroExpander , span : Span ,
48
- expansion_type : CompilerExpansionFormat ) {
49
- fld. cx . bt_push ( ExpnInfo {
50
- call_site : span,
51
- callee : NameAndSpan {
52
- format : CompilerExpansion ( expansion_type) ,
53
-
54
- // This does *not* mean code generated after
55
- // `push_compiler_expansion` is automatically exempt
56
- // from stability lints; must also tag such code with
57
- // an appropriate span from `fld.cx.backtrace()`.
58
- allow_internal_unstable : true ,
59
-
60
- span : None ,
61
- } ,
62
- } ) ;
63
- }
64
-
65
- // Sets the expn_id so that we can use unstable methods.
66
- fn allow_unstable ( fld : & mut MacroExpander , span : Span ) -> Span {
67
- Span { expn_id : fld. cx . backtrace ( ) , ..span }
68
- }
69
-
70
37
let expr_span = e. span ;
71
38
return e. and_then ( |ast:: Expr { id, node, span} | match node {
72
39
@@ -94,118 +61,18 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
94
61
} )
95
62
}
96
63
97
- // Desugar ExprInPlace: `in PLACE { EXPR }`
98
64
ast:: ExprInPlace ( placer, value_expr) => {
99
- // to:
100
- //
101
- // let p = PLACE;
102
- // let mut place = Placer::make_place(p);
103
- // let raw_place = Place::pointer(&mut place);
104
- // push_unsafe!({
105
- // std::intrinsics::move_val_init(raw_place, pop_unsafe!( EXPR ));
106
- // InPlace::finalize(place)
107
- // })
108
-
109
65
// Ensure feature-gate is enabled
110
66
feature_gate:: check_for_placement_in (
111
67
fld. cx . ecfg . features ,
112
68
& fld. cx . parse_sess . span_diagnostic ,
113
69
expr_span) ;
114
70
115
- push_compiler_expansion ( fld, expr_span, CompilerExpansionFormat :: PlacementIn ) ;
116
-
117
- let value_span = value_expr. span ;
118
- let placer_span = placer. span ;
119
-
120
- let placer_expr = fld. fold_expr ( placer) ;
71
+ let placer = fld. fold_expr ( placer) ;
121
72
let value_expr = fld. fold_expr ( value_expr) ;
122
-
123
- let placer_ident = token:: gensym_ident ( "placer" ) ;
124
- let agent_ident = token:: gensym_ident ( "place" ) ;
125
- let p_ptr_ident = token:: gensym_ident ( "p_ptr" ) ;
126
-
127
- let placer = fld. cx . expr_ident ( span, placer_ident) ;
128
- let agent = fld. cx . expr_ident ( span, agent_ident) ;
129
- let p_ptr = fld. cx . expr_ident ( span, p_ptr_ident) ;
130
-
131
- let make_place = [ "ops" , "Placer" , "make_place" ] ;
132
- let place_pointer = [ "ops" , "Place" , "pointer" ] ;
133
- let move_val_init = [ "intrinsics" , "move_val_init" ] ;
134
- let inplace_finalize = [ "ops" , "InPlace" , "finalize" ] ;
135
-
136
- let make_call = |fld : & mut MacroExpander , p, args| {
137
- // We feed in the `expr_span` because codemap's span_allows_unstable
138
- // allows the call_site span to inherit the `allow_internal_unstable`
139
- // setting.
140
- let span_unstable = allow_unstable ( fld, expr_span) ;
141
- let path = mk_core_path ( fld, span_unstable, p) ;
142
- let path = fld. cx . expr_path ( path) ;
143
- let expr_span_unstable = allow_unstable ( fld, span) ;
144
- fld. cx . expr_call ( expr_span_unstable, path, args)
145
- } ;
146
-
147
- let stmt_let = |fld : & mut MacroExpander , bind, expr| {
148
- fld. cx . stmt_let ( placer_span, false , bind, expr)
149
- } ;
150
- let stmt_let_mut = |fld : & mut MacroExpander , bind, expr| {
151
- fld. cx . stmt_let ( placer_span, true , bind, expr)
152
- } ;
153
-
154
- // let placer = <placer_expr> ;
155
- let s1 = stmt_let ( fld, placer_ident, placer_expr) ;
156
-
157
- // let mut place = Placer::make_place(placer);
158
- let s2 = {
159
- let call = make_call ( fld, & make_place, vec ! [ placer] ) ;
160
- stmt_let_mut ( fld, agent_ident, call)
161
- } ;
162
-
163
- // let p_ptr = Place::pointer(&mut place);
164
- let s3 = {
165
- let args = vec ! [ fld. cx. expr_mut_addr_of( placer_span, agent. clone( ) ) ] ;
166
- let call = make_call ( fld, & place_pointer, args) ;
167
- stmt_let ( fld, p_ptr_ident, call)
168
- } ;
169
-
170
- // pop_unsafe!(EXPR));
171
- let pop_unsafe_expr = pop_unsafe_expr ( fld. cx , value_expr, value_span) ;
172
-
173
- // push_unsafe!({
174
- // ptr::write(p_ptr, pop_unsafe!(<value_expr>));
175
- // InPlace::finalize(place)
176
- // })
177
- let expr = {
178
- let call_move_val_init = StmtSemi ( make_call (
179
- fld, & move_val_init, vec ! [ p_ptr, pop_unsafe_expr] ) , ast:: DUMMY_NODE_ID ) ;
180
- let call_move_val_init = codemap:: respan ( value_span, call_move_val_init) ;
181
-
182
- let call = make_call ( fld, & inplace_finalize, vec ! [ agent] ) ;
183
- Some ( push_unsafe_expr ( fld. cx , vec ! [ P ( call_move_val_init) ] , call, span) )
184
- } ;
185
-
186
- let block = fld. cx . block_all ( span, vec ! [ s1, s2, s3] , expr) ;
187
- let result = fld. cx . expr_block ( block) ;
188
- fld. cx . bt_pop ( ) ;
189
- result
73
+ fld. cx . expr ( span, ast:: ExprBox ( Some ( placer) , value_expr) )
190
74
}
191
75
192
- // Issue #22181:
193
- // Eventually a desugaring for `box EXPR`
194
- // (similar to the desugaring above for `in PLACE BLOCK`)
195
- // should go here, desugaring
196
- //
197
- // to:
198
- //
199
- // let mut place = BoxPlace::make_place();
200
- // let raw_place = Place::pointer(&mut place);
201
- // let value = $value;
202
- // unsafe {
203
- // ::std::ptr::write(raw_place, value);
204
- // Boxed::finalize(place)
205
- // }
206
- //
207
- // But for now there are type-inference issues doing that.
208
-
209
76
ast:: ExprWhile ( cond, body, opt_ident) => {
210
77
let cond = fld. fold_expr ( cond) ;
211
78
let ( body, opt_ident) = expand_loop_block ( body, opt_ident, fld) ;
@@ -225,6 +92,7 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
225
92
}
226
93
227
94
ast:: ExprForLoop ( pat, head, body, opt_ident) => {
95
+ let pat = fld. fold_pat ( pat) ;
228
96
let head = fld. fold_expr ( head) ;
229
97
let ( body, opt_ident) = expand_loop_block ( body, opt_ident, fld) ;
230
98
fld. cx . expr ( span, ast:: ExprForLoop ( pat, head, body, opt_ident) )
@@ -247,25 +115,6 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
247
115
} , fld) )
248
116
}
249
117
} ) ;
250
-
251
- fn push_unsafe_expr ( cx : & mut ExtCtxt , stmts : Vec < P < ast:: Stmt > > ,
252
- expr : P < ast:: Expr > , span : Span )
253
- -> P < ast:: Expr > {
254
- let rules = ast:: PushUnsafeBlock ( ast:: CompilerGenerated ) ;
255
- cx. expr_block ( P ( ast:: Block {
256
- rules : rules, span : span, id : ast:: DUMMY_NODE_ID ,
257
- stmts : stmts, expr : Some ( expr) ,
258
- } ) )
259
- }
260
-
261
- fn pop_unsafe_expr ( cx : & mut ExtCtxt , expr : P < ast:: Expr > , span : Span )
262
- -> P < ast:: Expr > {
263
- let rules = ast:: PopUnsafeBlock ( ast:: CompilerGenerated ) ;
264
- cx. expr_block ( P ( ast:: Block {
265
- rules : rules, span : span, id : ast:: DUMMY_NODE_ID ,
266
- stmts : vec ! [ ] , expr : Some ( expr) ,
267
- } ) )
268
- }
269
118
}
270
119
271
120
/// Expand a (not-ident-style) macro invocation. Returns the result
0 commit comments