feat: add bit operators &&/||/^^

This commit is contained in:
Shunsuke Shibayama 2023-04-25 09:55:20 +09:00
parent 20a5231fc0
commit 6cb4e75fea
2 changed files with 24 additions and 7 deletions

View file

@ -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,

View file

@ -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!(),