summaryrefslogtreecommitdiff
path: root/dhall/src/normalize.rs
diff options
context:
space:
mode:
authorNadrieril2019-05-03 14:15:28 +0200
committerNadrieril2019-05-03 14:15:28 +0200
commit49653bf413891b629130a609e0b33ac4155b7637 (patch)
treebc24865004afe544c50edf46ee7596d09b2f0f3a /dhall/src/normalize.rs
parent4321a3ebe06a4399e02c39fb615d69d72ef01828 (diff)
Avoid unnecessary RefCell::borrow_mut
Diffstat (limited to 'dhall/src/normalize.rs')
-rw-r--r--dhall/src/normalize.rs39
1 files changed, 33 insertions, 6 deletions
diff --git a/dhall/src/normalize.rs b/dhall/src/normalize.rs
index cff7fdc..5749989 100644
--- a/dhall/src/normalize.rs
+++ b/dhall/src/normalize.rs
@@ -1002,9 +1002,11 @@ mod thunk {
}
fn normalize_nf(&mut self) {
- self.normalize_whnf();
match self {
- ThunkInternal::Unnormalized(_, _) => unreachable!(),
+ ThunkInternal::Unnormalized(_, _) => {
+ self.normalize_whnf();
+ self.normalize_nf();
+ }
ThunkInternal::Value(m @ WHNF, v) => {
v.normalize_mut();
*m = NF;
@@ -1091,17 +1093,42 @@ mod thunk {
}
}
+ fn do_normalize_whnf(&self) {
+ let borrow = self.0.borrow();
+ match &*borrow {
+ ThunkInternal::Unnormalized(_, _) => {
+ drop(borrow);
+ self.0.borrow_mut().normalize_whnf();
+ }
+ // Already at least in WHNF
+ ThunkInternal::Value(_, _) => {}
+ }
+ }
+
+ fn do_normalize_nf(&self) {
+ let borrow = self.0.borrow();
+ match &*borrow {
+ ThunkInternal::Unnormalized(_, _)
+ | ThunkInternal::Value(WHNF, _) => {
+ drop(borrow);
+ self.0.borrow_mut().normalize_nf();
+ }
+ // Already in NF
+ ThunkInternal::Value(NF, _) => {}
+ }
+ }
+
// WARNING: avoid normalizing any thunk while holding on to this ref
- // or you will run into BorrowMut panics
+ // or you could run into BorrowMut panics
pub(crate) fn normalize_whnf(&self) -> Ref<Value> {
- self.0.borrow_mut().normalize_whnf();
+ self.do_normalize_whnf();
Ref::map(self.0.borrow(), ThunkInternal::as_whnf)
}
// WARNING: avoid normalizing any thunk while holding on to this ref
- // or you will run into BorrowMut panics
+ // or you could run into BorrowMut panics
pub(crate) fn normalize_nf(&self) -> Ref<Value> {
- self.0.borrow_mut().normalize_nf();
+ self.do_normalize_nf();
Ref::map(self.0.borrow(), ThunkInternal::as_nf)
}