fix(minfier): bigint bitwise operation only works with bigint (#7937)

This commit is contained in:
Boshen 2024-12-16 13:25:39 +00:00
parent 9b3a2beaa3
commit 4799471c1e
2 changed files with 18 additions and 11 deletions

View file

@ -318,6 +318,19 @@ pub trait ConstantEvaluation<'a> {
})
}
BinaryOperator::BitwiseAnd | BinaryOperator::BitwiseOR | BinaryOperator::BitwiseXOR => {
if left.is_big_int_literal() && right.is_big_int_literal() {
let left_bigint = self.get_side_free_bigint_value(left);
let right_bigint = self.get_side_free_bigint_value(right);
if let (Some(left_val), Some(right_val)) = (left_bigint, right_bigint) {
let result_val: BigInt = match operator {
BinaryOperator::BitwiseAnd => left_val & right_val,
BinaryOperator::BitwiseOR => left_val | right_val,
BinaryOperator::BitwiseXOR => left_val ^ right_val,
_ => unreachable!(),
};
return Some(ConstantValue::BigInt(result_val));
}
}
let left_num = self.get_side_free_number_value(left);
let right_num = self.get_side_free_number_value(right);
if let (Some(left_val), Some(right_val)) = (left_num, right_num) {
@ -332,17 +345,6 @@ pub trait ConstantEvaluation<'a> {
};
return Some(ConstantValue::Number(result_val));
}
let left_bitint = self.get_side_free_bigint_value(left);
let right_bitint = self.get_side_free_bigint_value(right);
if let (Some(left_val), Some(right_val)) = (left_bitint, right_bitint) {
let result_val: BigInt = match operator {
BinaryOperator::BitwiseAnd => left_val & right_val,
BinaryOperator::BitwiseOR => left_val | right_val,
BinaryOperator::BitwiseXOR => left_val ^ right_val,
_ => unreachable!(),
};
return Some(ConstantValue::BigInt(result_val));
}
None
}
_ => None,

View file

@ -1264,6 +1264,11 @@ mod test {
test("x = 3n ^ y ^ 1n", "x = y ^ 2n");
test("x = y ^ 3n ^ 3n", "x = y ^ 0n");
test("x = 3n ^ y ^ 3n", "x = y ^ 0n");
// TypeError: Cannot mix BigInt and other types
test_same("1n & 1");
test_same("1n | 1");
test_same("1n ^ 1");
}
#[test]