]> Repositorios git - scryer-prolog.git/commitdiff
fix bugs revealed by src/tests/builtins.pl
authorMark Thom <[email protected]>
Sun, 5 Dec 2021 06:46:31 +0000 (23:46 -0700)
committerMark Thom <[email protected]>
Fri, 7 Jan 2022 04:44:41 +0000 (21:44 -0700)
src/codegen.rs
src/heap_iter.rs
src/machine/heap.rs
src/machine/loader.rs
src/machine/machine_state.rs
src/machine/machine_state_impl.rs
src/machine/mock_wam.rs
src/tests/builtins.pl
tests/scryer/main.rs

index 243974aa1b6da9f526d7443179eac5971cb69f21..ca344558693d7605b532151f026d6d285b562cd2 100644 (file)
@@ -538,6 +538,9 @@ impl<'a, 'b: 'a, TermMarker: Allocator<'a>> CodeGenerator<'b, TermMarker> {
                 &Term::AnonVar | &Term::Clause(..) | &Term::Cons(..) | &Term::PartialString(..) => {
                     code.push(fail!());
                 }
+                &Term::Literal(_, Literal::String(_)) => {
+                    code.push(fail!());
+                }
                 &Term::Literal(..) => {
                     code.push(succeed!());
                 }
@@ -548,7 +551,8 @@ impl<'a, 'b: 'a, TermMarker: Allocator<'a>> CodeGenerator<'b, TermMarker> {
                 }
             },
             &InlinedClauseType::IsCompound(..) => match &terms[0] {
-                &Term::Clause(..) | &Term::Cons(..) => {
+                &Term::Clause(..) | &Term::Cons(..) | &Term::PartialString(..) |
+                &Term::Literal(_, Literal::String(..)) => {
                     code.push(succeed!());
                 }
                 &Term::Var(ref vr, ref name) => {
@@ -591,7 +595,6 @@ impl<'a, 'b: 'a, TermMarker: Allocator<'a>> CodeGenerator<'b, TermMarker> {
                 | &Term::Literal(_, Literal::Rational(_))
                 | &Term::Literal(_, Literal::Integer(_))
                 | &Term::Literal(_, Literal::Fixnum(_)) => {
-                    // | &Term::Literal(_, Literal::Usize(_)) => {
                     code.push(succeed!());
                 }
                 &Term::Var(ref vr, ref name) => {
@@ -618,7 +621,6 @@ impl<'a, 'b: 'a, TermMarker: Allocator<'a>> CodeGenerator<'b, TermMarker> {
             },
             &InlinedClauseType::IsInteger(..) => match &terms[0] {
                 &Term::Literal(_, Literal::Integer(_)) | &Term::Literal(_, Literal::Fixnum(_)) => {
-                    // | &Term::Literal(_, Literal::Usize(_)) => {
                     code.push(succeed!());
                 }
                 &Term::Var(ref vr, ref name) => {
index b5c83a22360184fd701ec67f800a4d9b12ec458a..df211339e20024f99659f656e4a4eea35afcac06 100644 (file)
@@ -204,9 +204,6 @@ impl<'a> StackfulPreOrderHeapIter<'a> {
 
                    return Some(self.heap[h]);
                }
-               // (HeapCellValueTag::StackVar) => {
-               //     unreachable!() // TODO: here, crashing.
-               // }
                _ => {
                    return Some(*cell);
                }
index 462aacbce705970b2b922e2587a0fc47520144d2..cb166b692233a690cbd177a93d40dee8410aefa1 100644 (file)
@@ -67,6 +67,10 @@ impl TryFrom<HeapCellValue> for Literal {
                      (ArenaHeaderTag::Rational, n) => {
                          Ok(Literal::Rational(n))
                      }
+                     (ArenaHeaderTag::F64, f) => {
+                         // remove this redundancy.
+                         Ok(Literal::Float(F64Ptr(f)))
+                     }
                      _ => {
                          Err(())
                      }
index d7ed073eae616172985f43ffb1e90d8a80dbf9dd..ba1a5cea0fc3d238a5c4e79ab9f47dc268f486ec 100644 (file)
@@ -446,6 +446,8 @@ impl<'a, LS: LoadState<'a>> Loader<'a, LS> {
         let mut iter = stackful_post_order_iter(&mut machine_st.heap, term_addr);
 
         while let Some(addr) = iter.next() {
+            let addr = unmark_cell_bits!(addr);
+
             read_heap_cell!(addr,
                 (HeapCellValueTag::Lis) => {
                     let tail = term_stack.pop().unwrap();
@@ -459,7 +461,6 @@ impl<'a, LS: LoadState<'a>> Loader<'a, LS> {
                 }
                 (HeapCellValueTag::Cons | HeapCellValueTag::CStr | HeapCellValueTag::Fixnum |
                  HeapCellValueTag::Char | HeapCellValueTag::F64) => {
-                   let addr = unmark_cell_bits!(addr);
                     term_stack.push(Term::Literal(Cell::default(), Literal::try_from(addr).unwrap()));
                 }
                 (HeapCellValueTag::Atom, (name, arity)) => {
@@ -490,7 +491,7 @@ impl<'a, LS: LoadState<'a>> Loader<'a, LS> {
                         ));
                     }
                 }
-                (HeapCellValueTag::PStrOffset, h) => {
+                (HeapCellValueTag::PStrLoc, h) => {
                     let string = cell_as_atom_cell!(iter.heap[h]).get_name();
                     let tail = term_stack.pop().unwrap();
 
index 32665ad7f0b82a47e3e3f4c5f710bc79d92204eb..1ca0a784f5abc9f8d171ec057ec86a250661c8be 100644 (file)
@@ -966,9 +966,8 @@ impl MachineState {
         loop {
             match self.read(stream, &indices.op_dir) {
                 Ok(term_write_result) => {
-                    let term = self.registers[2];
+                    let term = self.store(self.deref(self.registers[2]));
                     unify_fn!(self, heap_loc_as_cell!(term_write_result.heap_loc), term);
-                    let term = self.store(self.deref(term));
 
                     if self.fail {
                         return Ok(());
index dbf44bed631bcc86514d12c7e3a2d8585daac914..dfaa502eb70b3aaefd2e3872a215b5fb161b4a68 100644 (file)
@@ -2847,15 +2847,15 @@ impl MachineState {
             }
             &QueryInstruction::SetLocalValue(reg) => {
                 let addr = self.deref(self[reg]);
-                let h = self.heap.len();
+                let stored_v = self.store(addr);
 
-                if addr < Ref::heap_cell(h) {
-                    self.heap.push(addr);
-                    return;
+                if stored_v.is_stack_var() {
+                    let h = self.heap.len();
+                    self.heap.push(heap_loc_as_cell!(h));
+                    (self.bind_fn)(self, Ref::heap_cell(h), stored_v);
+                } else {
+                    self.heap.push(stored_v);
                 }
-
-                self.heap.push(heap_loc_as_cell!(h));
-                (self.bind_fn)(self, Ref::heap_cell(h), addr);
             }
             &QueryInstruction::SetVariable(reg) => {
                 let h = self.heap.len();
@@ -2956,6 +2956,7 @@ impl MachineState {
             return false;
         }
 
+        let addr = self.store(self.deref(addr));
         let mut iter = stackful_preorder_iter(&mut self.heap, addr);
 
         while let Some(value) = iter.next() {
@@ -3624,9 +3625,15 @@ impl MachineState {
             return false;
         }
 
-        let value = self.registers[1];
+        let value = self.store(self.deref(self.registers[1]));
+
+        if value.is_stack_var() {
+            return true;
+        }
 
         for v in stackful_preorder_iter(&mut self.heap, value) {
+            let v = unmark_cell_bits!(v);
+
             if v.is_var() {
                 return true;
             }
index 0cbae41921ba4b45410eb0ddc5e2e066f86f9984..42d3f600e377be708349f721d3d2be4abe75dbda 100644 (file)
@@ -846,6 +846,6 @@ mod tests {
         wam.heap.push(pstr_as_cell!(atom!("a string")));
         wam.heap.push(empty_list_as_cell!());
 
-        assert!(!wam.is_cyclic_term(heap_loc_as_cell!(0)));
+        assert!(!wam.is_cyclic_term(pstr_loc_as_cell!(0)));
     }
 }
index 96b5e4c0be34aa84acab10a9def735ac4d7aebe6..a87fc22a99ed7f661ee1ab2e12edf4f23a944ddf 100644 (file)
@@ -115,14 +115,6 @@ test_queries_on_builtins :-
     1.1 @< 1,
     1.0 @=< 1,
     \+ 1 @=< 1.0,
-    \+ \+ (variant(X, Y)),
-    \+ (variant(f(X), f(x))),
-    \+ \+ (variant(X, X)),
-    \+ \+ (variant(f(x), f(x))),
-    \+ (variant([X,Y,Z], [V,W,V])),
-    \+ \+ (variant([X,Y,Z], [V,W,Z])),
-    \+ \+ (variant([X,Y,X], [V,W,V])),
-    \+ \+ (g(B) = B, g(A) = A, variant(A, B)),
     keysort([1-1,1-1],[1-1,1-1]),
     \+ \+ findall(Sorted, keysort([2-99,1-a,3-f(_),1-z,1-a,2-44],Sorted), [[1-a,1-z,1-a,2-99,2-44,3-f(_)]]),
     \+ \+ findall(X, keysort([X-1,1-1],[2-1,1-1]), [2]).
index 08072d36092d79d7bad65e7ab3d3672bf315f4bb..7865c0b3917da519722cc799025747f9d93d2c26 100644 (file)
@@ -1,3 +1,3 @@
 mod helper;
-// mod issues;
+mod issues;
 mod src_tests;