]> Repositorios git - scryer-prolog.git/commitdiff
codegen fix
authorMark Thom <[email protected]>
Sun, 30 Oct 2016 06:19:25 +0000 (00:19 -0600)
committerMark Thom <[email protected]>
Sun, 30 Oct 2016 06:19:25 +0000 (00:19 -0600)
src/l0/codegen.rs
src/l0/machine.rs
src/main.rs

index 0c2a642a868c40792da6d1570092eb4733999da4..f813c4fc05802711f7e6914f79a5de4b602f0849 100644 (file)
@@ -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;
index e2e3cd9f1838e2ddbfe40fd110895863f5ab2dbe..e87c04eeda5ac77e173a648ba32a465d4cf945fe 100644 (file)
@@ -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;
index 00376731b1440a0199640f3654083bad8cc5146e..af1d26a9f1e457638c6346891d2ca4410e450531 100644 (file)
@@ -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)) => {