]> Repositorios git - scryer-prolog.git/commitdiff
dereference TermWriteResult variables sooner in read_term_body (#1894)
authorMark <[email protected]>
Tue, 18 Jul 2023 21:39:51 +0000 (15:39 -0600)
committerMark <[email protected]>
Tue, 18 Jul 2023 21:39:51 +0000 (15:39 -0600)
src/machine/machine_state.rs
src/read.rs

index 142f5a985604e22e9423e9fd51159541edfe2880..d76e1cf1e1163c3a1f671500275e70f80d593252 100644 (file)
@@ -563,17 +563,19 @@ impl MachineState {
             }
         );
 
-        let term = self.registers[2];
-        unify_fn!(*self, heap_loc, term);
-        let term = heap_loc;
+        unify_fn!(*self, heap_loc, self.registers[2]);
 
         if self.fail {
             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();
 
-        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);
 
             if let Some(var) = cell.as_var() {
@@ -609,8 +611,9 @@ impl MachineState {
 
         for (var_name, addr) in term_write_result.var_dict {
             if let Some(var) = addr.as_var() {
-                let idx = singleton_var_set.get_index_of(&var).unwrap();
-                var_list.push((var_name, addr, idx));
+                if let Some(idx) = singleton_var_set.get_index_of(&var) {
+                    var_list.push((var_name, addr, idx));
+                }
             }
         }
 
index fac2e4e804824216f9c9a568e59cd0afa6e7166b..3afb4bf910694dc77223775843044ede6d37759e 100644 (file)
@@ -422,7 +422,7 @@ impl<'a, 'b> TermWriter<'a, 'b> {
                         continue;
                     }
                 }
-                &TermRef::Var(_, _, ref var) => {
+                &TermRef::Var(.., ref var) => {
                     if let Some((arity, site_h)) = self.queue.pop_front() {
                         let var_key = VarKey::VarPtr(var.clone());