Revert "Simplify compile_dict"

This reverts commit b31b08a30eb24e246b7f0a0d69b2b5e56a7e7a40.
This commit is contained in:
harupy 2023-01-16 01:27:54 +09:00
parent 4f32bacf9c
commit d83e3ee8cd

View file

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