diff options
| author | Eduard Burtescu <edy.burt@gmail.com> | 2014-12-03 22:56:39 +0200 |
|---|---|---|
| committer | Eduard Burtescu <edy.burt@gmail.com> | 2014-12-08 09:14:21 +0200 |
| commit | fe4fdcc0f67272de0c9f40da8b699a48bffb719f (patch) | |
| tree | 1761b4bc96998fb19a171fa0197b469df34a5d87 /src/libsyntax | |
| parent | c75e8d46c2fc576661c01f9eadb0866b3367ca4b (diff) | |
| download | rust-fe4fdcc0f67272de0c9f40da8b699a48bffb719f.tar.gz rust-fe4fdcc0f67272de0c9f40da8b699a48bffb719f.zip | |
core: make the public fmt API completely safe.
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ext/format.rs | 33 |
1 files changed, 8 insertions, 25 deletions
diff --git a/src/libsyntax/ext/format.rs b/src/libsyntax/ext/format.rs index d7d6c636849..c8fed3dcd16 100644 --- a/src/libsyntax/ext/format.rs +++ b/src/libsyntax/ext/format.rs @@ -577,17 +577,11 @@ impl<'a, 'b> Context<'a, 'b> { } // Now create a vector containing all the arguments - let slicename = self.ecx.ident_of("__args_vec"); - { - let args = names.into_iter().map(|a| a.unwrap()); - let args = locals.into_iter().chain(args); - let args = self.ecx.expr_vec_slice(self.fmtsp, args.collect()); - lets.push(self.ecx.stmt_let(self.fmtsp, false, slicename, args)); - } + let args = locals.into_iter().chain(names.into_iter().map(|a| a.unwrap())); // Now create the fmt::Arguments struct with all our locals we created. let pieces = self.ecx.expr_ident(self.fmtsp, static_str_name); - let args_slice = self.ecx.expr_ident(self.fmtsp, slicename); + let args_slice = self.ecx.expr_vec_slice(self.fmtsp, args.collect()); let (fn_name, fn_args) = if self.all_pieces_simple { ("new", vec![pieces, args_slice]) @@ -602,29 +596,18 @@ impl<'a, 'b> Context<'a, 'b> { self.ecx.ident_of("Arguments"), self.ecx.ident_of(fn_name)), fn_args); - // We did all the work of making sure that the arguments - // structure is safe, so we can safely have an unsafe block. - let result = self.ecx.expr_block(P(ast::Block { - view_items: Vec::new(), - stmts: Vec::new(), - expr: Some(result), - id: ast::DUMMY_NODE_ID, - rules: ast::UnsafeBlock(ast::CompilerGenerated), - span: self.fmtsp, - })); - let resname = self.ecx.ident_of("__args"); - lets.push(self.ecx.stmt_let(self.fmtsp, false, resname, result)); - let res = self.ecx.expr_ident(self.fmtsp, resname); let result = match invocation { Call(e) => { let span = e.span; - self.ecx.expr_call(span, e, - vec!(self.ecx.expr_addr_of(span, res))) + self.ecx.expr_call(span, e, vec![ + self.ecx.expr_addr_of(span, result) + ]) } MethodCall(e, m) => { let span = e.span; - self.ecx.expr_method_call(span, e, m, - vec!(self.ecx.expr_addr_of(span, res))) + self.ecx.expr_method_call(span, e, m, vec![ + self.ecx.expr_addr_of(span, result) + ]) } }; let body = self.ecx.expr_block(self.ecx.block(self.fmtsp, lets, |
