From: Mark Thom Date: Wed, 15 Apr 2020 20:11:45 +0000 (-0600) Subject: index Constant::Usize (#355) X-Git-Tag: v0.8.123~148 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=1ad4ce98228831bfd7b4a2357f3bc31e8491ced4;p=scryer-prolog.git index Constant::Usize (#355) --- diff --git a/src/prolog/indexing.rs b/src/prolog/indexing.rs index 239c5dbd..f02565eb 100644 --- a/src/prolog/indexing.rs +++ b/src/prolog/indexing.rs @@ -6,6 +6,7 @@ use crate::prolog::rug::Integer; use indexmap::IndexMap; use std::collections::VecDeque; +use std::convert::TryFrom; use std::hash::Hash; use std::rc::Rc; @@ -66,6 +67,16 @@ impl CodeOffsets { .or_insert(vec![]); code.push(Self::add_index(code.is_empty(), index)); + + if n >= 0 { + if let Ok(n) = usize::try_from(n) { + let code = self.constants + .entry(Constant::Usize(n)) + .or_insert(vec![]); + + code.push(Self::add_index(code.is_empty(), index)); + } + } } &Constant::Integer(ref n) => { if let Some(n) = n.to_isize() { @@ -75,11 +86,34 @@ impl CodeOffsets { code.push(Self::add_index(code.is_empty(), index)); } + + if let Some(n) = n.to_usize() { + let code = self.constants + .entry(Constant::Usize(n)) + .or_insert(vec![]); + + code.push(Self::add_index(code.is_empty(), index)); + } } &Constant::String(_) => { let is_initial_index = self.lists.is_empty(); self.lists.push(Self::add_index(is_initial_index, index)); } + &Constant::Usize(n) => { + let code = self.constants + .entry(Constant::Integer(Rc::new(Integer::from(n)))) + .or_insert(vec![]); + + code.push(Self::add_index(code.is_empty(), index)); + + if let Ok(n) = isize::try_from(n) { + let code = self.constants + .entry(Constant::Fixnum(n)) + .or_insert(vec![]); + + code.push(Self::add_index(code.is_empty(), index)); + } + } _ => { } } diff --git a/src/prolog/machine/machine_indices.rs b/src/prolog/machine/machine_indices.rs index a8a985a8..a11d2c1a 100644 --- a/src/prolog/machine/machine_indices.rs +++ b/src/prolog/machine/machine_indices.rs @@ -283,6 +283,9 @@ impl Addr { None } } + &Addr::Usize(n) => { + Some(Constant::Usize(n)) + } _ => { None }