Skip to content

Commit

Permalink
perf(kindcheck): Avoid some unnecessary kind allocations
Browse files Browse the repository at this point in the history
  • Loading branch information
Marwes committed Jan 27, 2019
1 parent 14fc70f commit 0afc648
Showing 1 changed file with 24 additions and 15 deletions.
39 changes: 24 additions & 15 deletions check/src/kindcheck.rs
Original file line number Diff line number Diff line change
Expand Up @@ -245,21 +245,12 @@ impl<'a> KindCheck<'a> {
let mut prev_span = ctor.span();

for arg in args {
let f = Kind::function(self.subs.new_var(), self.subs.new_var());
kind = self.unify(prev_span, &f, kind)?;
kind = match *kind {
Kind::Function(ref arg_kind, ref ret) => {
let actual = self.kindcheck(arg)?;
self.unify(arg.span(), arg_kind, actual)?;
ret.clone()
}
_ => {
return Err(pos::spanned(
arg.span(),
UnifyError::TypeMismatch(self.function1_kind(), kind.clone()),
));
}
};
let (arg_kind, ret) = self.unify_function(prev_span, kind)?;

let actual = self.kindcheck(arg)?;
self.unify(arg.span(), &arg_kind, actual)?;

kind = ret;
prev_span = arg.span();
}
Ok(kind)
Expand Down Expand Up @@ -355,6 +346,24 @@ impl<'a> KindCheck<'a> {
}
}

fn unify_function(
&mut self,
span: Span<BytePos>,
actual: ArcKind,
) -> Result<(ArcKind, ArcKind)> {
if let Kind::Function(arg, ret) = &**self.subs.real(&actual) {
return Ok((arg.clone(), ret.clone()));
}

let arg = self.subs.new_var();
let ret = self.subs.new_var();
let f = Kind::function(arg.clone(), ret.clone());

self.unify(span, &f, actual)?;

Ok((arg, ret))
}

fn unify(
&mut self,
span: Span<BytePos>,
Expand Down

0 comments on commit 0afc648

Please sign in to comment.