Merge pull request #932 from youknowone/dict-unpacking

Add dict unpacking support for literal
This commit is contained in:
Windel Bouwman
2019-05-07 21:25:39 +02:00
committed by GitHub
6 changed files with 40 additions and 8 deletions

View File

@@ -1256,13 +1256,25 @@ impl Compiler {
}
ast::Expression::Dict { elements } => {
let size = elements.len();
let has_double_star = elements.iter().any(|e| e.0.is_none());
for (key, value) in elements {
self.compile_expression(key)?;
self.compile_expression(value)?;
if let Some(key) = key {
self.compile_expression(key)?;
self.compile_expression(value)?;
if has_double_star {
self.emit(Instruction::BuildMap {
size: 1,
unpack: false,
});
}
} else {
// dict unpacking
self.compile_expression(value)?;
}
}
self.emit(Instruction::BuildMap {
size,
unpack: false,
unpack: has_double_star,
});
}
ast::Expression::Slice { elements } => {

View File

@@ -358,7 +358,11 @@ fn expression_to_ast(vm: &VirtualMachine, expression: &ast::Expression) -> PyRes
let mut keys = Vec::new();
let mut values = Vec::new();
for (k, v) in elements {
keys.push(expression_to_ast(vm, k)?.into_object());
if let Some(k) = k {
keys.push(expression_to_ast(vm, k)?.into_object());
} else {
keys.push(vm.ctx.none());
}
values.push(expression_to_ast(vm, v)?.into_object());
}

View File

@@ -404,7 +404,11 @@ impl SymbolTableBuilder {
}
ast::Expression::Dict { elements } => {
for (key, value) in elements {
self.scan_expression(key)?;
if let Some(key) = key {
self.scan_expression(key)?;
} else {
// dict unpacking marker
}
self.scan_expression(value)?;
}
}