]> Repositorios git - scryer-prolog.git/commitdiff
index Constant::Usize (#355)
authorMark Thom <[email protected]>
Wed, 15 Apr 2020 20:11:45 +0000 (14:11 -0600)
committerMark Thom <[email protected]>
Wed, 15 Apr 2020 20:11:45 +0000 (14:11 -0600)
src/prolog/indexing.rs
src/prolog/machine/machine_indices.rs

index 239c5dbd042c448605607db4089451efa49e6478..f02565eb1527000df6fe0b27f22fce6cec417365 100644 (file)
@@ -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));
+                }
+            }
             _ => {
             }
         }
index a8a985a82afacbd950993195d6d66164abde0ed1..a11d2c1afc8adc534a5e13ef469faeb2264a1da5 100644 (file)
@@ -283,6 +283,9 @@ impl Addr {
                     None
                 }
             }
+            &Addr::Usize(n) => {
+                Some(Constant::Usize(n))
+            }
             _ => {
                 None
             }