@@ -284,9 +284,11 @@ impl Frame {
284284 self . push_value ( list_obj) ;
285285 Ok ( None )
286286 }
287- bytecode:: Instruction :: BuildMap { size, unpack } => {
288- self . execute_build_map ( vm, * size, * unpack)
289- }
287+ bytecode:: Instruction :: BuildMap {
288+ size,
289+ unpack,
290+ for_call,
291+ } => self . execute_build_map ( vm, * size, * unpack, * for_call) ,
290292 bytecode:: Instruction :: BuildSlice { size } => self . execute_build_slice ( vm, * size) ,
291293 bytecode:: Instruction :: ListAppend { i } => {
292294 let list_obj = self . nth_value ( * i) ;
@@ -809,13 +811,29 @@ impl Frame {
809811 Ok ( None )
810812 }
811813
812- fn execute_build_map ( & self , vm : & VirtualMachine , size : usize , unpack : bool ) -> FrameResult {
814+ fn execute_build_map (
815+ & self ,
816+ vm : & VirtualMachine ,
817+ size : usize ,
818+ unpack : bool ,
819+ for_call : bool ,
820+ ) -> FrameResult {
813821 let map_obj = vm. ctx . new_dict ( ) ;
814822 if unpack {
815823 for obj in self . pop_multiple ( size) {
816824 // Take all key-value pairs from the dict:
817825 let dict: PyDictRef = obj. downcast ( ) . expect ( "Need a dictionary to build a map." ) ;
818826 for ( key, value) in dict {
827+ if for_call {
828+ if map_obj. contains_key ( & key, vm) {
829+ let key_repr = vm. to_repr ( & key) ?;
830+ let msg = format ! (
831+ "got multiple values for keyword argument {}" ,
832+ key_repr. as_str( )
833+ ) ;
834+ return Err ( vm. new_type_error ( msg) ) ;
835+ }
836+ }
819837 map_obj. set_item ( & key, value, vm) . unwrap ( ) ;
820838 }
821839 }
0 commit comments