diff --git a/Cargo.lock b/Cargo.lock index 6c55c9ba..ef3f28a0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,9 +23,9 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "az" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9bcd47d94aa4eb8c076b50fc61a75020789394ffb9bd74a180b3379130f6569" +checksum = "d84e1d907bfc5795a6addb95ef8666141ee73c8f2f5250ff2a46bf4e4f4aec8a" [[package]] name = "base64" @@ -470,9 +470,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.84" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cca32fa0182e8c0989459524dc356b8f2b5c10f1b9eb521b7d182c03cf8c5ff" +checksum = "7ccac4b00700875e6a07c6cde370d44d32fa01c5a65cdd2fca6858c479d28bb3" [[package]] name = "libsodium-sys" @@ -1103,9 +1103,9 @@ dependencies = [ [[package]] name = "ring" -version = "0.16.19" +version = "0.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "024a1e66fea74c66c66624ee5622a7ff0e4b73a13b4f5c326ddb50c708944226" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" dependencies = [ "cc", "libc", diff --git a/Cargo.toml b/Cargo.toml index 084990ef..c49eebcf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,9 @@ keywords = ["prolog", "prolog-interpreter", "prolog-system"] categories = ["command-line-utilities"] build = "build.rs" +[workspace] +members = ["crates/prolog_parser"] + [build-dependencies] indexmap = "1.0.2" diff --git a/src/machine/machine_state_impl.rs b/src/machine/machine_state_impl.rs index 277caa08..1b62431e 100644 --- a/src/machine/machine_state_impl.rs +++ b/src/machine/machine_state_impl.rs @@ -162,6 +162,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) {