&Term::AnonVar | &Term::Clause(..) | &Term::Cons(..) | &Term::PartialString(..) => {
code.push(fail!());
}
+ &Term::Literal(_, Literal::String(_)) => {
+ code.push(fail!());
+ }
&Term::Literal(..) => {
code.push(succeed!());
}
}
},
&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) => {
| &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) => {
},
&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) => {
return Some(self.heap[h]);
}
- // (HeapCellValueTag::StackVar) => {
- // unreachable!() // TODO: here, crashing.
- // }
_ => {
return Some(*cell);
}
(ArenaHeaderTag::Rational, n) => {
Ok(Literal::Rational(n))
}
+ (ArenaHeaderTag::F64, f) => {
+ // remove this redundancy.
+ Ok(Literal::Float(F64Ptr(f)))
+ }
_ => {
Err(())
}
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();
}
(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)) => {
));
}
}
- (HeapCellValueTag::PStrOffset, h) => {
+ (HeapCellValueTag::PStrLoc, h) => {
let string = cell_as_atom_cell!(iter.heap[h]).get_name();
let tail = term_stack.pop().unwrap();
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(());
}
&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();
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() {
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;
}
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)));
}
}
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]).
mod helper;
-// mod issues;
+mod issues;
mod src_tests;