]> Repositorios git - scryer-prolog.git/commitdiff
fix functor! size calculations around indexing_code_ptr
authorMark Thom <[email protected]>
Thu, 24 Apr 2025 05:49:03 +0000 (22:49 -0700)
committerMark Thom <[email protected]>
Tue, 8 Jul 2025 05:38:12 +0000 (22:38 -0700)
src/functor_macro.rs
src/machine/dispatch.rs
src/machine/heap.rs
src/machine/system_calls.rs

index ee69679fa4f51d3b45672090f951a3edbd28cb3a..444c84328a6e71c978f07a00bfa7fe44714b78b6 100644 (file)
@@ -61,10 +61,17 @@ macro_rules! build_functor {
      [$($res:expr),*],
      $res_len:expr,
      [$($subfunctor:expr),*]) => ({
+        let (inner_functor, cell_size) = indexing_code_ptr($e);
+        let referent = if cell_size == 1 {
+            heap_loc_as_cell!(1u64 + count!($($dt)*) + $res_len)
+        } else {
+            str_loc_as_cell!(1u64 + count!($($dt)*) + $res_len)
+        };
+
         build_functor!([$($dt($($value),*)),*],
-                       [$($res, )* FunctorElement::Cell(str_loc_as_cell!(1u64 + count!($($dt)*) + $res_len))],
-                       3 + $res_len,
-                       [$($subfunctor, )* FunctorElement::InnerFunctor(2, indexing_code_ptr($e))])
+                       [$($res, )* FunctorElement::Cell(referent)],
+                       1 + cell_size + $res_len,
+                       [$($subfunctor, )* FunctorElement::InnerFunctor(cell_size, inner_functor)])
     });
     ([fixnum($e:expr) $(, $dt:ident($($value:tt),*))*],
      [$($res:expr),*],
@@ -171,20 +178,14 @@ macro_rules! build_functor {
     });
 }
 
-pub(crate) fn indexing_code_ptr(code_ptr: IndexingCodePtr) -> Vec<FunctorElement> {
+pub(crate) fn indexing_code_ptr(code_ptr: IndexingCodePtr) -> (Vec<FunctorElement>, u64) {
     match code_ptr {
         IndexingCodePtr::DynamicExternal(o) => {
-            functor!(atom!("dynamic_external"), [fixnum(o)])
-        }
-        IndexingCodePtr::External(o) => {
-            functor!(atom!("external"), [fixnum(o)])
-        }
-        IndexingCodePtr::Internal(o) => {
-            functor!(atom!("internal"), [fixnum(o)])
-        }
-        IndexingCodePtr::Fail => {
-            vec![FunctorElement::Cell(atom_as_cell!(atom!("fail")))]
+            (functor!(atom!("dynamic_external"), [fixnum(o)]), 2)
         }
+        IndexingCodePtr::External(o) => (functor!(atom!("external"), [fixnum(o)]), 2),
+        IndexingCodePtr::Internal(o) => (functor!(atom!("internal"), [fixnum(o)]), 2),
+        IndexingCodePtr::Fail => (vec![FunctorElement::Cell(atom_as_cell!(atom!("fail")))], 1),
     }
 }
 
index 94b26ad324e551c2689ecca6c7b1317ca3576f6d..3a88221a97a92aa19fad780d8be3b0e183d9c0bf 100644 (file)
@@ -242,7 +242,6 @@ impl MachineState {
                 c
             }
             (HeapCellValueTag::Atom, (_name, arity)) => {
-                // if arity == 0 { c } else { s }
                 debug_assert!(arity == 0);
                 c
             }
index c08ba03fbac5096414740a832de210b8defb55cb..b03d5efaa502287493e81ba0763c95eefce4bc22 100644 (file)
@@ -1092,7 +1092,7 @@ pub fn heap_bound_store(heap: &impl SizedHeap, value: HeapCellValue) -> HeapCell
 }
 
 #[allow(dead_code)]
-pub fn print_heap_terms(heap: &Heap, h: usize) {
+pub fn print_heap_terms(heap: &impl SizedHeap, h: usize) {
     for idx in 0..heap.cell_len() {
         let term = heap[idx];
         println!("{} : {:?}", h + idx, term);
index b684d3ed9f7de3c8bc0080c83d7de7a8bfd72761..43bd632a8e0de282b9d2f075d44feae1c8350a93 100644 (file)
@@ -7307,20 +7307,19 @@ impl Machine {
         walk_code(&self.code, index_ptr, |instr| {
             let old_len = functors.len();
             instr.enqueue_functors(&mut self.machine_st.arena, &mut functors);
-            let new_len = functors.len();
 
-            for index in old_len..new_len {
-                let functor_len = functors[index].len();
+            for functor in &functors[old_len..] {
+                let functor_len = functor.len();
 
                 match functor_len {
                     0 => {}
                     1 => {
                         functor_list.push(heap_loc_as_cell!(h));
-                        h += cell_index!(Heap::compute_functor_byte_size(&functors[index]));
+                        h += cell_index!(Heap::compute_functor_byte_size(functor));
                     }
                     _ => {
                         functor_list.push(str_loc_as_cell!(h));
-                        h += cell_index!(Heap::compute_functor_byte_size(&functors[index]));
+                        h += cell_index!(Heap::compute_functor_byte_size(functor));
                     }
                 };
             }