From: Mark Thom Date: Sun, 30 Oct 2016 06:19:25 +0000 (-0600) Subject: codegen fix X-Git-Tag: v0.8.110~792 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=509b7838c7daad7132d7c7bbde93e3a1f37f3ac2;p=scryer-prolog.git codegen fix --- diff --git a/src/l0/codegen.rs b/src/l0/codegen.rs index 0c2a642a..f813c4fc 100644 --- a/src/l0/codegen.rs +++ b/src/l0/codegen.rs @@ -59,7 +59,7 @@ pub fn compile_query<'a>(t: &'a Term) -> Program let mut counter : usize = max_reg_used; // r + 1; - for t in terms { + for t in terms { if t.is_variable() && !variable_allocs.contains_key(t.name()) { counter += 1; variable_allocs.insert(t.name(), (counter, false)); @@ -71,9 +71,12 @@ pub fn compile_query<'a>(t: &'a Term) -> Program max_reg_used = counter; for t in terms.iter().rev() { - let r = if t.is_variable() { - variable_allocs.get(t.name()).unwrap().0 - } else { + if t.is_variable() { + counter -= 1; + continue; + } + + let r = { let oc = counter; counter -= 1; oc @@ -85,7 +88,7 @@ pub fn compile_query<'a>(t: &'a Term) -> Program &Term::Clause(ref atom, ref terms) => stack.push(IntTerm::UnfinishedClause(r, atom, terms)), _ => {} - }; + }; } }, IntTerm::FinishedAtom(r, atom) => @@ -112,7 +115,7 @@ pub fn compile_query<'a>(t: &'a Term) -> Program } else { query.push(MachineInstruction::SetValue(counter)); counter += 1; - } + } } max_reg_used = counter - 1; diff --git a/src/l0/machine.rs b/src/l0/machine.rs index e2e3cd9f..e87c04ee 100644 --- a/src/l0/machine.rs +++ b/src/l0/machine.rs @@ -170,7 +170,9 @@ impl MachineState { self.registers[reg] = self.heap[self.h].clone(); self.h += 1; } - }; + }; + + self.s += 1; }, MachineInstruction::UnifyValue(reg) => { let s = self.s; diff --git a/src/main.rs b/src/main.rs index 00376731..af1d26a9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -35,8 +35,8 @@ fn l0_repl<'a>() { let program = compile_fact(&fact); ms = MachineState::new(); - ms.program = Some(program); - + ms.program = Some(program); + println!("Program stored."); }, Ok(TopLevel::Query(query)) => {