@@ -123,6 +123,7 @@ pub trait NameProtocol {
123123 fn load_name ( & self , vm : & VirtualMachine , name : & str ) -> Option < PyObjectRef > ;
124124 fn store_name ( & self , vm : & VirtualMachine , name : & str , value : PyObjectRef ) ;
125125 fn delete_name ( & self , vm : & VirtualMachine , name : & str ) -> PyResult ;
126+ fn load_local ( & self , vm : & VirtualMachine , name : & str ) -> Option < PyObjectRef > ;
126127 fn load_cell ( & self , vm : & VirtualMachine , name : & str ) -> Option < PyObjectRef > ;
127128 fn store_cell ( & self , vm : & VirtualMachine , name : & str , value : PyObjectRef ) ;
128129 fn load_global ( & self , vm : & VirtualMachine , name : & str ) -> Option < PyObjectRef > ;
@@ -142,6 +143,12 @@ impl NameProtocol for Scope {
142143 self . load_global ( vm, name)
143144 }
144145
146+ #[ cfg_attr( feature = "flame-it" , flame( "Scope" ) ) ]
147+ /// Load a local name. Only check the local dictionary for the given name.
148+ fn load_local ( & self , vm : & VirtualMachine , name : & str ) -> Option < PyObjectRef > {
149+ self . get_locals ( ) . get_item_option ( name, vm) . unwrap ( )
150+ }
151+
145152 #[ cfg_attr( feature = "flame-it" , flame( "Scope" ) ) ]
146153 fn load_cell ( & self , vm : & VirtualMachine , name : & str ) -> Option < PyObjectRef > {
147154 for dict in self . locals . iter ( ) . skip ( 1 ) {
@@ -170,7 +177,17 @@ impl NameProtocol for Scope {
170177 }
171178
172179 #[ cfg_attr( feature = "flame-it" , flame( "Scope" ) ) ]
180+ /// Load a global name.
173181 fn load_global ( & self , vm : & VirtualMachine , name : & str ) -> Option < PyObjectRef > {
182+ // First, take a look in the outmost local scope (the scope at top level)
183+ let last_local_dict = self . locals . iter ( ) . last ( ) ;
184+ if let Some ( local_dict) = last_local_dict {
185+ if let Some ( value) = local_dict. get_item_option ( name, vm) . unwrap ( ) {
186+ return Some ( value) ;
187+ }
188+ }
189+
190+ // Now, take a look at the globals or builtins.
174191 if let Some ( value) = self . globals . get_item_option ( name, vm) . unwrap ( ) {
175192 Some ( value)
176193 } else {
0 commit comments