1
Fork 0

Optimize some alloc_from_iter call sites.

There's no need to collect an iterator into a `Vec`, or to call
`into_iter` at the call sites.
This commit is contained in:
Nicholas Nethercote 2023-10-03 12:20:15 +11:00
parent 816383c60d
commit a2051dd578
5 changed files with 29 additions and 38 deletions

View file

@ -410,15 +410,11 @@ fn expand_format_args<'hir>(
let format_options = use_format_options.then(|| { let format_options = use_format_options.then(|| {
// Generate: // Generate:
// &[format_spec_0, format_spec_1, format_spec_2] // &[format_spec_0, format_spec_1, format_spec_2]
let elements: Vec<_> = fmt let elements = ctx.arena.alloc_from_iter(fmt.template.iter().filter_map(|piece| {
.template
.iter()
.filter_map(|piece| {
let FormatArgsPiece::Placeholder(placeholder) = piece else { return None }; let FormatArgsPiece::Placeholder(placeholder) = piece else { return None };
Some(make_format_spec(ctx, macsp, placeholder, &mut argmap)) Some(make_format_spec(ctx, macsp, placeholder, &mut argmap))
}) }));
.collect(); ctx.expr_array_ref(macsp, elements)
ctx.expr_array_ref(macsp, ctx.arena.alloc_from_iter(elements))
}); });
let arguments = fmt.arguments.all_args(); let arguments = fmt.arguments.all_args();
@ -477,10 +473,8 @@ fn expand_format_args<'hir>(
// <core::fmt::Argument>::new_debug(&arg2), // <core::fmt::Argument>::new_debug(&arg2),
// … // …
// ] // ]
let elements: Vec<_> = arguments let elements = ctx.arena.alloc_from_iter(arguments.iter().zip(argmap).map(
.iter() |(arg, ((_, ty), placeholder_span))| {
.zip(argmap)
.map(|(arg, ((_, ty), placeholder_span))| {
let placeholder_span = let placeholder_span =
placeholder_span.unwrap_or(arg.expr.span).with_ctxt(macsp.ctxt()); placeholder_span.unwrap_or(arg.expr.span).with_ctxt(macsp.ctxt());
let arg_span = match arg.kind { let arg_span = match arg.kind {
@ -493,9 +487,9 @@ fn expand_format_args<'hir>(
hir::ExprKind::AddrOf(hir::BorrowKind::Ref, hir::Mutability::Not, arg), hir::ExprKind::AddrOf(hir::BorrowKind::Ref, hir::Mutability::Not, arg),
)); ));
make_argument(ctx, placeholder_span, ref_arg, ty) make_argument(ctx, placeholder_span, ref_arg, ty)
}) },
.collect(); ));
ctx.expr_array_ref(macsp, ctx.arena.alloc_from_iter(elements)) ctx.expr_array_ref(macsp, elements)
} else { } else {
// Generate: // Generate:
// &match (&arg0, &arg1, &…) { // &match (&arg0, &arg1, &…) {
@ -528,19 +522,14 @@ fn expand_format_args<'hir>(
make_argument(ctx, placeholder_span, arg, ty) make_argument(ctx, placeholder_span, arg, ty)
}, },
)); ));
let elements: Vec<_> = arguments let elements = ctx.arena.alloc_from_iter(arguments.iter().map(|arg| {
.iter()
.map(|arg| {
let arg_expr = ctx.lower_expr(&arg.expr); let arg_expr = ctx.lower_expr(&arg.expr);
ctx.expr( ctx.expr(
arg.expr.span.with_ctxt(macsp.ctxt()), arg.expr.span.with_ctxt(macsp.ctxt()),
hir::ExprKind::AddrOf(hir::BorrowKind::Ref, hir::Mutability::Not, arg_expr), hir::ExprKind::AddrOf(hir::BorrowKind::Ref, hir::Mutability::Not, arg_expr),
) )
}) }));
.collect(); let args_tuple = ctx.arena.alloc(ctx.expr(macsp, hir::ExprKind::Tup(elements)));
let args_tuple = ctx
.arena
.alloc(ctx.expr(macsp, hir::ExprKind::Tup(ctx.arena.alloc_from_iter(elements))));
let array = ctx.arena.alloc(ctx.expr(macsp, hir::ExprKind::Array(args))); let array = ctx.arena.alloc(ctx.expr(macsp, hir::ExprKind::Array(args)));
let match_arms = ctx.arena.alloc_from_iter([ctx.arm(args_pat, array)]); let match_arms = ctx.arena.alloc_from_iter([ctx.arm(args_pat, array)]);
let match_expr = ctx.arena.alloc(ctx.expr_match( let match_expr = ctx.arena.alloc(ctx.expr_match(

View file

@ -192,5 +192,5 @@ fn variance_of_opaque(tcx: TyCtxt<'_>, item_def_id: LocalDefId) -> &[ty::Varianc
} }
} }
} }
tcx.arena.alloc_from_iter(collector.variances.into_iter()) tcx.arena.alloc_from_iter(collector.variances)
} }

