From 9338dcdf45196494290787cf6b227fdf82d35dde Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Wed, 13 May 2020 01:48:40 +0900 Subject: [PATCH] Fix unpack_ex related messages --- compiler/src/compile.rs | 9 ++++++++- vm/src/frame.rs | 7 +++++-- vm/src/obj/objiter.rs | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/compiler/src/compile.rs b/compiler/src/compile.rs index 4a8ee9025..53aa36267 100644 --- a/compiler/src/compile.rs +++ b/compiler/src/compile.rs @@ -1399,7 +1399,14 @@ impl Compiler { } } } - _ => return Err(self.error(CompileErrorType::Assign(target.name()))), + _ => { + return Err(self.error(match target.node { + ast::ExpressionType::Starred { .. } => CompileErrorType::SyntaxError( + "starred assignment target must be in a list or tuple".to_owned(), + ), + _ => CompileErrorType::Assign(target.name()), + })) + } } Ok(()) diff --git a/vm/src/frame.rs b/vm/src/frame.rs index e522a8b4f..0b4416fdb 100644 --- a/vm/src/frame.rs +++ b/vm/src/frame.rs @@ -940,7 +940,9 @@ impl ExecutingFrame<'_> { if unpack { for obj in self.pop_multiple(size) { // Take all key-value pairs from the dict: - let dict: PyDictRef = obj.downcast().expect("Need a dictionary to build a map."); + let dict: PyDictRef = obj.downcast().map_err(|obj| { + vm.new_type_error(format!("'{}' object is not a mapping", obj.class().name)) + })?; for (key, value) in dict { if for_call { if map_obj.contains_key(&key, vm) { @@ -1014,6 +1016,7 @@ impl ExecutingFrame<'_> { let kwargs = if *has_kwargs { let kw_dict: PyDictRef = match self.pop_value().downcast() { Err(_) => { + // TODO: check collections.abc.Mapping return Err(vm.new_type_error("Kwargs must be a dict.".to_owned())); } Ok(x) => x, @@ -1137,7 +1140,7 @@ impl ExecutingFrame<'_> { let min_expected = before + after; if elements.len() < min_expected { Err(vm.new_value_error(format!( - "Not enough values to unpack (expected at least {}, got {}", + "not enough values to unpack (expected at least {}, got {})", min_expected, elements.len() ))) diff --git a/vm/src/obj/objiter.rs b/vm/src/obj/objiter.rs index e79ae0d4d..675df6f33 100644 --- a/vm/src/obj/objiter.rs +++ b/vm/src/obj/objiter.rs @@ -26,7 +26,7 @@ pub fn get_iter(vm: &VirtualMachine, iter_target: &PyObjectRef) -> PyResult { vm.invoke(&method, vec![]) } else { vm.get_method_or_type_error(iter_target.clone(), "__getitem__", || { - format!("Cannot iterate over {}", iter_target.class().name) + format!("'{}' object is not iterable", iter_target.class().name) })?; Ok(PySequenceIterator::new_forward(iter_target.clone()) .into_ref(vm)