mirror of
https://github.com/erg-lang/erg.git
synced 2025-08-04 10:49:54 +00:00
feat: add bit operators &&/||/^^
This commit is contained in:
parent
20a5231fc0
commit
6cb4e75fea
2 changed files with 24 additions and 7 deletions
|
@ -1393,6 +1393,7 @@ impl PyCodeGenerator {
|
|||
// TODO:
|
||||
TokenKind::PrePlus => UNARY_POSITIVE,
|
||||
TokenKind::PreMinus => UNARY_NEGATIVE,
|
||||
TokenKind::PreBitNot => UNARY_INVERT,
|
||||
TokenKind::Mutate => {
|
||||
if !self.mutate_op_loaded {
|
||||
self.load_mutate_op();
|
||||
|
@ -1505,8 +1506,9 @@ impl PyCodeGenerator {
|
|||
TokenKind::FloorDiv => Opcode310::BINARY_FLOOR_DIVIDE,
|
||||
TokenKind::Pow => Opcode310::BINARY_POWER,
|
||||
TokenKind::Mod => Opcode310::BINARY_MODULO,
|
||||
TokenKind::AndOp => Opcode310::BINARY_AND,
|
||||
TokenKind::OrOp => Opcode310::BINARY_OR,
|
||||
TokenKind::AndOp | TokenKind::BitAnd => Opcode310::BINARY_AND,
|
||||
TokenKind::OrOp | TokenKind::BitOr => Opcode310::BINARY_OR,
|
||||
TokenKind::BitXor => Opcode310::BINARY_XOR,
|
||||
TokenKind::IsOp | TokenKind::IsNotOp => Opcode310::IS_OP,
|
||||
TokenKind::Less
|
||||
| TokenKind::LessEq
|
||||
|
@ -1571,7 +1573,10 @@ impl PyCodeGenerator {
|
|||
| TokenKind::Pow
|
||||
| TokenKind::Mod
|
||||
| TokenKind::AndOp
|
||||
| TokenKind::OrOp => Opcode311::BINARY_OP,
|
||||
| TokenKind::OrOp
|
||||
| TokenKind::BitAnd
|
||||
| TokenKind::BitOr
|
||||
| TokenKind::BitXor => Opcode311::BINARY_OP,
|
||||
TokenKind::IsOp | TokenKind::IsNotOp => Opcode311::IS_OP,
|
||||
TokenKind::Less
|
||||
| TokenKind::LessEq
|
||||
|
@ -1609,8 +1614,9 @@ impl PyCodeGenerator {
|
|||
TokenKind::FloorDiv => BinOpCode::FloorDiv as usize,
|
||||
TokenKind::Pow => BinOpCode::Power as usize,
|
||||
TokenKind::Mod => BinOpCode::Remainder as usize,
|
||||
TokenKind::AndOp => BinOpCode::And as usize,
|
||||
TokenKind::OrOp => BinOpCode::Or as usize,
|
||||
TokenKind::AndOp | TokenKind::BitAnd => BinOpCode::And as usize,
|
||||
TokenKind::OrOp | TokenKind::BitOr => BinOpCode::Or as usize,
|
||||
TokenKind::BitXor => BinOpCode::Xor as usize,
|
||||
TokenKind::Less => 0,
|
||||
TokenKind::LessEq => 1,
|
||||
TokenKind::DblEq => 2,
|
||||
|
|
|
@ -699,8 +699,9 @@ impl Context {
|
|||
line!(),
|
||||
))
|
||||
}),
|
||||
Or => match (lhs, rhs) {
|
||||
Or | BitOr => match (lhs, rhs) {
|
||||
(ValueObj::Bool(l), ValueObj::Bool(r)) => Ok(ValueObj::Bool(l || r)),
|
||||
(ValueObj::Int(l), ValueObj::Int(r)) => Ok(ValueObj::Int(l | r)),
|
||||
(ValueObj::Type(lhs), ValueObj::Type(rhs)) => Ok(self.eval_or_type(lhs, rhs)),
|
||||
_ => Err(EvalErrors::from(EvalError::unreachable(
|
||||
self.cfg.input.clone(),
|
||||
|
@ -708,8 +709,9 @@ impl Context {
|
|||
line!(),
|
||||
))),
|
||||
},
|
||||
And => match (lhs, rhs) {
|
||||
And | BitAnd => match (lhs, rhs) {
|
||||
(ValueObj::Bool(l), ValueObj::Bool(r)) => Ok(ValueObj::Bool(l && r)),
|
||||
(ValueObj::Int(l), ValueObj::Int(r)) => Ok(ValueObj::Int(l & r)),
|
||||
(ValueObj::Type(lhs), ValueObj::Type(rhs)) => Ok(self.eval_and_type(lhs, rhs)),
|
||||
_ => Err(EvalErrors::from(EvalError::unreachable(
|
||||
self.cfg.input.clone(),
|
||||
|
@ -717,6 +719,15 @@ impl Context {
|
|||
line!(),
|
||||
))),
|
||||
},
|
||||
BitXor => match (lhs, rhs) {
|
||||
(ValueObj::Bool(l), ValueObj::Bool(r)) => Ok(ValueObj::Bool(l ^ r)),
|
||||
(ValueObj::Int(l), ValueObj::Int(r)) => Ok(ValueObj::Int(l ^ r)),
|
||||
_ => Err(EvalErrors::from(EvalError::unreachable(
|
||||
self.cfg.input.clone(),
|
||||
fn_name!(),
|
||||
line!(),
|
||||
))),
|
||||
},
|
||||
_other => Err(EvalErrors::from(EvalError::unreachable(
|
||||
self.cfg.input.clone(),
|
||||
fn_name!(),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue