make indexer downcast Integers to Fixnums when possible, be slightly more judicious about allocating Integers instead of Fixnums (#2340)
This commit is contained in:
@@ -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) => {
|
||||||
|
|||||||
@@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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!()
|
||||||
|
|||||||
Reference in New Issue
Block a user