From: Mark Thom Date: Wed, 3 Feb 2021 18:11:22 +0000 (-0700) Subject: do not traverse data structures when binding to local variables in unify_with_occurs_... X-Git-Tag: v0.9.0~153 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=f5d808e68f0763cbe86f5b7c82e29a4cc6ee7823;p=scryer-prolog.git do not traverse data structures when binding to local variables in unify_with_occurs_check (#781) --- diff --git a/src/machine/machine_state_impl.rs b/src/machine/machine_state_impl.rs index 5de07140..f7cda917 100644 --- a/src/machine/machine_state_impl.rs +++ b/src/machine/machine_state_impl.rs @@ -201,6 +201,14 @@ impl MachineState { } fn bind_with_occurs_check(&mut self, r: Ref, addr: Addr) { + if let Ref::StackCell(..) = r { + // local variable optimization -- r cannot occur in the + // data structure bound to addr, so don't bother + // traversing it. + self.bind(r, addr); + return; + } + let mut fail = false; for addr in self.acyclic_pre_order_iter(addr) {