From cb3578dbf255c073f833e9164d9f21b5d91efe04 Mon Sep 17 00:00:00 2001 From: harupy Date: Sun, 15 Jan 2023 14:54:58 +0900 Subject: [PATCH] Fix scan_expression and compile_dict --- codegen/src/compile.rs | 14 +++++++------- codegen/src/symboltable.rs | 13 +++++++------ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/codegen/src/compile.rs b/codegen/src/compile.rs index c245c62..193aad4 100644 --- a/codegen/src/compile.rs +++ b/codegen/src/compile.rs @@ -1992,18 +1992,18 @@ impl Compiler { values: &[ast::Expr], ) -> CompileResult<()> { let mut size = 0; - - let (packed_values, unpacked_values) = values.split_at(keys.len()); - for (key, value) in keys.iter().zip(packed_values) { - if let Some(key) = key { - self.compile_expression(key)?; - } + 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_values { + for (_, value) in unpacked { self.compile_expression(value)?; emit!(self, Instruction::DictUpdate); } diff --git a/codegen/src/symboltable.rs b/codegen/src/symboltable.rs index c12de9f..86a3e35 100644 --- a/codegen/src/symboltable.rs +++ b/codegen/src/symboltable.rs @@ -885,14 +885,15 @@ impl SymbolTableBuilder { self.scan_expression(value, ExpressionContext::Load)?; } Dict { keys, values } => { - let (packed, unpacked) = values.split_at(keys.len()); - for (key, value) in keys.iter().zip(packed) { - if let Some(key) = key { - self.scan_expression(key, context)?; - } + let (packed, unpacked): (Vec<_>, Vec<_>) = keys + .iter() + .zip(values.iter()) + .partition(|(key, _)| key.is_some()); + for (key, value) in packed { + self.scan_expression(&key.as_ref().unwrap(), context)?; self.scan_expression(value, context)?; } - for value in unpacked { + for (_, value) in unpacked { // dict unpacking marker self.scan_expression(value, context)?; }