mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-28 20:14:45 +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:
|
// TODO:
|
||||||
TokenKind::PrePlus => UNARY_POSITIVE,
|
TokenKind::PrePlus => UNARY_POSITIVE,
|
||||||
TokenKind::PreMinus => UNARY_NEGATIVE,
|
TokenKind::PreMinus => UNARY_NEGATIVE,
|
||||||
|
TokenKind::PreBitNot => UNARY_INVERT,
|
||||||
TokenKind::Mutate => {
|
TokenKind::Mutate => {
|
||||||
if !self.mutate_op_loaded {
|
if !self.mutate_op_loaded {
|
||||||
self.load_mutate_op();
|
self.load_mutate_op();
|
||||||
|
@ -1505,8 +1506,9 @@ impl PyCodeGenerator {
|
||||||
TokenKind::FloorDiv => Opcode310::BINARY_FLOOR_DIVIDE,
|
TokenKind::FloorDiv => Opcode310::BINARY_FLOOR_DIVIDE,
|
||||||
TokenKind::Pow => Opcode310::BINARY_POWER,
|
TokenKind::Pow => Opcode310::BINARY_POWER,
|
||||||
TokenKind::Mod => Opcode310::BINARY_MODULO,
|
TokenKind::Mod => Opcode310::BINARY_MODULO,
|
||||||
TokenKind::AndOp => Opcode310::BINARY_AND,
|
TokenKind::AndOp | TokenKind::BitAnd => Opcode310::BINARY_AND,
|
||||||
TokenKind::OrOp => Opcode310::BINARY_OR,
|
TokenKind::OrOp | TokenKind::BitOr => Opcode310::BINARY_OR,
|
||||||
|
TokenKind::BitXor => Opcode310::BINARY_XOR,
|
||||||
TokenKind::IsOp | TokenKind::IsNotOp => Opcode310::IS_OP,
|
TokenKind::IsOp | TokenKind::IsNotOp => Opcode310::IS_OP,
|
||||||
TokenKind::Less
|
TokenKind::Less
|
||||||
| TokenKind::LessEq
|
| TokenKind::LessEq
|
||||||
|
@ -1571,7 +1573,10 @@ impl PyCodeGenerator {
|
||||||
| TokenKind::Pow
|
| TokenKind::Pow
|
||||||
| TokenKind::Mod
|
| TokenKind::Mod
|
||||||
| TokenKind::AndOp
|
| 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::IsOp | TokenKind::IsNotOp => Opcode311::IS_OP,
|
||||||
TokenKind::Less
|
TokenKind::Less
|
||||||
| TokenKind::LessEq
|
| TokenKind::LessEq
|
||||||
|
@ -1609,8 +1614,9 @@ impl PyCodeGenerator {
|
||||||
TokenKind::FloorDiv => BinOpCode::FloorDiv as usize,
|
TokenKind::FloorDiv => BinOpCode::FloorDiv as usize,
|
||||||
TokenKind::Pow => BinOpCode::Power as usize,
|
TokenKind::Pow => BinOpCode::Power as usize,
|
||||||
TokenKind::Mod => BinOpCode::Remainder as usize,
|
TokenKind::Mod => BinOpCode::Remainder as usize,
|
||||||
TokenKind::AndOp => BinOpCode::And as usize,
|
TokenKind::AndOp | TokenKind::BitAnd => BinOpCode::And as usize,
|
||||||
TokenKind::OrOp => BinOpCode::Or as usize,
|
TokenKind::OrOp | TokenKind::BitOr => BinOpCode::Or as usize,
|
||||||
|
TokenKind::BitXor => BinOpCode::Xor as usize,
|
||||||
TokenKind::Less => 0,
|
TokenKind::Less => 0,
|
||||||
TokenKind::LessEq => 1,
|
TokenKind::LessEq => 1,
|
||||||
TokenKind::DblEq => 2,
|
TokenKind::DblEq => 2,
|
||||||
|
|
|
@ -699,8 +699,9 @@ impl Context {
|
||||||
line!(),
|
line!(),
|
||||||
))
|
))
|
||||||
}),
|
}),
|
||||||
Or => match (lhs, rhs) {
|
Or | BitOr => match (lhs, rhs) {
|
||||||
(ValueObj::Bool(l), ValueObj::Bool(r)) => Ok(ValueObj::Bool(l || r)),
|
(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)),
|
(ValueObj::Type(lhs), ValueObj::Type(rhs)) => Ok(self.eval_or_type(lhs, rhs)),
|
||||||
_ => Err(EvalErrors::from(EvalError::unreachable(
|
_ => Err(EvalErrors::from(EvalError::unreachable(
|
||||||
self.cfg.input.clone(),
|
self.cfg.input.clone(),
|
||||||
|
@ -708,8 +709,9 @@ impl Context {
|
||||||
line!(),
|
line!(),
|
||||||
))),
|
))),
|
||||||
},
|
},
|
||||||
And => match (lhs, rhs) {
|
And | BitAnd => match (lhs, rhs) {
|
||||||
(ValueObj::Bool(l), ValueObj::Bool(r)) => Ok(ValueObj::Bool(l && r)),
|
(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)),
|
(ValueObj::Type(lhs), ValueObj::Type(rhs)) => Ok(self.eval_and_type(lhs, rhs)),
|
||||||
_ => Err(EvalErrors::from(EvalError::unreachable(
|
_ => Err(EvalErrors::from(EvalError::unreachable(
|
||||||
self.cfg.input.clone(),
|
self.cfg.input.clone(),
|
||||||
|
@ -717,6 +719,15 @@ impl Context {
|
||||||
line!(),
|
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(
|
_other => Err(EvalErrors::from(EvalError::unreachable(
|
||||||
self.cfg.input.clone(),
|
self.cfg.input.clone(),
|
||||||
fn_name!(),
|
fn_name!(),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue