Skip to content

Commit c509a98

Browse files
committed
---
yaml --- r: 235726 b: refs/heads/stable c: d79bbbc h: refs/heads/master v: v3
1 parent 5c09fb2 commit c509a98

File tree

2 files changed

+38
-25
lines changed

2 files changed

+38
-25
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ refs/heads/tmp: afae2ff723393b3ab4ccffef6ac7c6d1809e2da0
2929
refs/tags/1.0.0-alpha.2: 4c705f6bc559886632d3871b04f58aab093bfa2f
3030
refs/tags/homu-tmp: f859507de8c410b648d934d8f5ec1c52daac971d
3131
refs/tags/1.0.0-beta: 8cbb92b53468ee2b0c2d3eeb8567005953d40828
32-
refs/heads/stable: 866250c6d4ca63fb56b7d58e55f8949337663998
32+
refs/heads/stable: d79bbbc4ef20a11680a004b600a90281e4c5e04a
3333
refs/tags/1.0.0: 55bd4f8ff2b323f317ae89e254ce87162d52a375
3434
refs/tags/1.1.0: bc3c16f09287e5545c1d3f76b7abd54f2eca868b
3535
refs/tags/1.2.0: f557861f822c34f07270347b94b5280de20a597e

branches/stable/src/libsyntax/ext/expand.rs

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
5656
});
5757
}
5858

59-
e.and_then(|ast::Expr {id, node, span}| match node {
59+
return e.and_then(|ast::Expr {id, node, span}| match node {
6060

6161
// expr_mac should really be expr_ext or something; it's the
6262
// entry-point for all syntax extensions.
@@ -88,12 +88,11 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
8888
//
8989
// let p = PLACE;
9090
// 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 ));
9594
// InPlace::finalize(place)
96-
// }
95+
// })
9796

9897
let value_span = value_expr.span;
9998
let placer_span = placer.span;
@@ -103,17 +102,15 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
103102

104103
let placer_ident = token::gensym_ident("placer");
105104
let agent_ident = token::gensym_ident("place");
106-
let value_ident = token::gensym_ident("value");
107105
let p_ptr_ident = token::gensym_ident("p_ptr");
108106

109107
let placer = fld.cx.expr_ident(span, placer_ident);
110108
let agent = fld.cx.expr_ident(span, agent_ident);
111-
let value = fld.cx.expr_ident(span, value_ident);
112109
let p_ptr = fld.cx.expr_ident(span, p_ptr_ident);
113110

114111
let make_place = ["ops", "Placer", "make_place"];
115112
let place_pointer = ["ops", "Place", "pointer"];
116-
let ptr_write = ["ptr", "write"];
113+
let move_val_init = ["intrinsics", "move_val_init"];
117114
let inplace_finalize = ["ops", "InPlace", "finalize"];
118115

119116
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> {
145142
stmt_let(fld, p_ptr_ident, call)
146143
};
147144

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);
150147

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+
// })
152152
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);
156156

157157
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))
165159
};
166160

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);
168162
fld.cx.expr_block(block)
169163
}
170164

@@ -474,7 +468,26 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
474468
span: span
475469
}, fld))
476470
}
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+
}
478491
}
479492

480493
/// Expand a (not-ident-style) macro invocation. Returns the result

0 commit comments

Comments
 (0)