Prevent unnecessary CLOSE instructions
This commit is contained in:
parent
59f64c9afd
commit
e1e259141c
@ -1239,6 +1239,7 @@ impl<'src> Compiler<'src> {
|
|||||||
|
|
||||||
let mut item_type = Type::None;
|
let mut item_type = Type::None;
|
||||||
let mut start_register = None;
|
let mut start_register = None;
|
||||||
|
let mut close_instructions = Vec::new();
|
||||||
|
|
||||||
while !self.allow(Token::RightBracket)? {
|
while !self.allow(Token::RightBracket)? {
|
||||||
let next_boolean_register = self.next_boolean_register();
|
let next_boolean_register = self.next_boolean_register();
|
||||||
@ -1270,26 +1271,22 @@ impl<'src> Compiler<'src> {
|
|||||||
self.next_boolean_register() - next_boolean_register;
|
self.next_boolean_register() - next_boolean_register;
|
||||||
|
|
||||||
if used_boolean_registers > 1 {
|
if used_boolean_registers > 1 {
|
||||||
let close = Instruction::close(
|
close_instructions.push(Instruction::close(
|
||||||
next_boolean_register,
|
next_boolean_register,
|
||||||
self.next_boolean_register() - 2,
|
self.next_boolean_register() - 2,
|
||||||
TypeCode::BOOLEAN,
|
TypeCode::BOOLEAN,
|
||||||
);
|
));
|
||||||
|
|
||||||
self.emit_instruction(close, Type::None, self.current_position);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Type::Byte => {
|
Type::Byte => {
|
||||||
let used_byte_registers = self.next_byte_register() - next_byte_register;
|
let used_byte_registers = self.next_byte_register() - next_byte_register;
|
||||||
|
|
||||||
if used_byte_registers > 1 {
|
if used_byte_registers > 1 {
|
||||||
let close = Instruction::close(
|
close_instructions.push(Instruction::close(
|
||||||
next_byte_register,
|
next_byte_register,
|
||||||
self.next_byte_register() - 2,
|
self.next_byte_register() - 2,
|
||||||
TypeCode::BYTE,
|
TypeCode::BYTE,
|
||||||
);
|
));
|
||||||
|
|
||||||
self.emit_instruction(close, Type::None, self.current_position);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Type::Character => {
|
Type::Character => {
|
||||||
@ -1297,26 +1294,22 @@ impl<'src> Compiler<'src> {
|
|||||||
self.next_character_register() - next_character_register;
|
self.next_character_register() - next_character_register;
|
||||||
|
|
||||||
if used_character_registers > 1 {
|
if used_character_registers > 1 {
|
||||||
let close = Instruction::close(
|
close_instructions.push(Instruction::close(
|
||||||
next_character_register,
|
next_character_register,
|
||||||
self.next_character_register() - 2,
|
self.next_byte_register() - 2,
|
||||||
TypeCode::CHARACTER,
|
TypeCode::CHARACTER,
|
||||||
);
|
));
|
||||||
|
|
||||||
self.emit_instruction(close, Type::None, self.current_position);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Type::Float => {
|
Type::Float => {
|
||||||
let used_float_registers = self.next_float_register() - next_float_register;
|
let used_float_registers = self.next_float_register() - next_float_register;
|
||||||
|
|
||||||
if used_float_registers > 1 {
|
if used_float_registers > 1 {
|
||||||
let close = Instruction::close(
|
close_instructions.push(Instruction::close(
|
||||||
next_float_register,
|
next_float_register,
|
||||||
self.next_float_register() - 2,
|
self.next_float_register() - 2,
|
||||||
TypeCode::FLOAT,
|
TypeCode::FLOAT,
|
||||||
);
|
));
|
||||||
|
|
||||||
self.emit_instruction(close, Type::None, self.current_position);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Type::Integer => {
|
Type::Integer => {
|
||||||
@ -1324,43 +1317,37 @@ impl<'src> Compiler<'src> {
|
|||||||
self.next_integer_register() - next_integer_register;
|
self.next_integer_register() - next_integer_register;
|
||||||
|
|
||||||
if used_integer_registers > 1 {
|
if used_integer_registers > 1 {
|
||||||
let close = Instruction::close(
|
close_instructions.push(Instruction::close(
|
||||||
next_integer_register,
|
next_integer_register,
|
||||||
self.next_integer_register() - 2,
|
self.next_integer_register() - 2,
|
||||||
TypeCode::INTEGER,
|
TypeCode::INTEGER,
|
||||||
);
|
));
|
||||||
|
|
||||||
self.emit_instruction(close, Type::None, self.current_position);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Type::String => {
|
Type::String => {
|
||||||
let used_string_registers = self.next_string_register() - next_string_register;
|
let used_string_registers = self.next_string_register() - next_string_register;
|
||||||
|
|
||||||
if used_string_registers > 1 {
|
if used_string_registers > 1 {
|
||||||
let close = Instruction::close(
|
close_instructions.push(Instruction::close(
|
||||||
next_string_register,
|
next_string_register,
|
||||||
self.next_string_register() - 2,
|
self.next_string_register() - 2,
|
||||||
TypeCode::STRING,
|
TypeCode::STRING,
|
||||||
);
|
));
|
||||||
|
|
||||||
self.emit_instruction(close, Type::None, self.current_position);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Type::List { .. } => {
|
Type::List { .. } => {
|
||||||
let used_list_registers = self.next_list_register() - next_list_register;
|
let used_list_registers = self.next_list_register() - next_list_register;
|
||||||
|
|
||||||
if used_list_registers > 1 {
|
if used_list_registers > 1 {
|
||||||
let close = Instruction::close(
|
close_instructions.push(Instruction::close(
|
||||||
next_list_register,
|
next_list_register,
|
||||||
self.next_list_register() - 2,
|
self.next_list_register() - 2,
|
||||||
TypeCode::LIST,
|
TypeCode::LIST,
|
||||||
);
|
));
|
||||||
|
|
||||||
self.emit_instruction(close, Type::None, self.current_position);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => unimplemented!(),
|
_ => unimplemented!(),
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
let end = self.previous_position.1;
|
let end = self.previous_position.1;
|
||||||
@ -1382,6 +1369,13 @@ impl<'src> Compiler<'src> {
|
|||||||
end_register,
|
end_register,
|
||||||
false,
|
false,
|
||||||
);
|
);
|
||||||
|
let list_length = end_register - start_register.unwrap_or(0) + 1;
|
||||||
|
|
||||||
|
if list_length > 1 {
|
||||||
|
for close_instruction in close_instructions {
|
||||||
|
self.emit_instruction(close_instruction, item_type.clone(), Span(start, end));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
self.emit_instruction(
|
self.emit_instruction(
|
||||||
load_list,
|
load_list,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user