mirror of
https://github.com/danbulant/oxc
synced 2026-05-19 04:08:41 +00:00
fix(minfier): bigint bitwise operation only works with bigint (#7937)
This commit is contained in:
parent
9b3a2beaa3
commit
4799471c1e
2 changed files with 18 additions and 11 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
Loading…
Reference in a new issue