Skip to content

Commit 9666208

Browse files
committed
Fix unpack_ex related messages
1 parent aaec044 commit 9666208

File tree

3 files changed

+17
-4
lines changed

3 files changed

+17
-4
lines changed

compiler/src/compile.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1399,7 +1399,14 @@ impl<O: OutputStream> Compiler<O> {
13991399
}
14001400
}
14011401
}
1402-
_ => return Err(self.error(CompileErrorType::Assign(target.name()))),
1402+
_ => {
1403+
return Err(self.error(match target.node {
1404+
ast::ExpressionType::Starred { .. } => CompileErrorType::SyntaxError(
1405+
"starred assignment target must be in a list or tuple".to_owned(),
1406+
),
1407+
_ => CompileErrorType::Assign(target.name()),
1408+
}))
1409+
}
14031410
}
14041411

14051412
Ok(())

vm/src/frame.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -940,8 +940,13 @@ impl ExecutingFrame<'_> {
940940
if unpack {
941941
for obj in self.pop_multiple(size) {
942942
// Take all key-value pairs from the dict:
943-
let dict: PyDictRef = obj.downcast().expect("Need a dictionary to build a map.");
943+
let dict: PyDictRef = obj.downcast().map_err(|obj| {
944+
vm.new_type_error(format!("'{}' object is not a mapping", obj.class().name))
945+
})?;
944946
for (key, value) in dict {
947+
if !objtype::isinstance(&key, &vm.ctx.str_type()) {
948+
return Err(vm.new_type_error("keywords must be strings".to_owned()));
949+
}
945950
if for_call {
946951
if map_obj.contains_key(&key, vm) {
947952
let key_repr = vm.to_repr(&key)?;
@@ -1014,6 +1019,7 @@ impl ExecutingFrame<'_> {
10141019
let kwargs = if *has_kwargs {
10151020
let kw_dict: PyDictRef = match self.pop_value().downcast() {
10161021
Err(_) => {
1022+
// TODO: check collections.abc.Mapping
10171023
return Err(vm.new_type_error("Kwargs must be a dict.".to_owned()));
10181024
}
10191025
Ok(x) => x,
@@ -1137,7 +1143,7 @@ impl ExecutingFrame<'_> {
11371143
let min_expected = before + after;
11381144
if elements.len() < min_expected {
11391145
Err(vm.new_value_error(format!(
1140-
"Not enough values to unpack (expected at least {}, got {}",
1146+
"not enough values to unpack (expected at least {}, got {})",
11411147
min_expected,
11421148
elements.len()
11431149
)))

vm/src/obj/objiter.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ pub fn get_iter(vm: &VirtualMachine, iter_target: &PyObjectRef) -> PyResult {
2626
vm.invoke(&method, vec![])
2727
} else {
2828
vm.get_method_or_type_error(iter_target.clone(), "__getitem__", || {
29-
format!("Cannot iterate over {}", iter_target.class().name)
29+
format!("'{}' object is not iterable", iter_target.class().name)
3030
})?;
3131
Ok(PySequenceIterator::new_forward(iter_target.clone())
3232
.into_ref(vm)

0 commit comments

Comments
 (0)