Skip to content

Commit e5bf60f

Browse files
committed
minor: Remove frequent Arc<Body> clones in type checking
1 parent f82d230 commit e5bf60f

File tree

3 files changed

+29
-25
lines changed

3 files changed

+29
-25
lines changed

crates/hir_ty/src/infer.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ mod closure;
5959
pub(crate) fn infer_query(db: &dyn HirDatabase, def: DefWithBodyId) -> Arc<InferenceResult> {
6060
let _p = profile::span("infer_query");
6161
let resolver = def.resolver(db.upcast());
62-
let mut ctx = InferenceContext::new(db, def, resolver);
62+
let body = db.body(def);
63+
let mut ctx = InferenceContext::new(db, def, &body, resolver);
6364

6465
match def {
6566
DefWithBodyId::ConstId(c) => ctx.collect_const(&db.const_data(c)),
@@ -360,7 +361,7 @@ impl Index<PatId> for InferenceResult {
360361
pub(crate) struct InferenceContext<'a> {
361362
pub(crate) db: &'a dyn HirDatabase,
362363
pub(crate) owner: DefWithBodyId,
363-
pub(crate) body: Arc<Body>,
364+
pub(crate) body: &'a Body,
364365
pub(crate) resolver: Resolver,
365366
table: unify::InferenceTable<'a>,
366367
trait_env: Arc<TraitEnvironment>,
@@ -394,7 +395,12 @@ fn find_breakable<'c>(
394395
}
395396

396397
impl<'a> InferenceContext<'a> {
397-
fn new(db: &'a dyn HirDatabase, owner: DefWithBodyId, resolver: Resolver) -> Self {
398+
fn new(
399+
db: &'a dyn HirDatabase,
400+
owner: DefWithBodyId,
401+
body: &'a Body,
402+
resolver: Resolver,
403+
) -> Self {
398404
let krate = owner.module(db.upcast()).krate();
399405
let trait_env = owner
400406
.as_generic_def_id()
@@ -406,7 +412,7 @@ impl<'a> InferenceContext<'a> {
406412
return_ty: TyKind::Error.intern(Interner), // set in collect_fn_signature
407413
db,
408414
owner,
409-
body: db.body(owner),
415+
body,
410416
resolver,
411417
diverges: Diverges::Maybe,
412418
breakables: Vec::new(),
@@ -452,12 +458,11 @@ impl<'a> InferenceContext<'a> {
452458
}
453459

454460
fn collect_fn(&mut self, data: &FunctionData) {
455-
let body = Arc::clone(&self.body); // avoid borrow checker problem
456461
let ctx = crate::lower::TyLoweringContext::new(self.db, &self.resolver)
457462
.with_impl_trait_mode(ImplTraitLoweringMode::Param);
458463
let param_tys =
459464
data.params.iter().map(|(_, type_ref)| ctx.lower_ty(type_ref)).collect::<Vec<_>>();
460-
for (ty, pat) in param_tys.into_iter().zip(body.params.iter()) {
465+
for (ty, pat) in param_tys.into_iter().zip(self.body.params.iter()) {
461466
let ty = self.insert_type_vars(ty);
462467
let ty = self.normalize_associated_types_in(ty);
463468

crates/hir_ty/src/infer/expr.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use std::{
44
collections::hash_map::Entry,
55
iter::{repeat, repeat_with},
66
mem,
7-
sync::Arc,
87
};
98

109
use chalk_ir::{
@@ -80,8 +79,7 @@ impl<'a> InferenceContext<'a> {
8079
fn infer_expr_inner(&mut self, tgt_expr: ExprId, expected: &Expectation) -> Ty {
8180
self.db.unwind_if_cancelled();
8281

83-
let body = Arc::clone(&self.body); // avoid borrow checker problem
84-
let ty = match &body[tgt_expr] {
82+
let ty = match &self.body[tgt_expr] {
8583
Expr::Missing => self.err_ty(),
8684
&Expr::If { condition, then_branch, else_branch } => {
8785
self.infer_expr(
@@ -560,17 +558,7 @@ impl<'a> InferenceContext<'a> {
560558
}
561559
.intern(Interner)
562560
}
563-
Expr::Box { expr } => {
564-
let inner_ty = self.infer_expr_inner(*expr, &Expectation::none());
565-
if let Some(box_) = self.resolve_boxed_box() {
566-
TyBuilder::adt(self.db, box_)
567-
.push(inner_ty)
568-
.fill_with_defaults(self.db, || self.table.new_type_var())
569-
.build()
570-
} else {
571-
self.err_ty()
572-
}
573-
}
561+
&Expr::Box { expr } => self.infer_expr_box(expr),
574562
Expr::UnaryOp { expr, op } => {
575563
let inner_ty = self.infer_expr_inner(*expr, &Expectation::none());
576564
let inner_ty = self.resolve_ty_shallow(&inner_ty);
@@ -798,6 +786,18 @@ impl<'a> InferenceContext<'a> {
798786
ty
799787
}
800788

789+
fn infer_expr_box(&mut self, inner_expr: ExprId) -> chalk_ir::Ty<Interner> {
790+
let inner_ty = self.infer_expr_inner(inner_expr, &Expectation::none());
791+
if let Some(box_) = self.resolve_boxed_box() {
792+
TyBuilder::adt(self.db, box_)
793+
.push(inner_ty)
794+
.fill_with_defaults(self.db, || self.table.new_type_var())
795+
.build()
796+
} else {
797+
self.err_ty()
798+
}
799+
}
800+
801801
fn infer_overloadable_binop(
802802
&mut self,
803803
lhs: ExprId,

crates/hir_ty/src/infer/pat.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! Type inference for patterns.
22
3-
use std::{iter::repeat, sync::Arc};
3+
use std::iter::repeat;
44

55
use chalk_ir::Mutability;
66
use hir_def::{
@@ -100,10 +100,9 @@ impl<'a> InferenceContext<'a> {
100100
expected: &Ty,
101101
mut default_bm: BindingMode,
102102
) -> Ty {
103-
let body = Arc::clone(&self.body); // avoid borrow checker problem
104103
let mut expected = self.resolve_ty_shallow(expected);
105104

106-
if is_non_ref_pat(&body, pat) {
105+
if is_non_ref_pat(&self.body, pat) {
107106
let mut pat_adjustments = Vec::new();
108107
while let Some((inner, _lifetime, mutability)) = expected.as_reference() {
109108
pat_adjustments.push(Adjustment {
@@ -122,7 +121,7 @@ impl<'a> InferenceContext<'a> {
122121
pat_adjustments.shrink_to_fit();
123122
self.result.pat_adjustments.insert(pat, pat_adjustments);
124123
}
125-
} else if let Pat::Ref { .. } = &body[pat] {
124+
} else if let Pat::Ref { .. } = &self.body[pat] {
126125
cov_mark::hit!(match_ergonomics_ref);
127126
// When you encounter a `&pat` pattern, reset to Move.
128127
// This is so that `w` is by value: `let (_, &w) = &(1, &2);`
@@ -133,7 +132,7 @@ impl<'a> InferenceContext<'a> {
133132
let default_bm = default_bm;
134133
let expected = expected;
135134

136-
let ty = match &body[pat] {
135+
let ty = match &self.body[pat] {
137136
Pat::Tuple { args, ellipsis } => {
138137
let expectations = match expected.as_tuple() {
139138
Some(parameters) => &*parameters.as_slice(Interner),

0 commit comments

Comments
 (0)