correct '$skip_max_list/4' for non-lists (#1276)

This commit is contained in:
Mark Thom
2022-02-20 23:44:18 -07:00
parent c893247107
commit 063f0da565
2 changed files with 18 additions and 21 deletions

View File

@@ -164,14 +164,14 @@ impl BrentAlgState {
return if name == atom!("[]") && arity == 0 {
CycleSearchResult::ProperList(self.num_steps())
} else {
CycleSearchResult::NotList
CycleSearchResult::NotList(self.num_steps(), heap[self.hare])
};
}
(HeapCellValueTag::Lis, l) => {
return CycleSearchResult::UntouchedList(self.num_steps(), l);
}
_ => {
return CycleSearchResult::NotList;
return CycleSearchResult::NotList(self.num_steps(), heap[self.hare]);
}
);
}
@@ -231,7 +231,7 @@ impl BrentAlgState {
return if name == atom!(".") && arity == 2 {
self.step(s+2)
} else {
Some(CycleSearchResult::NotList)
Some(CycleSearchResult::NotList(self.num_steps(), value))
};
}
(HeapCellValueTag::Atom, (name, arity)) => {
@@ -240,7 +240,7 @@ impl BrentAlgState {
return if name == atom!("[]") {
Some(CycleSearchResult::ProperList(self.num_steps()))
} else {
Some(CycleSearchResult::NotList)
Some(CycleSearchResult::NotList(self.num_steps(), value))
};
}
(HeapCellValueTag::AttrVar | HeapCellValueTag::Var, h) => {
@@ -252,7 +252,7 @@ impl BrentAlgState {
self.hare = h;
}
_ => {
return Some(CycleSearchResult::NotList);
return Some(CycleSearchResult::NotList(self.num_steps(), value));
}
);
}
@@ -298,21 +298,21 @@ impl BrentAlgState {
} else if name == atom!(".") && arity == 2 {
s + 2
} else {
return CycleSearchResult::NotList;
return CycleSearchResult::NotList(0, value);
}
}
(HeapCellValueTag::Atom, (name, arity)) => {
return if name == atom!("[]") && arity == 0 {
CycleSearchResult::EmptyList
} else {
CycleSearchResult::NotList
CycleSearchResult::NotList(0, value)
};
}
(HeapCellValueTag::AttrVar | HeapCellValueTag::StackVar | HeapCellValueTag::Var) => {
return CycleSearchResult::PartialList(0, value.as_var().unwrap());
}
_ => {
return CycleSearchResult::NotList;
return CycleSearchResult::NotList(0, value);
}
);
@@ -397,21 +397,21 @@ impl BrentAlgState {
return CycleSearchResult::UntouchedList(0, s + 1);
}
} else {
return CycleSearchResult::NotList;
return CycleSearchResult::NotList(0, value);
}
}
(HeapCellValueTag::Atom, (name, arity)) => {
return if name == atom!("[]") && arity == 0 {
CycleSearchResult::EmptyList
} else {
CycleSearchResult::NotList
CycleSearchResult::NotList(0, value)
};
}
(HeapCellValueTag::AttrVar | HeapCellValueTag::StackVar | HeapCellValueTag::Var) => {
return CycleSearchResult::PartialList(0, value.as_var().unwrap());
}
_ => {
return CycleSearchResult::NotList;
return CycleSearchResult::NotList(0, value);
}
);
@@ -540,11 +540,8 @@ impl MachineState {
CycleSearchResult::ProperList(steps) => {
self.finalize_skip_max_list(steps as i64, empty_list_as_cell!())
}
CycleSearchResult::NotList => {
let n = self.store(self.deref(self.registers[2]));
self.unify_fixnum(Fixnum::build_with(max_steps), n);
self.finalize_skip_max_list(max_steps, self.registers[3]);
CycleSearchResult::NotList(n, value) => {
self.finalize_skip_max_list(n as i64, value);
}
CycleSearchResult::Cyclic(lam) => {
self.skip_max_list_cycle(lam);