mirror of
https://github.com/RustPython/RustPython.git
synced 2026-06-17 01:51:39 +09:00
Merge pull request #932 from youknowone/dict-unpacking
Add dict unpacking support for literal
This commit is contained in:
@@ -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 } => {
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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)?;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user