From d83e3ee8cd4744c4a2fc3cacfb1d328621389392 Mon Sep 17 00:00:00 2001 From: harupy Date: Mon, 16 Jan 2023 01:27:54 +0900 Subject: [PATCH] Revert "Simplify compile_dict" This reverts commit b31b08a30eb24e246b7f0a0d69b2b5e56a7e7a40. --- codegen/src/compile.rs | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/codegen/src/compile.rs b/codegen/src/compile.rs index d5ae26d..c64cfb8 100644 --- a/codegen/src/compile.rs +++ b/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(()) }