diff --git a/compiler/codegen/src/compile.rs b/compiler/codegen/src/compile.rs index d5ae26d91..c64cfb897 100644 --- a/compiler/codegen/src/compile.rs +++ b/compiler/codegen/src/compile.rs @@ -1991,17 +1991,23 @@ impl Compiler { keys: &[Option], values: &[ast::Expr], ) -> CompileResult<()> { - emit!(self, Instruction::BuildMap { size: 0 }); - for (key, value) in keys.iter().zip(values.iter()) { - if let Some(key) = key { - self.compile_expression(key)?; - self.compile_expression(value)?; - emit!(self, Instruction::MapAdd { i: 0 }); - } else { - self.compile_expression(value)?; - emit!(self, Instruction::DictUpdate); - } + let mut size = 0; + let (packed, unpacked): (Vec<_>, Vec<_>) = keys + .iter() + .zip(values.iter()) + .partition(|(k, _)| k.is_some()); + for (key, value) in packed { + self.compile_expression(key.as_ref().unwrap())?; + self.compile_expression(value)?; + size += 1; } + emit!(self, Instruction::BuildMap { size }); + + for (_, value) in unpacked { + self.compile_expression(value)?; + emit!(self, Instruction::DictUpdate); + } + Ok(()) }