@@ -5,7 +5,7 @@ use crate::{
55 function:: { PyCell , PyCellRef , PyFunction } ,
66 tuple:: { PyTuple , PyTupleTyped } ,
77 PyBaseExceptionRef , PyCode , PyCoroutine , PyDict , PyDictRef , PyGenerator , PyList , PySet ,
8- PySlice , PyStr , PyStrRef , PyTraceback , PyTypeRef ,
8+ PySlice , PyStr , PyStrInterned , PyStrRef , PyTraceback , PyTypeRef ,
99 } ,
1010 bytecode,
1111 convert:: { IntoObject , ToPyResult } ,
@@ -187,7 +187,7 @@ impl FrameRef {
187187 let j = std:: cmp:: min ( map. len ( ) , code. varnames . len ( ) ) ;
188188 if !code. varnames . is_empty ( ) {
189189 let fastlocals = self . fastlocals . lock ( ) ;
190- for ( k, v) in itertools:: zip ( & map[ ..j] , & * * fastlocals) {
190+ for ( & k, v) in itertools:: zip ( & map[ ..j] , & * * fastlocals) {
191191 match locals. mapping ( ) . ass_subscript ( k, v. clone ( ) , vm) {
192192 Ok ( ( ) ) => { }
193193 Err ( e) if e. fast_isinstance ( & vm. ctx . exceptions . key_error ) => { }
@@ -196,8 +196,8 @@ impl FrameRef {
196196 }
197197 }
198198 if !code. cellvars . is_empty ( ) || !code. freevars . is_empty ( ) {
199- let map_to_dict = |keys : & [ PyStrRef ] , values : & [ PyCellRef ] | {
200- for ( k, v) in itertools:: zip ( keys, values) {
199+ let map_to_dict = |keys : & [ & PyStrInterned ] , values : & [ PyCellRef ] | {
200+ for ( & k, v) in itertools:: zip ( keys, values) {
201201 if let Some ( value) = v. get ( ) {
202202 locals. mapping ( ) . ass_subscript ( k, Some ( value) , vm) ?;
203203 } else {
@@ -424,19 +424,19 @@ impl ExecutingFrame<'_> {
424424 }
425425
426426 fn unbound_cell_exception ( & self , i : usize , vm : & VirtualMachine ) -> PyBaseExceptionRef {
427- if let Some ( name) = self . code . cellvars . get ( i) {
427+ if let Some ( & name) = self . code . cellvars . get ( i) {
428428 vm. new_exception_msg (
429429 vm. ctx . exceptions . unbound_local_error . clone ( ) ,
430430 format ! ( "local variable '{}' referenced before assignment" , name) ,
431431 )
432432 } else {
433- let name = & self . code . freevars [ i - self . code . cellvars . len ( ) ] ;
433+ let name = self . code . freevars [ i - self . code . cellvars . len ( ) ] ;
434434 vm. new_name_error (
435435 format ! (
436436 "free variable '{}' referenced before assignment in enclosing scope" ,
437437 name
438438 ) ,
439- name,
439+ name. to_owned ( ) ,
440440 )
441441 }
442442 }
@@ -471,7 +471,7 @@ impl ExecutingFrame<'_> {
471471 Ok ( None )
472472 }
473473 bytecode:: Instruction :: ImportName { idx } => {
474- self . import ( vm, Some ( self . code . names [ * idx as usize ] . clone ( ) ) )
474+ self . import ( vm, Some ( self . code . names [ * idx as usize ] . to_owned ( ) ) )
475475 }
476476 bytecode:: Instruction :: ImportNameless => self . import ( vm, None ) ,
477477 bytecode:: Instruction :: ImportStar => self . import_star ( vm) ,
@@ -495,7 +495,7 @@ impl ExecutingFrame<'_> {
495495 Ok ( None )
496496 }
497497 bytecode:: Instruction :: LoadNameAny ( idx) => {
498- let name = & self . code . names [ * idx as usize ] ;
498+ let name = self . code . names [ * idx as usize ] ;
499499 let value = self . locals . mapping ( ) . subscript ( name, vm) . ok ( ) ;
500500 self . push_value ( match value {
501501 Some ( x) => x,
@@ -519,8 +519,8 @@ impl ExecutingFrame<'_> {
519519 }
520520 bytecode:: Instruction :: LoadClassDeref ( i) => {
521521 let i = * i as usize ;
522- let name = self . code . freevars [ i - self . code . cellvars . len ( ) ] . clone ( ) ;
523- let value = self . locals . mapping ( ) . subscript ( & name, vm) . ok ( ) ;
522+ let name = self . code . freevars [ i - self . code . cellvars . len ( ) ] ;
523+ let value = self . locals . mapping ( ) . subscript ( name, vm) . ok ( ) ;
524524 self . push_value ( match value {
525525 Some ( v) => v,
526526 None => self . cells_frees [ i]
@@ -535,15 +535,15 @@ impl ExecutingFrame<'_> {
535535 Ok ( None )
536536 }
537537 bytecode:: Instruction :: StoreLocal ( idx) => {
538- let name = & self . code . names [ * idx as usize ] ;
538+ let name = self . code . names [ * idx as usize ] ;
539539 let value = self . pop_value ( ) ;
540540 self . locals . mapping ( ) . ass_subscript ( name, Some ( value) , vm) ?;
541541 Ok ( None )
542542 }
543543 bytecode:: Instruction :: StoreGlobal ( idx) => {
544544 let value = self . pop_value ( ) ;
545545 self . globals
546- . set_item ( & * self . code . names [ * idx as usize ] . clone ( ) , value, vm) ?;
546+ . set_item ( self . code . names [ * idx as usize ] , value, vm) ?;
547547 Ok ( None )
548548 }
549549 bytecode:: Instruction :: StoreDeref ( i) => {
@@ -556,28 +556,30 @@ impl ExecutingFrame<'_> {
556556 Ok ( None )
557557 }
558558 bytecode:: Instruction :: DeleteLocal ( idx) => {
559- let name = & self . code . names [ * idx as usize ] ;
559+ let name = self . code . names [ * idx as usize ] ;
560560 let res = self . locals . mapping ( ) . ass_subscript ( name, None , vm) ;
561561
562562 match res {
563563 Ok ( ( ) ) => { }
564564 Err ( e) if e. fast_isinstance ( & vm. ctx . exceptions . key_error ) => {
565- return Err (
566- vm. new_name_error ( format ! ( "name '{}' is not defined" , name) , name)
567- )
565+ return Err ( vm. new_name_error (
566+ format ! ( "name '{}' is not defined" , name) ,
567+ name. to_owned ( ) ,
568+ ) )
568569 }
569570 Err ( e) => return Err ( e) ,
570571 }
571572 Ok ( None )
572573 }
573574 bytecode:: Instruction :: DeleteGlobal ( idx) => {
574- let name = & self . code . names [ * idx as usize ] ;
575- match self . globals . del_item ( & * * name, vm) {
575+ let name = self . code . names [ * idx as usize ] ;
576+ match self . globals . del_item ( name, vm) {
576577 Ok ( ( ) ) => { }
577578 Err ( e) if e. fast_isinstance ( & vm. ctx . exceptions . key_error ) => {
578- return Err (
579- vm. new_name_error ( format ! ( "name '{}' is not defined" , name) , name)
580- )
579+ return Err ( vm. new_name_error (
580+ format ! ( "name '{}' is not defined" , name) ,
581+ name. to_owned ( ) ,
582+ ) )
581583 }
582584 Err ( e) => return Err ( e) ,
583585 }
@@ -926,8 +928,8 @@ impl ExecutingFrame<'_> {
926928 }
927929 bytecode:: Instruction :: LoadMethod { idx } => {
928930 let obj = self . pop_value ( ) ;
929- let method_name = self . code . names [ * idx as usize ] . clone ( ) ;
930- let method = PyMethod :: get ( obj, method_name, vm) ?;
931+ let method_name = self . code . names [ * idx as usize ] ;
932+ let method = PyMethod :: get ( obj, method_name. to_owned ( ) , vm) ?;
931933 let ( target, is_method, func) = match method {
932934 PyMethod :: Function { target, func } => ( target, true , func) ,
933935 PyMethod :: Attribute ( val) => ( vm. ctx . none ( ) , false , val) ,
@@ -1094,7 +1096,7 @@ impl ExecutingFrame<'_> {
10941096 self . globals
10951097 . get_chain ( self . builtins , name, vm) ?
10961098 . ok_or_else ( || {
1097- vm. new_name_error ( format ! ( "name '{}' is not defined" , name) , & name. to_owned ( ) )
1099+ vm. new_name_error ( format ! ( "name '{}' is not defined" , name) , name. to_owned ( ) )
10981100 } )
10991101 }
11001102
@@ -1133,10 +1135,10 @@ impl ExecutingFrame<'_> {
11331135 #[ cfg_attr( feature = "flame-it" , flame( "Frame" ) ) ]
11341136 fn import_from ( & mut self , vm : & VirtualMachine , idx : bytecode:: NameIdx ) -> PyResult {
11351137 let module = self . last_value ( ) ;
1136- let name = & self . code . names [ idx as usize ] ;
1137- let err = || vm. new_import_error ( format ! ( "cannot import name '{}'" , name) , name. clone ( ) ) ;
1138+ let name = self . code . names [ idx as usize ] ;
1139+ let err = || vm. new_import_error ( format ! ( "cannot import name '{}'" , name) , name) ;
11381140 // Load attribute, and transform any error into import error.
1139- if let Some ( obj) = vm. get_attribute_opt ( module. clone ( ) , name. clone ( ) ) ? {
1141+ if let Some ( obj) = vm. get_attribute_opt ( module. clone ( ) , name) ? {
11401142 return Ok ( obj) ;
11411143 }
11421144 // fallback to importing '{module.__name__}.{name}' from sys.modules
@@ -1731,23 +1733,23 @@ impl ExecutingFrame<'_> {
17311733 }
17321734
17331735 fn load_attr ( & mut self , vm : & VirtualMachine , attr : bytecode:: NameIdx ) -> FrameResult {
1734- let attr_name = self . code . names [ attr as usize ] . clone ( ) ;
1736+ let attr_name = self . code . names [ attr as usize ] ;
17351737 let parent = self . pop_value ( ) ;
17361738 let obj = parent. get_attr ( attr_name, vm) ?;
17371739 self . push_value ( obj) ;
17381740 Ok ( None )
17391741 }
17401742
17411743 fn store_attr ( & mut self , vm : & VirtualMachine , attr : bytecode:: NameIdx ) -> FrameResult {
1742- let attr_name = self . code . names [ attr as usize ] . clone ( ) ;
1744+ let attr_name = self . code . names [ attr as usize ] ;
17431745 let parent = self . pop_value ( ) ;
17441746 let value = self . pop_value ( ) ;
17451747 parent. set_attr ( attr_name, value, vm) ?;
17461748 Ok ( None )
17471749 }
17481750
17491751 fn delete_attr ( & mut self , vm : & VirtualMachine , attr : bytecode:: NameIdx ) -> FrameResult {
1750- let attr_name = self . code . names [ attr as usize ] . clone ( ) ;
1752+ let attr_name = self . code . names [ attr as usize ] ;
17511753 let parent = self . pop_value ( ) ;
17521754 parent. del_attr ( attr_name, vm) ?;
17531755 Ok ( None )
0 commit comments