1
0

Prevent unnecessary CLOSE instructions

This commit is contained in:
Jeff 2025-02-11 05:52:26 -05:00
parent 59f64c9afd
commit e1e259141c

View File

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