Skip to content

Commit 503a147

Browse files
committed
Fix comprehension instruction evaluation order
1 parent 8548bbd commit 503a147

File tree

2 files changed

+11
-11
lines changed

2 files changed

+11
-11
lines changed

compiler/src/compile.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2095,7 +2095,7 @@ impl Compiler {
20952095
&|compiler| {
20962096
compiler.compile_comprehension_element(elt)?;
20972097
compiler.emit(Instruction::ListAppend {
2098-
i: (1 + generators.len()) as u32,
2098+
i: generators.len() as u32,
20992099
});
21002100
Ok(())
21012101
},
@@ -2112,7 +2112,7 @@ impl Compiler {
21122112
&|compiler| {
21132113
compiler.compile_comprehension_element(elt)?;
21142114
compiler.emit(Instruction::SetAdd {
2115-
i: (1 + generators.len()) as u32,
2115+
i: generators.len() as u32,
21162116
});
21172117
Ok(())
21182118
},
@@ -2137,7 +2137,7 @@ impl Compiler {
21372137
compiler.compile_expression(value)?;
21382138

21392139
compiler.emit(Instruction::MapAddRev {
2140-
i: (1 + generators.len()) as u32,
2140+
i: generators.len() as u32,
21412141
});
21422142

21432143
Ok(())

vm/src/frame.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -668,45 +668,45 @@ impl ExecutingFrame<'_> {
668668
} => self.execute_build_map(vm, *size, *unpack, *for_call),
669669
bytecode::Instruction::BuildSlice { step } => self.execute_build_slice(vm, *step),
670670
bytecode::Instruction::ListAppend { i } => {
671+
let item = self.pop_value();
671672
let obj = self.nth_value(*i);
672673
let list: PyListRef = unsafe {
673674
// SAFETY: trust compiler
674675
obj.downcast_unchecked()
675676
};
676-
let item = self.pop_value();
677677
list.append(item);
678678
Ok(None)
679679
}
680680
bytecode::Instruction::SetAdd { i } => {
681+
let item = self.pop_value();
681682
let obj = self.nth_value(*i);
682683
let set: PyRef<PySet> = unsafe {
683684
// SAFETY: trust compiler
684685
obj.downcast_unchecked()
685686
};
686-
let item = self.pop_value();
687687
set.add(item, vm)?;
688688
Ok(None)
689689
}
690690
bytecode::Instruction::MapAdd { i } => {
691-
let obj = self.nth_value(*i + 1);
691+
let key = self.pop_value();
692+
let value = self.pop_value();
693+
let obj = self.nth_value(*i);
692694
let dict: PyDictRef = unsafe {
693695
// SAFETY: trust compiler
694696
obj.downcast_unchecked()
695697
};
696-
let key = self.pop_value();
697-
let value = self.pop_value();
698698
dict.set_item(&*key, value, vm)?;
699699
Ok(None)
700700
}
701701
bytecode::Instruction::MapAddRev { i } => {
702702
// change order of evalutio of key and value to support Py3.8 Named expressions in dict comprehension
703-
let obj = self.nth_value(*i + 1);
703+
let value = self.pop_value();
704+
let key = self.pop_value();
705+
let obj = self.nth_value(*i);
704706
let dict: PyDictRef = unsafe {
705707
// SAFETY: trust compiler
706708
obj.downcast_unchecked()
707709
};
708-
let value = self.pop_value();
709-
let key = self.pop_value();
710710
dict.set_item(&*key, value, vm)?;
711711
Ok(None)
712712
}

0 commit comments

Comments
 (0)