From d46197f1fdfc2c8600197bbf23f865169d3d7591 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sun, 30 Oct 2016 21:49:27 -0600 Subject: [PATCH] fixes to binding. --- src/l0/ast.rs | 11 +---------- src/l0/codegen.rs | 1 + src/l0/machine.rs | 26 ++++++++++++++------------ 3 files changed, 16 insertions(+), 22 deletions(-) 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; -- 2.54.0