From 3c0edc895ff4d3d82e93c9dc61bb4a8a24da5fad Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Sat, 14 Mar 2020 12:06:06 +0100 Subject: [PATCH] Allocate query Vecs on the arena. --- src/librustc_infer/traits/error_reporting/mod.rs | 2 +- src/librustc_metadata/rmeta/decoder.rs | 4 ++-- src/librustc_metadata/rmeta/decoder/cstore_impl.rs | 2 +- src/librustc_middle/arena.rs | 1 + src/librustc_middle/query/mod.rs | 4 ++-- src/librustc_trait_selection/traits/object_safety.rs | 12 ++++++++---- src/librustc_typeck/astconv.rs | 2 +- src/librustdoc/clean/mod.rs | 7 ++++--- 8 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/librustc_infer/traits/error_reporting/mod.rs b/src/librustc_infer/traits/error_reporting/mod.rs index 9206166d0bd..2ae7b2ff925 100644 --- a/src/librustc_infer/traits/error_reporting/mod.rs +++ b/src/librustc_infer/traits/error_reporting/mod.rs @@ -39,7 +39,7 @@ pub fn report_object_safety_error( tcx: TyCtxt<'tcx>, span: Span, trait_def_id: DefId, - violations: Vec, + violations: &[ObjectSafetyViolation], ) -> DiagnosticBuilder<'tcx> { let trait_str = tcx.def_path_str(trait_def_id); let trait_span = tcx.hir().get_if_local(trait_def_id).and_then(|node| match node { diff --git a/src/librustc_metadata/rmeta/decoder.rs b/src/librustc_metadata/rmeta/decoder.rs index c59b155d5db..0364493a48a 100644 --- a/src/librustc_metadata/rmeta/decoder.rs +++ b/src/librustc_metadata/rmeta/decoder.rs @@ -1331,13 +1331,13 @@ fn get_missing_lang_items(&self, tcx: TyCtxt<'tcx>) -> &'tcx [lang_items::LangIt } } - fn get_fn_param_names(&self, id: DefIndex) -> Vec { + fn get_fn_param_names(&self, tcx: TyCtxt<'tcx>, id: DefIndex) -> &'tcx [ast::Name] { let param_names = match self.kind(id) { EntryKind::Fn(data) | EntryKind::ForeignFn(data) => data.decode(self).param_names, EntryKind::AssocFn(data) => data.decode(self).fn_data.param_names, _ => Lazy::empty(), }; - param_names.decode(self).collect() + tcx.arena.alloc_from_iter(param_names.decode(self)) } fn exported_symbols( diff --git a/src/librustc_metadata/rmeta/decoder/cstore_impl.rs b/src/librustc_metadata/rmeta/decoder/cstore_impl.rs index c99b1dc3606..5415c703039 100644 --- a/src/librustc_metadata/rmeta/decoder/cstore_impl.rs +++ b/src/librustc_metadata/rmeta/decoder/cstore_impl.rs @@ -144,7 +144,7 @@ fn into_args(self) -> (DefId, DefId) { // a `fn` when encoding, so the dep-tracking wouldn't work. // This is only used by rustdoc anyway, which shouldn't have // incremental recompilation ever enabled. - fn_arg_names => { cdata.get_fn_param_names(def_id.index) } + fn_arg_names => { cdata.get_fn_param_names(tcx, def_id.index) } rendered_const => { cdata.get_rendered_const(def_id.index) } impl_parent => { cdata.get_parent_impl(def_id.index) } trait_of_item => { cdata.get_trait_of_item(def_id.index) } diff --git a/src/librustc_middle/arena.rs b/src/librustc_middle/arena.rs index e3dec59478c..2d309230550 100644 --- a/src/librustc_middle/arena.rs +++ b/src/librustc_middle/arena.rs @@ -116,6 +116,7 @@ macro_rules! arena_types { [few] crate_variances: rustc_middle::ty::CrateVariancesMap<'tcx>, [few] inferred_outlives_crate: rustc_middle::ty::CratePredicatesMap<'tcx>, [] upvars: rustc_data_structures::fx::FxIndexMap, + [] object_safety_violations: rustc_middle::traits::ObjectSafetyViolation, // Interned types [] tys: rustc_middle::ty::TyS<$tcx>, diff --git a/src/librustc_middle/query/mod.rs b/src/librustc_middle/query/mod.rs index 2ffbbfb1762..dc3da9ec6ec 100644 --- a/src/librustc_middle/query/mod.rs +++ b/src/librustc_middle/query/mod.rs @@ -652,7 +652,7 @@ fn describe_as_module(def_id: DefId, tcx: TyCtxt<'_>) -> String { } Other { - query fn_arg_names(_: DefId) -> Vec {} + query fn_arg_names(_: DefId) -> &'tcx [ast::Name] {} /// Gets the rendered value of the specified constant or associated constant. /// Used by rustdoc. query rendered_const(_: DefId) -> String {} @@ -699,7 +699,7 @@ fn describe_as_module(def_id: DefId, tcx: TyCtxt<'_>) -> String { desc { |tcx| "building specialization graph of trait `{}`", tcx.def_path_str(key) } cache_on_disk_if { true } } - query object_safety_violations(key: DefId) -> Vec { + query object_safety_violations(key: DefId) -> &'tcx [traits::ObjectSafetyViolation] { desc { |tcx| "determine object safety of trait `{}`", tcx.def_path_str(key) } } diff --git a/src/librustc_trait_selection/traits/object_safety.rs b/src/librustc_trait_selection/traits/object_safety.rs index 20b3fa908d2..715007c35c2 100644 --- a/src/librustc_trait_selection/traits/object_safety.rs +++ b/src/librustc_trait_selection/traits/object_safety.rs @@ -47,13 +47,17 @@ pub fn astconv_object_safety_violations( violations } -fn object_safety_violations(tcx: TyCtxt<'_>, trait_def_id: DefId) -> Vec { +fn object_safety_violations( + tcx: TyCtxt<'tcx>, + trait_def_id: DefId, +) -> &'tcx [ObjectSafetyViolation] { debug_assert!(tcx.generics_of(trait_def_id).has_self); debug!("object_safety_violations: {:?}", trait_def_id); - traits::supertrait_def_ids(tcx, trait_def_id) - .flat_map(|def_id| object_safety_violations_for_trait(tcx, def_id)) - .collect() + tcx.arena.alloc_from_iter( + traits::supertrait_def_ids(tcx, trait_def_id) + .flat_map(|def_id| object_safety_violations_for_trait(tcx, def_id)), + ) } /// We say a method is *vtable safe* if it can be invoked on a trait diff --git a/src/librustc_typeck/astconv.rs b/src/librustc_typeck/astconv.rs index c3ebcbfc832..d3f1737b1e9 100644 --- a/src/librustc_typeck/astconv.rs +++ b/src/librustc_typeck/astconv.rs @@ -1582,7 +1582,7 @@ fn conv_object_ty_poly_trait_ref( tcx, span, item.trait_ref().def_id(), - object_safety_violations, + &object_safety_violations[..], ) .emit(); return tcx.types.err; diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index e027db8b56c..1c26d401d56 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -973,10 +973,11 @@ impl<'tcx> Clean for (DefId, ty::PolyFnSig<'tcx>) { fn clean(&self, cx: &DocContext<'_>) -> FnDecl { let (did, sig) = *self; let mut names = if cx.tcx.hir().as_local_hir_id(did).is_some() { - vec![].into_iter() + &[] } else { - cx.tcx.fn_arg_names(did).into_iter() - }; + cx.tcx.fn_arg_names(did) + } + .iter(); FnDecl { output: Return(sig.skip_binder().output().clean(cx)), -- 2.44.0