throw errors on cyclic terms when evaluating is/2 expressions
This commit is contained in:
@@ -1102,24 +1102,30 @@ impl MachineState {
|
|||||||
|
|
||||||
while let Some(value) = iter.next() {
|
while let Some(value) = iter.next() {
|
||||||
if value.get_forwarding_bit() {
|
if value.get_forwarding_bit() {
|
||||||
|
std::mem::drop(iter);
|
||||||
|
|
||||||
let (name, arity) = read_heap_cell!(value,
|
let (name, arity) = read_heap_cell!(value,
|
||||||
(HeapCellValueTag::Atom, (name, arity)) => {
|
(HeapCellValueTag::Atom, (name, arity)) => {
|
||||||
(name, arity)
|
(name, arity)
|
||||||
}
|
}
|
||||||
(HeapCellValueTag::Lis | HeapCellValueTag::PStr) => {
|
(HeapCellValueTag::Str, s) => {
|
||||||
|
cell_as_atom_cell!(self.heap[s]).get_name_and_arity()
|
||||||
|
}
|
||||||
|
(HeapCellValueTag::Lis | HeapCellValueTag::PStr | HeapCellValueTag::PStrOffset |
|
||||||
|
HeapCellValueTag::PStrLoc) => {
|
||||||
(atom!("."), 2)
|
(atom!("."), 2)
|
||||||
}
|
}
|
||||||
|
(HeapCellValueTag::AttrVar | HeapCellValueTag::Var) => {
|
||||||
|
let err = self.instantiation_error();
|
||||||
|
return Err(self.error_form(err, stub_gen()));
|
||||||
|
}
|
||||||
_ => {
|
_ => {
|
||||||
unreachable!()
|
unreachable!()
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
std::mem::drop(iter);
|
|
||||||
|
|
||||||
let evaluable_error = self.evaluable_error(name, arity);
|
let evaluable_error = self.evaluable_error(name, arity);
|
||||||
let stub = stub_gen();
|
return Err(self.error_form(evaluable_error, stub_gen()));
|
||||||
|
|
||||||
return Err(self.error_form(evaluable_error, stub));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
read_heap_cell!(value,
|
read_heap_cell!(value,
|
||||||
|
|||||||
Reference in New Issue
Block a user