dereference TermWriteResult variables sooner in read_term_body (#1894)
This commit is contained in:
@@ -563,17 +563,19 @@ impl MachineState {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
let term = self.registers[2];
|
unify_fn!(*self, heap_loc, self.registers[2]);
|
||||||
unify_fn!(*self, heap_loc, term);
|
|
||||||
let term = heap_loc;
|
|
||||||
|
|
||||||
if self.fail {
|
if self.fail {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for var in term_write_result.var_dict.values_mut() {
|
||||||
|
*var = heap_bound_deref(&self.heap, *var);
|
||||||
|
}
|
||||||
|
|
||||||
let mut singleton_var_set: IndexMap<Ref, bool> = IndexMap::new();
|
let mut singleton_var_set: IndexMap<Ref, bool> = IndexMap::new();
|
||||||
|
|
||||||
for cell in stackful_preorder_iter(&mut self.heap, &mut self.stack, term) {
|
for cell in stackful_preorder_iter(&mut self.heap, &mut self.stack, heap_loc) {
|
||||||
let cell = unmark_cell_bits!(cell);
|
let cell = unmark_cell_bits!(cell);
|
||||||
|
|
||||||
if let Some(var) = cell.as_var() {
|
if let Some(var) = cell.as_var() {
|
||||||
@@ -609,10 +611,11 @@ impl MachineState {
|
|||||||
|
|
||||||
for (var_name, addr) in term_write_result.var_dict {
|
for (var_name, addr) in term_write_result.var_dict {
|
||||||
if let Some(var) = addr.as_var() {
|
if let Some(var) = addr.as_var() {
|
||||||
let idx = singleton_var_set.get_index_of(&var).unwrap();
|
if let Some(idx) = singleton_var_set.get_index_of(&var) {
|
||||||
var_list.push((var_name, addr, idx));
|
var_list.push((var_name, addr, idx));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
self.write_read_term_options(var_list, singleton_var_list)
|
self.write_read_term_options(var_list, singleton_var_list)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -422,7 +422,7 @@ impl<'a, 'b> TermWriter<'a, 'b> {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
&TermRef::Var(_, _, ref var) => {
|
&TermRef::Var(.., ref var) => {
|
||||||
if let Some((arity, site_h)) = self.queue.pop_front() {
|
if let Some((arity, site_h)) = self.queue.pop_front() {
|
||||||
let var_key = VarKey::VarPtr(var.clone());
|
let var_key = VarKey::VarPtr(var.clone());
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user