File tree Expand file tree Collapse file tree 1 file changed +28
-6
lines changed Expand file tree Collapse file tree 1 file changed +28
-6
lines changed Original file line number Diff line number Diff line change @@ -667,13 +667,35 @@ impl ExecutingFrame<'_> {
667
667
}
668
668
bytecode:: Instruction :: UnpackSequence { size } => {
669
669
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) )
676
689
}
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 {
677
699
Ok ( None )
678
700
}
679
701
}
You can’t perform that action at this time.
0 commit comments