@@ -129,6 +129,8 @@ pub trait NameProtocol {
129
129
fn store_name ( & self , vm : & VirtualMachine , name : & str , value : PyObjectRef ) ;
130
130
fn delete_name ( & self , vm : & VirtualMachine , name : & str ) ;
131
131
fn load_cell ( & self , vm : & VirtualMachine , name : & str ) -> Option < PyObjectRef > ;
132
+ fn load_global ( & self , vm : & VirtualMachine , name : & str ) -> Option < PyObjectRef > ;
133
+ fn store_global ( & self , vm : & VirtualMachine , name : & str , value : PyObjectRef ) ;
132
134
}
133
135
134
136
impl NameProtocol for Scope {
@@ -162,6 +164,14 @@ impl NameProtocol for Scope {
162
164
fn delete_name ( & self , vm : & VirtualMachine , key : & str ) {
163
165
self . get_locals ( ) . del_item ( key, vm) . unwrap ( ) ;
164
166
}
167
+
168
+ fn load_global ( & self , vm : & VirtualMachine , name : & str ) -> Option < PyObjectRef > {
169
+ self . globals . get_item_option ( name, vm) . unwrap ( )
170
+ }
171
+
172
+ fn store_global ( & self , vm : & VirtualMachine , name : & str , value : PyObjectRef ) {
173
+ self . globals . set_item ( name, value, vm) . unwrap ( ) ;
174
+ }
165
175
}
166
176
167
177
#[ derive( Clone , Debug ) ]
@@ -994,12 +1004,12 @@ impl Frame {
994
1004
& self ,
995
1005
vm : & VirtualMachine ,
996
1006
name : & str ,
997
- scope : & bytecode:: NameScope ,
1007
+ name_scope : & bytecode:: NameScope ,
998
1008
) -> FrameResult {
999
1009
let obj = self . pop_value ( ) ;
1000
- match scope {
1010
+ match name_scope {
1001
1011
bytecode:: NameScope :: Global => {
1002
- self . scope . globals . set_item ( name , obj , vm ) ? ;
1012
+ self . scope . store_global ( vm , name , obj ) ;
1003
1013
}
1004
1014
bytecode:: NameScope :: Local => {
1005
1015
self . scope . store_name ( & vm, name, obj) ;
@@ -1017,19 +1027,21 @@ impl Frame {
1017
1027
& self ,
1018
1028
vm : & VirtualMachine ,
1019
1029
name : & str ,
1020
- scope : & bytecode:: NameScope ,
1030
+ name_scope : & bytecode:: NameScope ,
1021
1031
) -> FrameResult {
1022
- let value = match scope {
1023
- bytecode:: NameScope :: Global => self . scope . globals . get_item ( name, vm) ?,
1024
- bytecode:: NameScope :: Local => match self . scope . load_name ( & vm, name) {
1025
- Some ( value) => value,
1026
- None => {
1027
- let name_error_type = vm. ctx . exceptions . name_error . clone ( ) ;
1028
- let msg = format ! ( "name '{}' is not defined" , name) ;
1029
- let name_error = vm. new_exception ( name_error_type, msg) ;
1030
- return Err ( name_error) ;
1031
- }
1032
- } ,
1032
+ let optional_value = match name_scope {
1033
+ bytecode:: NameScope :: Global => self . scope . load_global ( vm, name) ,
1034
+ bytecode:: NameScope :: Local => self . scope . load_name ( & vm, name) ,
1035
+ } ;
1036
+
1037
+ let value = match optional_value {
1038
+ Some ( value) => value,
1039
+ None => {
1040
+ let name_error_type = vm. ctx . exceptions . name_error . clone ( ) ;
1041
+ let msg = format ! ( "name '{}' is not defined" , name) ;
1042
+ let name_error = vm. new_exception ( name_error_type, msg) ;
1043
+ return Err ( name_error) ;
1044
+ }
1033
1045
} ;
1034
1046
1035
1047
self . push_value ( value) ;
0 commit comments