@@ -56,7 +56,7 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
56
56
} ) ;
57
57
}
58
58
59
- e. and_then ( |ast:: Expr { id, node, span} | match node {
59
+ return e. and_then ( |ast:: Expr { id, node, span} | match node {
60
60
61
61
// expr_mac should really be expr_ext or something; it's the
62
62
// entry-point for all syntax extensions.
@@ -88,12 +88,11 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
88
88
//
89
89
// let p = PLACE;
90
90
// let mut place = Placer::make_place(p);
91
- // let raw_place = InPlace::pointer(&mut place);
92
- // let value = EXPR;
93
- // unsafe {
94
- // std::ptr::write(raw_place, value);
91
+ // let raw_place = Place::pointer(&mut place);
92
+ // push_unsafe!({
93
+ // std::intrinsics::move_val_init(raw_place, pop_unsafe!( EXPR ));
95
94
// InPlace::finalize(place)
96
- // }
95
+ // })
97
96
98
97
let value_span = value_expr. span ;
99
98
let placer_span = placer. span ;
@@ -103,17 +102,15 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
103
102
104
103
let placer_ident = token:: gensym_ident ( "placer" ) ;
105
104
let agent_ident = token:: gensym_ident ( "place" ) ;
106
- let value_ident = token:: gensym_ident ( "value" ) ;
107
105
let p_ptr_ident = token:: gensym_ident ( "p_ptr" ) ;
108
106
109
107
let placer = fld. cx . expr_ident ( span, placer_ident) ;
110
108
let agent = fld. cx . expr_ident ( span, agent_ident) ;
111
- let value = fld. cx . expr_ident ( span, value_ident) ;
112
109
let p_ptr = fld. cx . expr_ident ( span, p_ptr_ident) ;
113
110
114
111
let make_place = [ "ops" , "Placer" , "make_place" ] ;
115
112
let place_pointer = [ "ops" , "Place" , "pointer" ] ;
116
- let ptr_write = [ "ptr " , "write " ] ;
113
+ let move_val_init = [ "intrinsics " , "move_val_init " ] ;
117
114
let inplace_finalize = [ "ops" , "InPlace" , "finalize" ] ;
118
115
119
116
let make_call = |fld : & mut MacroExpander , p, args| {
@@ -145,26 +142,23 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
145
142
stmt_let ( fld, p_ptr_ident, call)
146
143
} ;
147
144
148
- // let value = <value_expr> ;
149
- let s4 = fld. cx . stmt_let ( value_span , false , value_ident , value_expr ) ;
145
+ // pop_unsafe!(EXPR)) ;
146
+ let pop_unsafe_expr = pop_unsafe_expr ( fld. cx , value_expr , value_span ) ;
150
147
151
- // unsafe { ptr::write(p_ptr, value); InPlace::finalize(place) }
148
+ // push_unsafe!({
149
+ // ptr::write(p_ptr, pop_unsafe!(<value_expr>));
150
+ // InPlace::finalize(place)
151
+ // })
152
152
let expr = {
153
- let call_ptr_write = StmtSemi ( make_call (
154
- fld, & ptr_write , vec ! [ p_ptr, value ] ) , ast:: DUMMY_NODE_ID ) ;
155
- let call_ptr_write = codemap:: respan ( value_span, call_ptr_write ) ;
153
+ let call_move_val_init = StmtSemi ( make_call (
154
+ fld, & move_val_init , vec ! [ p_ptr, pop_unsafe_expr ] ) , ast:: DUMMY_NODE_ID ) ;
155
+ let call_move_val_init = codemap:: respan ( value_span, call_move_val_init ) ;
156
156
157
157
let call = make_call ( fld, & inplace_finalize, vec ! [ agent] ) ;
158
- Some ( fld. cx . expr_block ( P ( ast:: Block {
159
- stmts : vec ! [ P ( call_ptr_write) ] ,
160
- expr : Some ( call) ,
161
- id : ast:: DUMMY_NODE_ID ,
162
- rules : ast:: UnsafeBlock ( ast:: CompilerGenerated ) ,
163
- span : span,
164
- } ) ) )
158
+ Some ( push_unsafe_expr ( fld. cx , vec ! [ P ( call_move_val_init) ] , call, span) )
165
159
} ;
166
160
167
- let block = fld. cx . block_all ( span, vec ! [ s1, s2, s3, s4 ] , expr) ;
161
+ let block = fld. cx . block_all ( span, vec ! [ s1, s2, s3] , expr) ;
168
162
fld. cx . expr_block ( block)
169
163
}
170
164
@@ -474,7 +468,26 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
474
468
span : span
475
469
} , fld) )
476
470
}
477
- } )
471
+ } ) ;
472
+
473
+ fn push_unsafe_expr ( cx : & mut ExtCtxt , stmts : Vec < P < ast:: Stmt > > ,
474
+ expr : P < ast:: Expr > , span : Span )
475
+ -> P < ast:: Expr > {
476
+ let rules = ast:: PushUnsafeBlock ( ast:: CompilerGenerated ) ;
477
+ cx. expr_block ( P ( ast:: Block {
478
+ rules : rules, span : span, id : ast:: DUMMY_NODE_ID ,
479
+ stmts : stmts, expr : Some ( expr) ,
480
+ } ) )
481
+ }
482
+
483
+ fn pop_unsafe_expr ( cx : & mut ExtCtxt , expr : P < ast:: Expr > , span : Span )
484
+ -> P < ast:: Expr > {
485
+ let rules = ast:: PopUnsafeBlock ( ast:: CompilerGenerated ) ;
486
+ cx. expr_block ( P ( ast:: Block {
487
+ rules : rules, span : span, id : ast:: DUMMY_NODE_ID ,
488
+ stmts : vec ! [ ] , expr : Some ( expr) ,
489
+ } ) )
490
+ }
478
491
}
479
492
480
493
/// Expand a (not-ident-style) macro invocation. Returns the result
0 commit comments