From: Mark Thom Date: Sun, 5 Dec 2021 06:46:31 +0000 (-0700) Subject: fix bugs revealed by src/tests/builtins.pl X-Git-Tag: v0.9.0^2~107 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=cd129e32a7af4d160e3ce8120f07cd1dedac26e5;p=scryer-prolog.git fix bugs revealed by src/tests/builtins.pl --- diff --git a/src/codegen.rs b/src/codegen.rs index 243974aa..ca344558 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -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) => { diff --git a/src/heap_iter.rs b/src/heap_iter.rs index b5c83a22..df211339 100644 --- a/src/heap_iter.rs +++ b/src/heap_iter.rs @@ -204,9 +204,6 @@ impl<'a> StackfulPreOrderHeapIter<'a> { return Some(self.heap[h]); } - // (HeapCellValueTag::StackVar) => { - // unreachable!() // TODO: here, crashing. - // } _ => { return Some(*cell); } diff --git a/src/machine/heap.rs b/src/machine/heap.rs index 462aacbc..cb166b69 100644 --- a/src/machine/heap.rs +++ b/src/machine/heap.rs @@ -67,6 +67,10 @@ impl TryFrom for Literal { (ArenaHeaderTag::Rational, n) => { Ok(Literal::Rational(n)) } + (ArenaHeaderTag::F64, f) => { + // remove this redundancy. + Ok(Literal::Float(F64Ptr(f))) + } _ => { Err(()) } diff --git a/src/machine/loader.rs b/src/machine/loader.rs index d7ed073e..ba1a5cea 100644 --- a/src/machine/loader.rs +++ b/src/machine/loader.rs @@ -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(); diff --git a/src/machine/machine_state.rs b/src/machine/machine_state.rs index 32665ad7..1ca0a784 100644 --- a/src/machine/machine_state.rs +++ b/src/machine/machine_state.rs @@ -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(()); diff --git a/src/machine/machine_state_impl.rs b/src/machine/machine_state_impl.rs index dbf44bed..dfaa502e 100644 --- a/src/machine/machine_state_impl.rs +++ b/src/machine/machine_state_impl.rs @@ -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; } diff --git a/src/machine/mock_wam.rs b/src/machine/mock_wam.rs index 0cbae419..42d3f600 100644 --- a/src/machine/mock_wam.rs +++ b/src/machine/mock_wam.rs @@ -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))); } } diff --git a/src/tests/builtins.pl b/src/tests/builtins.pl index 96b5e4c0..a87fc22a 100644 --- a/src/tests/builtins.pl +++ b/src/tests/builtins.pl @@ -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]). diff --git a/tests/scryer/main.rs b/tests/scryer/main.rs index 08072d36..7865c0b3 100644 --- a/tests/scryer/main.rs +++ b/tests/scryer/main.rs @@ -1,3 +1,3 @@ mod helper; -// mod issues; +mod issues; mod src_tests;