From: Mark Thom Date: Sat, 12 Feb 2022 02:23:43 +0000 (-0700) Subject: use VecDeque for generating indices during code generation (#1053) X-Git-Tag: v0.9.0^2~24 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=db20cda27aff6a13dc7f60b87549359b59b36f6e;p=scryer-prolog.git use VecDeque for generating indices during code generation (#1053) --- diff --git a/crates/instructions-template/src/lib.rs b/crates/instructions-template/src/lib.rs index c4c821b4..774bf40d 100644 --- a/crates/instructions-template/src/lib.rs +++ b/crates/instructions-template/src/lib.rs @@ -805,6 +805,8 @@ fn generate_instruction_preface() -> TokenStream { use indexmap::IndexMap; use slice_deque::SliceDeque; + use std::collections::VecDeque; + fn reg_type_into_functor(r: RegType) -> MachineStub { match r { RegType::Temp(r) => functor!(atom!("x"), [fixnum(r)]), @@ -1035,10 +1037,10 @@ fn generate_instruction_preface() -> TokenStream { } } - impl From> for IndexingLine { + impl From> for IndexingLine { #[inline] - fn from(instrs: SliceDeque) -> Self { - IndexingLine::IndexedChoice(instrs) + fn from(instrs: VecDeque) -> Self { + IndexingLine::IndexedChoice(instrs.into_iter().collect()) } } diff --git a/src/indexing.rs b/src/indexing.rs index 6d63ff79..5deccb80 100644 --- a/src/indexing.rs +++ b/src/indexing.rs @@ -7,6 +7,7 @@ use crate::instructions::*; use indexmap::IndexMap; use slice_deque::{sdeq, SliceDeque}; +use std::collections::VecDeque; use std::hash::Hash; use std::iter::once; use std::mem; @@ -1138,16 +1139,16 @@ pub(crate) fn constant_key_alternatives( #[derive(Debug)] pub(crate) struct StaticCodeIndices { - constants: IndexMap>, - lists: SliceDeque, - structures: IndexMap<(Atom, usize), SliceDeque>, + constants: IndexMap>, + lists: VecDeque, + structures: IndexMap<(Atom, usize), VecDeque>, } #[derive(Debug)] pub(crate) struct DynamicCodeIndices { - constants: IndexMap>, - lists: SliceDeque, - structures: IndexMap<(Atom, usize), SliceDeque>, + constants: IndexMap>, + lists: VecDeque, + structures: IndexMap<(Atom, usize), VecDeque>, } pub(crate) trait Indexer { @@ -1155,26 +1156,26 @@ pub(crate) trait Indexer { fn new() -> Self; - fn constants(&mut self) -> &mut IndexMap>; - fn lists(&mut self) -> &mut SliceDeque; - fn structures(&mut self) -> &mut IndexMap<(Atom, usize), SliceDeque>; + fn constants(&mut self) -> &mut IndexMap>; + fn lists(&mut self) -> &mut VecDeque; + fn structures(&mut self) -> &mut IndexMap<(Atom, usize), VecDeque>; fn compute_index(is_initial_index: bool, index: usize) -> Self::ThirdLevelIndex; fn second_level_index( - indices: IndexMap>, - prelude: &mut SliceDeque, + indices: IndexMap>, + prelude: &mut VecDeque, ) -> IndexMap; fn switch_on( instr_fn: impl FnMut(IndexMap) -> IndexingInstruction, - index: &mut IndexMap>, - prelude: &mut SliceDeque, + index: &mut IndexMap>, + prelude: &mut VecDeque, ) -> IndexingCodePtr; fn switch_on_list( - lists: &mut SliceDeque, - prelude: &mut SliceDeque, + lists: &mut VecDeque, + prelude: &mut VecDeque, ) -> IndexingCodePtr; fn remove_instruction_with_offset(code: &mut SliceDeque, offset: usize); @@ -1189,23 +1190,23 @@ impl Indexer for StaticCodeIndices { fn new() -> Self { Self { constants: IndexMap::new(), - lists: sdeq![], + lists: VecDeque::new(), structures: IndexMap::new(), } } #[inline] - fn constants(&mut self) -> &mut IndexMap> { + fn constants(&mut self) -> &mut IndexMap> { &mut self.constants } #[inline] - fn lists(&mut self) -> &mut SliceDeque { + fn lists(&mut self) -> &mut VecDeque { &mut self.lists } #[inline] - fn structures(&mut self) -> &mut IndexMap<(Atom, usize), SliceDeque> { + fn structures(&mut self) -> &mut IndexMap<(Atom, usize), VecDeque> { &mut self.structures } @@ -1218,18 +1219,18 @@ impl Indexer for StaticCodeIndices { } fn second_level_index( - indices: IndexMap>, - prelude: &mut SliceDeque, + indices: IndexMap>, + prelude: &mut VecDeque, ) -> IndexMap { let mut index_locs = IndexMap::new(); for (key, mut code) in indices.into_iter() { if code.len() > 1 { index_locs.insert(key, IndexingCodePtr::Internal(prelude.len() + 1)); - cap_choice_seq_with_trust(&mut code); + cap_choice_seq_with_trust(code.make_contiguous()); prelude.push_back(IndexingLine::from(code)); } else { - code.first().map(|i| { + code.front().map(|i| { index_locs.insert(key, IndexingCodePtr::External(i.offset())); }); } @@ -1240,8 +1241,8 @@ impl Indexer for StaticCodeIndices { fn switch_on( mut instr_fn: impl FnMut(IndexMap) -> IndexingInstruction, - index: &mut IndexMap>, - prelude: &mut SliceDeque, + index: &mut IndexMap>, + prelude: &mut VecDeque, ) -> IndexingCodePtr { let index = mem::replace(index, IndexMap::new()); let index = Self::second_level_index(index, prelude); @@ -1261,18 +1262,18 @@ impl Indexer for StaticCodeIndices { } fn switch_on_list( - lists: &mut SliceDeque, - prelude: &mut SliceDeque, + lists: &mut VecDeque, + prelude: &mut VecDeque, ) -> IndexingCodePtr { if lists.len() > 1 { - cap_choice_seq_with_trust(lists); - let lists = mem::replace(lists, sdeq![]); + cap_choice_seq_with_trust(lists.make_contiguous()); + let lists = mem::replace(lists, VecDeque::new()); prelude.push_back(IndexingLine::from(lists)); IndexingCodePtr::Internal(1) } else { lists - .first() + .front() .map(|i| IndexingCodePtr::External(i.offset())) .unwrap_or(IndexingCodePtr::Fail) } @@ -1305,23 +1306,23 @@ impl Indexer for DynamicCodeIndices { fn new() -> Self { Self { constants: IndexMap::new(), - lists: sdeq![], + lists: VecDeque::new(), structures: IndexMap::new(), } } #[inline] - fn constants(&mut self) -> &mut IndexMap> { + fn constants(&mut self) -> &mut IndexMap> { &mut self.constants } #[inline] - fn lists(&mut self) -> &mut SliceDeque { + fn lists(&mut self) -> &mut VecDeque { &mut self.lists } #[inline] - fn structures(&mut self) -> &mut IndexMap<(Atom, usize), SliceDeque> { + fn structures(&mut self) -> &mut IndexMap<(Atom, usize), VecDeque> { &mut self.structures } @@ -1331,17 +1332,17 @@ impl Indexer for DynamicCodeIndices { } fn second_level_index( - indices: IndexMap>, - prelude: &mut SliceDeque, + indices: IndexMap>, + prelude: &mut VecDeque, ) -> IndexMap { let mut index_locs = IndexMap::new(); for (key, code) in indices.into_iter() { if code.len() > 1 { index_locs.insert(key, IndexingCodePtr::Internal(prelude.len() + 1)); - prelude.push_back(IndexingLine::DynamicIndexedChoice(code)); + prelude.push_back(IndexingLine::DynamicIndexedChoice(code.into_iter().collect())); } else { - code.first().map(|i| { + code.front().map(|i| { index_locs.insert(key, IndexingCodePtr::DynamicExternal(*i)); }); } @@ -1352,8 +1353,8 @@ impl Indexer for DynamicCodeIndices { fn switch_on( mut instr_fn: impl FnMut(IndexMap) -> IndexingInstruction, - index: &mut IndexMap>, - prelude: &mut SliceDeque, + index: &mut IndexMap>, + prelude: &mut VecDeque, ) -> IndexingCodePtr { let index = mem::replace(index, IndexMap::new()); let index = Self::second_level_index(index, prelude); @@ -1373,16 +1374,16 @@ impl Indexer for DynamicCodeIndices { } fn switch_on_list( - lists: &mut SliceDeque, - prelude: &mut SliceDeque, + lists: &mut VecDeque, + prelude: &mut VecDeque, ) -> IndexingCodePtr { if lists.len() > 1 { - let lists = mem::replace(lists, sdeq![]); - prelude.push_back(IndexingLine::DynamicIndexedChoice(lists)); + let lists = mem::replace(lists, VecDeque::new()); + prelude.push_back(IndexingLine::DynamicIndexedChoice(lists.into_iter().collect())); IndexingCodePtr::Internal(1) } else { lists - .first() + .front() .map(|i| IndexingCodePtr::DynamicExternal(*i)) .unwrap_or(IndexingCodePtr::Fail) } @@ -1431,7 +1432,7 @@ impl CodeOffsets { index: usize, ) -> Vec { let overlapping_constants = constant_key_alternatives(constant, atom_tbl); - let code = self.indices.constants().entry(constant).or_insert(sdeq![]); + let code = self.indices.constants().entry(constant).or_insert(VecDeque::new()); let is_initial_index = code.is_empty(); code.push_back(I::compute_index(is_initial_index, index)); @@ -1441,7 +1442,7 @@ impl CodeOffsets { .indices .constants() .entry(*constant) - .or_insert(sdeq![]); + .or_insert(VecDeque::new()); let is_initial_index = code.is_empty(); let index = I::compute_index(is_initial_index, index); @@ -1457,7 +1458,7 @@ impl CodeOffsets { .indices .structures() .entry((name.clone(), arity)) - .or_insert(sdeq![]); + .or_insert(VecDeque::new()); let code_len = code.len(); let is_initial_index = code.is_empty(); @@ -1508,7 +1509,7 @@ impl CodeOffsets { return vec![]; } - let mut prelude = sdeq![]; + let mut prelude = VecDeque::new(); let mut emitted_switch_on_structure = false; let mut emitted_switch_on_constant = false;