split comapre and richcompare instruction

This commit is contained in:
Jeong Yunwon 2022-05-12 02:16:00 +09:00
parent 33ddf76b26
commit f721781499
2 changed files with 35 additions and 19 deletions

View file

@ -946,8 +946,8 @@ impl Compiler {
// Check exception type:
self.compile_expression(exc_type)?;
self.emit(Instruction::CompareOperation {
op: bytecode::ComparisonOperator::ExceptionMatch,
self.emit(Instruction::TestOperation {
op: bytecode::TestOperator::ExceptionMatch,
});
// We cannot handle this exception type:
@ -1468,16 +1468,36 @@ impl Compiler {
let (last_val, mid_vals) = vals.split_last().unwrap();
let compile_cmpop = |op: &ast::Cmpop| match op {
ast::Cmpop::Eq => bytecode::ComparisonOperator::Equal,
ast::Cmpop::NotEq => bytecode::ComparisonOperator::NotEqual,
ast::Cmpop::Lt => bytecode::ComparisonOperator::Less,
ast::Cmpop::LtE => bytecode::ComparisonOperator::LessOrEqual,
ast::Cmpop::Gt => bytecode::ComparisonOperator::Greater,
ast::Cmpop::GtE => bytecode::ComparisonOperator::GreaterOrEqual,
ast::Cmpop::In => bytecode::ComparisonOperator::In,
ast::Cmpop::NotIn => bytecode::ComparisonOperator::NotIn,
ast::Cmpop::Is => bytecode::ComparisonOperator::Is,
ast::Cmpop::IsNot => bytecode::ComparisonOperator::IsNot,
ast::Cmpop::Eq => Instruction::CompareOperation {
op: bytecode::CompareOperator::Equal,
},
ast::Cmpop::NotEq => Instruction::CompareOperation {
op: bytecode::CompareOperator::NotEqual,
},
ast::Cmpop::Lt => Instruction::CompareOperation {
op: bytecode::CompareOperator::Less,
},
ast::Cmpop::LtE => Instruction::CompareOperation {
op: bytecode::CompareOperator::LessOrEqual,
},
ast::Cmpop::Gt => Instruction::CompareOperation {
op: bytecode::CompareOperator::Greater,
},
ast::Cmpop::GtE => Instruction::CompareOperation {
op: bytecode::CompareOperator::GreaterOrEqual,
},
ast::Cmpop::In => Instruction::TestOperation {
op: bytecode::TestOperator::In,
},
ast::Cmpop::NotIn => Instruction::TestOperation {
op: bytecode::TestOperator::NotIn,
},
ast::Cmpop::Is => Instruction::TestOperation {
op: bytecode::TestOperator::Is,
},
ast::Cmpop::IsNot => Instruction::TestOperation {
op: bytecode::TestOperator::IsNot,
},
};
// a == b == c == d
@ -1506,9 +1526,7 @@ impl Compiler {
self.emit(Instruction::Duplicate);
self.emit(Instruction::Rotate3);
self.emit(Instruction::CompareOperation {
op: compile_cmpop(op),
});
self.emit(compile_cmpop(op));
// if comparison result is false, we break with this value; if true, try the next one.
if let Some((break_block, _)) = end_blocks {
@ -1520,9 +1538,7 @@ impl Compiler {
// handle the last comparison
self.compile_expression(last_val)?;
self.emit(Instruction::CompareOperation {
op: compile_cmpop(last_op),
});
self.emit(compile_cmpop(last_op));
if let Some((break_block, after_block)) = end_blocks {
self.emit(Instruction::Jump {

View file

@ -45,7 +45,7 @@ expression: "compile_exec(\"\\\nfor stop_exc in (StopIteration('spam'), StopAsyn
39 Jump (54)
>> 40 Duplicate
41 LoadNameAny (7, Exception)
42 CompareOperation (ExceptionMatch)
42 TestOperation (ExceptionMatch)
43 JumpIfFalse (53)
44 StoreLocal (8, ex)
45 LoadNameAny (3, self)