View file

@ -348,9 +348,10 @@ impl<'tcx, D: TyDecoder<I = TyCtxt<'tcx>>> Decodable<D> for ty::Const<'tcx> {
impl<'tcx, D: TyDecoder<I = TyCtxt<'tcx>>> RefDecodable<'tcx, D> for [ty::ValTree<'tcx>] { impl<'tcx, D: TyDecoder<I = TyCtxt<'tcx>>> RefDecodable<'tcx, D> for [ty::ValTree<'tcx>] {
fn decode(decoder: &mut D) -> &'tcx Self { fn decode(decoder: &mut D) -> &'tcx Self {
decoder.interner().arena.alloc_from_iter( decoder
(0..decoder.read_usize()).map(|_| Decodable::decode(decoder)).collect::<Vec<_>>(), .interner()
) .arena
.alloc_from_iter((0..decoder.read_usize()).map(|_| Decodable::decode(decoder)))
} }
} }
@ -368,9 +369,10 @@ impl<'tcx, D: TyDecoder<I = TyCtxt<'tcx>>> Decodable<D> for AdtDef<'tcx> {
impl<'tcx, D: TyDecoder<I = TyCtxt<'tcx>>> RefDecodable<'tcx, D> for [(ty::Clause<'tcx>, Span)] { impl<'tcx, D: TyDecoder<I = TyCtxt<'tcx>>> RefDecodable<'tcx, D> for [(ty::Clause<'tcx>, Span)] {
fn decode(decoder: &mut D) -> &'tcx Self { fn decode(decoder: &mut D) -> &'tcx Self {
decoder.interner().arena.alloc_from_iter( decoder
(0..decoder.read_usize()).map(|_| Decodable::decode(decoder)).collect::<Vec<_>>(), .interner()
) .arena
.alloc_from_iter((0..decoder.read_usize()).map(|_| Decodable::decode(decoder)))
} }
} }

View file

@ -316,7 +316,7 @@ fn vtable_entries<'tcx>(
dump_vtable_entries(tcx, sp, trait_ref, &entries); dump_vtable_entries(tcx, sp, trait_ref, &entries);
} }
tcx.arena.alloc_from_iter(entries.into_iter()) tcx.arena.alloc_from_iter(entries)
} }
/// Find slot base for trait methods within vtable entries of another trait /// Find slot base for trait methods within vtable entries of another trait

View file

@ -71,7 +71,7 @@ pub(crate) fn destructure_const<'tcx>(
_ => bug!("cannot destructure constant {:?}", const_), _ => bug!("cannot destructure constant {:?}", const_),
}; };
let fields = tcx.arena.alloc_from_iter(fields.into_iter()); let fields = tcx.arena.alloc_from_iter(fields);
ty::DestructuredConst { variant, fields } ty::DestructuredConst { variant, fields }
} }