@@ -86,8 +86,8 @@ impl PyDict {
8686 if let Some ( keys) = vm. get_method ( other. clone ( ) , "keys" ) {
8787 let keys = vm. invoke ( & keys?, ( ) ) ?. get_iter ( vm) ?;
8888 while let PyIterReturn :: Return ( key) = keys. next ( vm) ? {
89- let val = other. get_item ( key. clone ( ) , vm) ?;
90- dict. insert ( vm, key, val) ?;
89+ let val = other. get_item ( & * key, vm) ?;
90+ dict. insert ( vm, & * key, val) ?;
9191 }
9292 } else {
9393 let iter = other. get_iter ( vm) ?;
@@ -105,7 +105,7 @@ impl PyDict {
105105 if matches ! ( elem_iter. next( vm) ?, PyIterReturn :: Return ( _) ) {
106106 return Err ( err ( vm) ) ;
107107 }
108- dict. insert ( vm, key, value) ?;
108+ dict. insert ( vm, & * key, value) ?;
109109 }
110110 }
111111 Ok ( ( ) )
@@ -118,7 +118,7 @@ impl PyDict {
118118 ) -> PyResult < ( ) > {
119119 let dict_size = & dict_other. size ( ) ;
120120 for ( key, value) in & dict_other {
121- dict. insert ( vm, key, value) ?;
121+ dict. insert ( vm, & * key, value) ?;
122122 }
123123 if dict_other. entries . has_changed_size ( dict_size) {
124124 return Err ( vm. new_runtime_error ( "dict mutated during update" . to_owned ( ) ) ) ;
@@ -146,7 +146,7 @@ impl PyDict {
146146 ( zelf, other)
147147 } ;
148148 for ( k, v1) in subset {
149- match superset. get_item_opt ( k, vm) ? {
149+ match superset. get_item_opt ( & * k, vm) ? {
150150 Some ( v2) => {
151151 if v1. is ( & v2) {
152152 continue ;
@@ -169,18 +169,18 @@ impl PyDict {
169169
170170 /// Set item variant which can be called with multiple
171171 /// key types, such as str to name a notable one.
172- pub ( crate ) fn inner_setitem < K : DictKey + ToPyObject > (
172+ pub ( crate ) fn inner_setitem < K : DictKey + ? Sized > (
173173 & self ,
174- key : K ,
174+ key : & K ,
175175 value : PyObjectRef ,
176176 vm : & VirtualMachine ,
177177 ) -> PyResult < ( ) > {
178178 self . entries . insert ( vm, key, value)
179179 }
180180
181- pub ( crate ) fn inner_delitem < K : DictKey + ToPyObject > (
181+ pub ( crate ) fn inner_delitem < K : DictKey + ? Sized > (
182182 & self ,
183- key : K ,
183+ key : & K ,
184184 vm : & VirtualMachine ,
185185 ) -> PyResult < ( ) > {
186186 self . entries . delete ( vm, key)
@@ -192,22 +192,21 @@ impl PyDict {
192192 key : PyObjectRef ,
193193 default : impl FnOnce ( ) -> PyObjectRef ,
194194 ) -> PyResult {
195- self . entries . setdefault ( vm, key, default)
195+ self . entries . setdefault ( vm, & * key, default)
196196 }
197197
198198 pub fn from_attributes ( attrs : PyAttributes , vm : & VirtualMachine ) -> PyResult < Self > {
199199 let dict = DictContentType :: default ( ) ;
200200
201201 for ( key, value) in attrs {
202- dict. insert ( vm, vm . new_pyobj ( key ) , value) ?;
202+ dict. insert ( vm, key . as_str ( ) , value) ?;
203203 }
204204
205205 Ok ( PyDict { entries : dict } )
206206 }
207207
208- pub fn contains_key < K : ToPyObject > ( & self , key : K , vm : & VirtualMachine ) -> bool {
209- let key = key. to_pyobject ( vm) ;
210- self . entries . contains ( vm, & key) . unwrap ( )
208+ pub fn contains_key < K : DictKey + ?Sized > ( & self , key : & K , vm : & VirtualMachine ) -> bool {
209+ self . entries . contains ( vm, key) . unwrap ( )
211210 }
212211
213212 pub fn size ( & self ) -> dictdatatype:: DictSize {
@@ -263,7 +262,7 @@ impl PyDict {
263262 }
264263 Err ( pyobj) => {
265264 for key in iterable. iter ( vm) ? {
266- pyobj. set_item ( key?, value. clone ( ) , vm) ?;
265+ pyobj. set_item ( & * key?, value. clone ( ) , vm) ?;
267266 }
268267 Ok ( pyobj)
269268 }
@@ -304,12 +303,12 @@ impl PyDict {
304303
305304 #[ pymethod( magic) ]
306305 fn contains ( & self , key : PyObjectRef , vm : & VirtualMachine ) -> PyResult < bool > {
307- self . entries . contains ( vm, & key)
306+ self . entries . contains ( vm, & * key)
308307 }
309308
310309 #[ pymethod( magic) ]
311310 fn delitem ( & self , key : PyObjectRef , vm : & VirtualMachine ) -> PyResult < ( ) > {
312- self . inner_delitem ( key, vm)
311+ self . inner_delitem ( & * key, vm)
313312 }
314313
315314 #[ pymethod]
@@ -334,13 +333,13 @@ impl PyDict {
334333
335334 #[ pymethod( magic) ]
336335 fn setitem ( & self , key : PyObjectRef , value : PyObjectRef , vm : & VirtualMachine ) -> PyResult < ( ) > {
337- self . inner_setitem ( key, value, vm)
336+ self . inner_setitem ( & * key, value, vm)
338337 }
339338
340339 #[ pymethod( magic) ]
341340 #[ cfg_attr( feature = "flame-it" , flame( "PyDictRef" ) ) ]
342341 fn getitem ( zelf : PyRef < Self > , key : PyObjectRef , vm : & VirtualMachine ) -> PyResult {
343- zelf. inner_getitem ( key, vm)
342+ zelf. inner_getitem ( & * key, vm)
344343 }
345344
346345 #[ pymethod]
@@ -350,7 +349,7 @@ impl PyDict {
350349 default : OptionalArg < PyObjectRef > ,
351350 vm : & VirtualMachine ,
352351 ) -> PyResult {
353- match self . entries . get ( vm, & key) ? {
352+ match self . entries . get ( vm, & * key) ? {
354353 Some ( value) => Ok ( value) ,
355354 None => Ok ( default. unwrap_or_none ( vm) ) ,
356355 }
@@ -364,7 +363,7 @@ impl PyDict {
364363 vm : & VirtualMachine ,
365364 ) -> PyResult {
366365 self . entries
367- . setdefault ( vm, key, || default. unwrap_or_none ( vm) )
366+ . setdefault ( vm, & * key, || default. unwrap_or_none ( vm) )
368367 }
369368
370369 #[ pymethod]
@@ -385,7 +384,7 @@ impl PyDict {
385384 Self :: merge_object ( & self . entries , dict_obj, vm) ?;
386385 }
387386 for ( key, value) in kwargs. into_iter ( ) {
388- self . entries . insert ( vm, vm . new_pyobj ( key) , value) ?;
387+ self . entries . insert ( vm, & key, value) ?;
389388 }
390389 Ok ( ( ) )
391390 }
@@ -425,7 +424,7 @@ impl PyDict {
425424 default : OptionalArg < PyObjectRef > ,
426425 vm : & VirtualMachine ,
427426 ) -> PyResult {
428- match self . entries . pop ( vm, & key) ? {
427+ match self . entries . pop ( vm, & * key) ? {
429428 Some ( value) => Ok ( value) ,
430429 None => default. ok_or_else ( || vm. new_key_error ( key) ) ,
431430 }
@@ -523,25 +522,25 @@ impl Py<PyDict> {
523522 self . class ( ) . is ( & vm. ctx . types . dict_type )
524523 }
525524
526- fn missing_opt < K : DictKey + ToPyObject > (
525+ fn missing_opt < K : DictKey + ? Sized > (
527526 & self ,
528- key : K ,
527+ key : & K ,
529528 vm : & VirtualMachine ,
530529 ) -> PyResult < Option < PyObjectRef > > {
531530 vm. get_method ( self . to_owned ( ) . into ( ) , "__missing__" )
532- . map ( |methods| vm. invoke ( & methods?, ( key, ) ) )
531+ . map ( |methods| vm. invoke ( & methods?, ( key. to_pyobject ( vm ) , ) ) )
533532 . transpose ( )
534533 }
535534
536535 #[ inline]
537- fn inner_getitem < K : DictKey + ToPyObject + Clone > (
536+ fn inner_getitem < K : DictKey + ? Sized > (
538537 & self ,
539- key : K ,
538+ key : & K ,
540539 vm : & VirtualMachine ,
541540 ) -> PyResult < PyObjectRef > {
542- if let Some ( value) = self . entries . get ( vm, & key) ? {
541+ if let Some ( value) = self . entries . get ( vm, key) ? {
543542 Ok ( value)
544- } else if let Some ( value) = self . missing_opt ( key. clone ( ) , vm) ? {
543+ } else if let Some ( value) = self . missing_opt ( key, vm) ? {
545544 Ok ( value)
546545 } else {
547546 Err ( vm. new_key_error ( key. to_pyobject ( vm) ) )
@@ -558,16 +557,16 @@ impl Py<PyDict> {
558557 attrs
559558 }
560559
561- pub fn get_item_opt < K : DictKey + ToPyObject + Clone > (
560+ pub fn get_item_opt < K : DictKey + ? Sized > (
562561 & self ,
563- key : K ,
562+ key : & K ,
564563 vm : & VirtualMachine ,
565564 ) -> PyResult < Option < PyObjectRef > > {
566565 if self . exact_dict ( vm) {
567- self . entries . get ( vm, & key)
566+ self . entries . get ( vm, key)
568567 // FIXME: check __missing__?
569568 } else {
570- match self . as_object ( ) . get_item ( key. clone ( ) , vm) {
569+ match self . as_object ( ) . get_item ( key, vm) {
571570 Ok ( value) => Ok ( Some ( value) ) ,
572571 Err ( e) if e. fast_isinstance ( & vm. ctx . exceptions . key_error ) => {
573572 self . missing_opt ( key, vm)
@@ -577,21 +576,17 @@ impl Py<PyDict> {
577576 }
578577 }
579578
580- pub fn get_item < K : DictKey + ToPyObject + Clone > (
581- & self ,
582- key : K ,
583- vm : & VirtualMachine ,
584- ) -> PyResult {
579+ pub fn get_item < K : DictKey + ?Sized > ( & self , key : & K , vm : & VirtualMachine ) -> PyResult {
585580 if self . exact_dict ( vm) {
586581 self . inner_getitem ( key, vm)
587582 } else {
588583 self . as_object ( ) . get_item ( key, vm)
589584 }
590585 }
591586
592- pub fn set_item < K : DictKey + ToPyObject > (
587+ pub fn set_item < K : DictKey + ? Sized > (
593588 & self ,
594- key : K ,
589+ key : & K ,
595590 value : PyObjectRef ,
596591 vm : & VirtualMachine ,
597592 ) -> PyResult < ( ) > {
@@ -602,25 +597,25 @@ impl Py<PyDict> {
602597 }
603598 }
604599
605- pub fn del_item < K : DictKey + ToPyObject > ( & self , key : K , vm : & VirtualMachine ) -> PyResult < ( ) > {
600+ pub fn del_item < K : DictKey + ? Sized > ( & self , key : & K , vm : & VirtualMachine ) -> PyResult < ( ) > {
606601 if self . exact_dict ( vm) {
607602 self . inner_delitem ( key, vm)
608603 } else {
609604 self . as_object ( ) . del_item ( key, vm)
610605 }
611606 }
612607
613- pub fn get_chain < K : ToPyObject + DictKey + Clone > (
608+ pub fn get_chain < K : DictKey + ? Sized > (
614609 & self ,
615610 other : & Self ,
616- key : K ,
611+ key : & K ,
617612 vm : & VirtualMachine ,
618613 ) -> PyResult < Option < PyObjectRef > > {
619614 let self_exact = self . exact_dict ( vm) ;
620615 let other_exact = other. exact_dict ( vm) ;
621616 if self_exact && other_exact {
622- self . entries . get_chain ( & other. entries , vm, & key)
623- } else if let Some ( value) = self . get_item_opt ( key. clone ( ) , vm) ? {
617+ self . entries . get_chain ( & other. entries , vm, key)
618+ } else if let Some ( value) = self . get_item_opt ( key, vm) ? {
624619 Ok ( Some ( value) )
625620 } else {
626621 other. get_item_opt ( key, vm)
0 commit comments