[$($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),*],
});
}
-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),
}
}
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));
}
};
}