Skip to content

Commit 72b28e4

Browse files
committed
Fix unpack error messages
1 parent 9f2b047 commit 72b28e4

File tree

1 file changed

+28
-6
lines changed

1 file changed

+28
-6
lines changed

vm/src/frame.rs

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -667,13 +667,35 @@ impl ExecutingFrame<'_> {
667667
}
668668
bytecode::Instruction::UnpackSequence { size } => {
669669
let value = self.pop_value();
670-
let elements = vm.extract_elements(&value)?;
671-
if elements.len() != *size {
672-
Err(vm.new_value_error("Wrong number of values to unpack".to_owned()))
673-
} else {
674-
for element in elements.into_iter().rev() {
675-
self.push_value(element);
670+
let elements = vm.extract_elements(&value).map_err(|e| {
671+
if e.class().is(&vm.ctx.exceptions.type_error) {
672+
vm.new_type_error(format!(
673+
"cannot unpack non-iterable {} object",
674+
value.class().name
675+
))
676+
} else {
677+
e
678+
}
679+
})?;
680+
let msg = match elements.len().cmp(size) {
681+
std::cmp::Ordering::Equal => {
682+
for element in elements.into_iter().rev() {
683+
self.push_value(element);
684+
}
685+
None
686+
}
687+
std::cmp::Ordering::Greater => {
688+
Some(format!("too many values to unpack (expected {})", size))
676689
}
690+
std::cmp::Ordering::Less => Some(format!(
691+
"not enough values to unpack (expected {}, got {})",
692+
size,
693+
elements.len()
694+
)),
695+
};
696+
if let Some(msg) = msg {
697+
Err(vm.new_value_error(msg))
698+
} else {
677699
Ok(None)
678700
}
679701
}

0 commit comments

Comments
 (0)