make indexer downcast Integers to Fixnums when possible, be slightly more judicious about allocating Integers instead of Fixnums (#2340)

This commit is contained in:
Mark
2024-02-29 16:15:28 -07:00
parent f2d3779fa9
commit 42f4827854
3 changed files with 17 additions and 17 deletions

View File

@@ -1113,16 +1113,10 @@ pub(crate) fn constant_key_alternatives(
constants.push(Literal::Atom(atom)); constants.push(Literal::Atom(atom));
} }
/* /*
// constant_to_literal takes care of the downward conversion from Integer to Fixnum
// if possible.
Literal::Fixnum(ref n) => { Literal::Fixnum(ref n) => {
constants.push(Literal::Integer(arena_alloc!(n, arena))); //Rc::new(Integer::from(*n)))); constants.push(Literal::Integer(arena_alloc!(n, arena)));
/*
if *n >= 0 {
if let Ok(n) = usize::try_from(*n) {
constants.push(Literal::Usize(n));
}
}
*/
} }
*/ */
Literal::Integer(ref n) => { Literal::Integer(ref n) => {

View File

@@ -641,12 +641,10 @@ pub(crate) fn shr(n1: Number, n2: Number, arena: &mut Arena) -> Result<Number, M
let n1_i = n1.get_num(); let n1_i = n1.get_num();
let n2_i = n2.get_num(); let n2_i = n2.get_num();
let n1 = Integer::from(n1_i);
if let Ok(n2) = usize::try_from(n2_i) { if let Ok(n2) = usize::try_from(n2_i) {
Ok(Number::arena_from(n1 >> n2, arena)) Ok(Number::arena_from(n1_i >> n2, arena))
} else { } else {
Ok(Number::arena_from(n1 >> usize::max_value(), arena)) Ok(Number::arena_from(n1_i >> usize::max_value(), arena))
} }
} }
(Number::Fixnum(n1), Number::Integer(n2)) => { (Number::Fixnum(n1), Number::Integer(n2)) => {
@@ -698,11 +696,10 @@ pub(crate) fn shl(n1: Number, n2: Number, arena: &mut Arena) -> Result<Number, M
let n1_i = n1.get_num(); let n1_i = n1.get_num();
let n2_i = n2.get_num(); let n2_i = n2.get_num();
let n1 = Integer::from(n1_i);
if let Ok(n2) = usize::try_from(n2_i) { if let Ok(n2) = usize::try_from(n2_i) {
Ok(Number::arena_from(n1 << n2, arena)) Ok(Number::arena_from(n1_i << n2, arena))
} else { } else {
let n1 = Integer::from(n1_i);
Ok(Number::arena_from(n1 << usize::max_value(), arena)) Ok(Number::arena_from(n1 << usize::max_value(), arena))
} }
} }

View File

@@ -269,7 +269,16 @@ impl MachineState {
Literal::Rational(r) Literal::Rational(r)
} }
(ArenaHeaderTag::Integer, n) => { (ArenaHeaderTag::Integer, n) => {
Literal::Integer(n) let result = (&*n).try_into();
match result {
Ok(fixnum) => if let Ok(n) = Fixnum::build_with_checked(fixnum) {
Literal::Fixnum(n)
} else {
Literal::Integer(n)
},
Err(_) => Literal::Integer(n)
}
} }
_ => { _ => {
unreachable!() unreachable!()