Skip to content

Commit b90a1cf

Browse files
Merge pull request RustPython#789 from skinny121/dict_literal_order
Fix order of dict literal
2 parents 8535ba9 + dda0d56 commit b90a1cf

File tree

4 files changed

+16
-6
lines changed

4 files changed

+16
-6
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/snippets/dict.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,3 +80,9 @@ def __eq__(self, other):
8080
x[Hashable(19,8)] = 1
8181
assert x[Hashable(8)] == 1
8282
assert len(x) == 2
83+
84+
assert list({'a': 2, 'b': 10}) == ['a', 'b']
85+
x = {}
86+
x['a'] = 2
87+
x['b'] = 10
88+
assert list(x) == ['a', 'b']

vm/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,4 @@ caseless = "0.2.1"
2626
unicode-segmentation = "1.2.1"
2727
lazy_static = "^1.0.1"
2828
lexical = "2.0.0"
29+
itertools = "^0.8.0"

vm/src/frame.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ use crate::pyobject::{
2525
TryFromObject, TypeProtocol,
2626
};
2727
use crate::vm::VirtualMachine;
28+
use itertools::Itertools;
2829

2930
/*
3031
* So a scope is a linked list of scopes.
@@ -386,21 +387,22 @@ impl Frame {
386387
}
387388
bytecode::Instruction::BuildMap { size, unpack } => {
388389
let map_obj = vm.ctx.new_dict();
389-
for _x in 0..*size {
390-
let obj = self.pop_value();
391-
if *unpack {
390+
if *unpack {
391+
for obj in self.pop_multiple(*size) {
392392
// Take all key-value pairs from the dict:
393393
let dict: PyDictRef =
394394
obj.downcast().expect("Need a dictionary to build a map.");
395395
let dict_elements = dict.get_key_value_pairs();
396396
for (key, value) in dict_elements.iter() {
397397
map_obj.set_item(key.clone(), value.clone(), vm);
398398
}
399-
} else {
400-
let key = self.pop_value();
401-
map_obj.set_item(key, obj, vm)
399+
}
400+
} else {
401+
for (key, value) in self.pop_multiple(2 * size).into_iter().tuples() {
402+
map_obj.set_item(key, value, vm)
402403
}
403404
}
405+
404406
self.push_value(map_obj.into_object());
405407
Ok(None)
406408
}

0 commit comments

Comments
 (0)