mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-29 19:24:57 +08:00
Merge pull request #1884 from RustPython/coolreader18/disable-unpack-opt
Disable the unpack optimization
This commit is contained in:
3 files changed
+29
-24
No files matched your search
@@ -92,7 +92,7 @@ impl<O: OutputStream> PeepholeOptimizer<O> {
|
||||
}
|
||||
|
||||
fn optimize(&mut self) {
|
||||
apply_optimizations!(self, operator, unpack);
|
||||
apply_optimizations!(self, operator /* , unpack */);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -73,26 +73,27 @@ pub fn operator(buf: &mut impl OptimizationBuffer) {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn unpack(buf: &mut impl OptimizationBuffer) {
|
||||
let (instruction, meta) = buf.pop();
|
||||
if let Instruction::UnpackSequence { size } = instruction {
|
||||
let (arg, arg_meta) = buf.pop();
|
||||
match arg {
|
||||
Instruction::BuildTuple {
|
||||
size: tup_size,
|
||||
unpack,
|
||||
} if !unpack && tup_size == size => {
|
||||
buf.emit(
|
||||
Instruction::Reverse { amount: size },
|
||||
vec![arg_meta, meta].into(),
|
||||
);
|
||||
}
|
||||
arg => {
|
||||
buf.emit(arg, arg_meta);
|
||||
buf.emit(instruction, meta);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
buf.emit(instruction, meta)
|
||||
}
|
||||
}
|
||||
// TODO: make a version of this that doesn't miscompile `a, b = (1, 2) if True else (3, 4)`
|
||||
// pub fn unpack(buf: &mut impl OptimizationBuffer) {
|
||||
// let (instruction, meta) = buf.pop();
|
||||
// if let Instruction::UnpackSequence { size } = instruction {
|
||||
// let (arg, arg_meta) = buf.pop();
|
||||
// match arg {
|
||||
// Instruction::BuildTuple {
|
||||
// size: tup_size,
|
||||
// unpack,
|
||||
// } if !unpack && tup_size == size => {
|
||||
// buf.emit(
|
||||
// Instruction::Reverse { amount: size },
|
||||
// vec![arg_meta, meta].into(),
|
||||
// );
|
||||
// }
|
||||
// arg => {
|
||||
// buf.emit(arg, arg_meta);
|
||||
// buf.emit(instruction, meta);
|
||||
// }
|
||||
// }
|
||||
// } else {
|
||||
// buf.emit(instruction, meta)
|
||||
// }
|
||||
// }
|
||||
@@ -24,3 +24,7 @@ def func2():
|
||||
return 20
|
||||
|
||||
assert ret(func1() or func2()) == 20
|
||||
|
||||
a, b = (1, 2) if True else (3, 4)
|
||||
assert a == 1
|
||||
assert b == 2
|
||||
Reference in new issue
Block a user