Continue fixing compiler for new instructions
This commit is contained in:
parent
54ae05844d
commit
8b360d0825
@ -632,7 +632,15 @@ impl<'src> Compiler<'src> {
|
|||||||
.push((right_instruction, right_type, right_position));
|
.push((right_instruction, right_type, right_position));
|
||||||
}
|
}
|
||||||
|
|
||||||
let destination = Destination::Register(self.next_register());
|
let destination = if is_assignment {
|
||||||
|
match left {
|
||||||
|
Argument::Register(register) => Destination::Register(register),
|
||||||
|
Argument::Local(local_index) => Destination::Local(local_index),
|
||||||
|
Argument::Constant(_) => Destination::Register(self.next_register()),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Destination::Register(self.next_register())
|
||||||
|
};
|
||||||
let instruction = match operator {
|
let instruction = match operator {
|
||||||
Token::Plus | Token::PlusEqual => Instruction::add(destination, left, right),
|
Token::Plus | Token::PlusEqual => Instruction::add(destination, left, right),
|
||||||
Token::Minus | Token::MinusEqual => Instruction::subtract(destination, left, right),
|
Token::Minus | Token::MinusEqual => Instruction::subtract(destination, left, right),
|
||||||
@ -1268,6 +1276,7 @@ impl<'src> Compiler<'src> {
|
|||||||
should_return_value,
|
should_return_value,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
self.update_return_type(previous_expression_type)?;
|
||||||
self.emit_instruction(r#return, Type::None, self.current_position);
|
self.emit_instruction(r#return, Type::None, self.current_position);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,11 +59,11 @@ fn add_assign() {
|
|||||||
),
|
),
|
||||||
(
|
(
|
||||||
Instruction::add(
|
Instruction::add(
|
||||||
Destination::Register(0),
|
Destination::Local(0),
|
||||||
Argument::Register(0),
|
Argument::Local(0),
|
||||||
Argument::Constant(2)
|
Argument::Constant(2)
|
||||||
),
|
),
|
||||||
Type::Integer,
|
Type::None,
|
||||||
Span(17, 19)
|
Span(17, 19)
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
@ -176,11 +176,11 @@ fn divide_assign() {
|
|||||||
),
|
),
|
||||||
(
|
(
|
||||||
Instruction::divide(
|
Instruction::divide(
|
||||||
Destination::Register(0),
|
Destination::Local(0),
|
||||||
Argument::Register(0),
|
Argument::Local(0),
|
||||||
Argument::Constant(0)
|
Argument::Constant(0)
|
||||||
),
|
),
|
||||||
Type::Integer,
|
Type::None,
|
||||||
Span(17, 19)
|
Span(17, 19)
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
@ -339,11 +339,11 @@ fn multiply_assign() {
|
|||||||
),
|
),
|
||||||
(
|
(
|
||||||
Instruction::multiply(
|
Instruction::multiply(
|
||||||
Destination::Register(0),
|
Destination::Local(0),
|
||||||
Argument::Register(0),
|
Argument::Local(0),
|
||||||
Argument::Constant(2)
|
Argument::Constant(2)
|
||||||
),
|
),
|
||||||
Type::Integer,
|
Type::None,
|
||||||
Span(17, 19)
|
Span(17, 19)
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
@ -440,11 +440,11 @@ fn subtract_assign() {
|
|||||||
),
|
),
|
||||||
(
|
(
|
||||||
Instruction::subtract(
|
Instruction::subtract(
|
||||||
Destination::Register(0),
|
Destination::Local(0),
|
||||||
Argument::Register(0),
|
Argument::Local(0),
|
||||||
Argument::Constant(2)
|
Argument::Constant(2)
|
||||||
),
|
),
|
||||||
Type::Integer,
|
Type::None,
|
||||||
Span(18, 20)
|
Span(18, 20)
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
|
Loading…
Reference in New Issue
Block a user