Skip to content

Commit 002d840

Browse files
committed
rollup merge of rust-lang#21199: dotdash/decode_lamba
Currently, we build a closure that does nothing but pass its argument through to another function, this is rather wasteful and creates lots of unnecessary closures.
2 parents 6dc94f7 + b75cee8 commit 002d840

File tree

1 file changed

+3
-4
lines changed

1 file changed

+3
-4
lines changed

src/libsyntax/ext/deriving/decodable.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,10 @@ fn decodable_substructure(cx: &mut ExtCtxt, trait_span: Span,
9292
let recurse = vec!(cx.ident_of(krate),
9393
cx.ident_of("Decodable"),
9494
cx.ident_of("decode"));
95+
let exprdecode = cx.expr_path(cx.path_global(trait_span, recurse));
9596
// throw an underscore in front to suppress unused variable warnings
9697
let blkarg = cx.ident_of("_d");
9798
let blkdecoder = cx.expr_ident(trait_span, blkarg);
98-
let calldecode = cx.expr_call_global(trait_span, recurse, vec!(blkdecoder.clone()));
99-
let lambdadecode = cx.lambda_expr_1(trait_span, calldecode, blkarg);
10099

101100
return match *substr.fields {
102101
StaticStruct(_, ref summary) => {
@@ -116,7 +115,7 @@ fn decodable_substructure(cx: &mut ExtCtxt, trait_span: Span,
116115
cx.expr_method_call(span, blkdecoder.clone(), read_struct_field,
117116
vec!(cx.expr_str(span, name),
118117
cx.expr_uint(span, field),
119-
lambdadecode.clone())))
118+
exprdecode.clone())))
120119
});
121120
let result = cx.expr_ok(trait_span, result);
122121
cx.expr_method_call(trait_span,
@@ -147,7 +146,7 @@ fn decodable_substructure(cx: &mut ExtCtxt, trait_span: Span,
147146
let idx = cx.expr_uint(span, field);
148147
cx.expr_try(span,
149148
cx.expr_method_call(span, blkdecoder.clone(), rvariant_arg,
150-
vec!(idx, lambdadecode.clone())))
149+
vec!(idx, exprdecode.clone())))
151150
});
152151

153152
arms.push(cx.arm(v_span,

0 commit comments

Comments
 (0)