From: Mark Thom Date: Mon, 31 Oct 2016 03:49:27 +0000 (-0600) Subject: fixes to binding. X-Git-Tag: v0.8.110~790 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=d46197f1fdfc2c8600197bbf23f865169d3d7591;p=scryer-prolog.git fixes to binding. --- diff --git a/src/l0/ast.rs b/src/l0/ast.rs index f88af86f..ee08b35a 100644 --- a/src/l0/ast.rs +++ b/src/l0/ast.rs @@ -29,17 +29,8 @@ pub enum MachineInstruction { pub type Program = Vec; -#[derive(Clone, Copy, PartialEq)] +#[derive(Clone, Copy, PartialEq)] pub enum Addr { HeapCell(usize), RegNum(usize) } - -impl Addr { - pub fn heap_offset(&self) -> usize { - match self { - &Addr::HeapCell(hc) => hc, - &Addr::RegNum(reg) => reg - } - } -} diff --git a/src/l0/codegen.rs b/src/l0/codegen.rs index c5a643bd..8f50e7b8 100644 --- a/src/l0/codegen.rs +++ b/src/l0/codegen.rs @@ -147,6 +147,7 @@ pub fn compile_fact<'a>(t: &'a Term) -> Program { if let &Term::Var(ref var) = t.as_ref() { if !variable_allocs.contains_key(var) { variable_allocs.insert(var, counter); + fact.push(MachineInstruction::UnifyVariable(counter)); counter += 1; } else { diff --git a/src/l0/machine.rs b/src/l0/machine.rs index e87c04ee..e9146f9f 100644 --- a/src/l0/machine.rs +++ b/src/l0/machine.rs @@ -6,7 +6,7 @@ use std::vec::{Vec}; #[derive(Clone)] enum HeapCell { NamedStr(usize, Atom), - Ref(usize), // these offsets are always in reference to cells on the Heap! + Ref(usize), Str(usize), } @@ -53,11 +53,11 @@ impl MachineState { loop { if let &HeapCell::Ref(value) = self.lookup(a) { - if value != a.heap_offset() { - a = Addr::HeapCell(value); - continue; - } else { - return a; + if let Addr::HeapCell(av) = a { + if value != av { + a = Addr::HeapCell(value); + continue; + } } } @@ -65,10 +65,10 @@ impl MachineState { }; } - fn bind(&mut self, a: Addr, val: Addr) { + fn bind(&mut self, a: Addr, val: usize) { match a { - Addr::RegNum(reg) => self.registers[reg] = HeapCell::Ref(val.heap_offset()), - Addr::HeapCell(hc) => self.heap[hc] = HeapCell::Ref(val.heap_offset()), + Addr::RegNum(reg) => self.registers[reg] = HeapCell::Ref(val), + Addr::HeapCell(hc) => self.heap[hc] = HeapCell::Ref(val), }; } @@ -83,8 +83,10 @@ impl MachineState { if d1 != d2 { match (self.lookup(d1), self.lookup(d2)) { - (&HeapCell::Ref(_), _) | (_, &HeapCell::Ref(_)) => - self.bind(d1, d2), + (&HeapCell::Ref(hc), _) => + self.bind(d2, hc), + (_, &HeapCell::Ref(hc)) => + self.bind(d1, hc), (&HeapCell::Str(a1), &HeapCell::Str(a2)) => { let r1 = &self.heap[a1]; let r2 = &self.heap[a2]; @@ -134,7 +136,7 @@ impl MachineState { let h = self.h; - self.bind(Addr::RegNum(reg), Addr::HeapCell(h)); + self.bind(Addr::RegNum(reg), h); self.h += 2; self.mode = MachineMode::Write;