fix bugs revealed by src/tests/builtins.pl
This commit is contained in:
@@ -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) => {
|
||||
|
||||
@@ -204,9 +204,6 @@ impl<'a> StackfulPreOrderHeapIter<'a> {
|
||||
|
||||
return Some(self.heap[h]);
|
||||
}
|
||||
// (HeapCellValueTag::StackVar) => {
|
||||
// unreachable!() // TODO: here, crashing.
|
||||
// }
|
||||
_ => {
|
||||
return Some(*cell);
|
||||
}
|
||||
|
||||
@@ -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(())
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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(());
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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]).
|
||||
|
||||
Reference in New Issue
Block a user