@@ -31,7 +31,7 @@ use crate::obj::objiter;
31
31
use crate :: obj:: objlist:: { self , PyList } ;
32
32
use crate :: obj:: objmap;
33
33
use crate :: obj:: objmemory;
34
- use crate :: obj:: objmodule;
34
+ use crate :: obj:: objmodule:: { self , PyModule } ;
35
35
use crate :: obj:: objnone;
36
36
use crate :: obj:: objobject;
37
37
use crate :: obj:: objproperty;
@@ -92,10 +92,10 @@ impl fmt::Display for PyObject {
92
92
}
93
93
}
94
94
95
- match & self . payload {
96
- PyObjectPayload :: Module { name, .. } => write ! ( f, "module '{}'" , name) ,
97
- _ => write ! ( f, "'{}' object" , objtype:: get_type_name( & self . typ( ) ) ) ,
95
+ if let Some ( PyModule { ref name, .. } ) = self . payload :: < PyModule > ( ) {
96
+ return write ! ( f, "module '{}'" , name) ;
98
97
}
98
+ write ! ( f, "'{}' object" , objtype:: get_type_name( & self . typ( ) ) )
99
99
}
100
100
}
101
101
@@ -600,9 +600,11 @@ impl PyContext {
600
600
601
601
pub fn new_module ( & self , name : & str , scope : ScopeRef ) -> PyObjectRef {
602
602
PyObject :: new (
603
- PyObjectPayload :: Module {
604
- name : name. to_string ( ) ,
605
- scope,
603
+ PyObjectPayload :: AnyRustValue {
604
+ value : Box :: new ( PyModule {
605
+ name : name. to_string ( ) ,
606
+ scope,
607
+ } ) ,
606
608
} ,
607
609
self . module_type . clone ( ) ,
608
610
)
@@ -730,7 +732,7 @@ impl PyContext {
730
732
}
731
733
732
734
pub fn set_attr ( & self , obj : & PyObjectRef , attr_name : & str , value : PyObjectRef ) {
733
- if let PyObjectPayload :: Module { ref scope, .. } = obj. payload {
735
+ if let Some ( PyModule { ref scope, .. } ) = obj. payload :: < PyModule > ( ) {
734
736
scope. locals . set_item ( self , attr_name, value)
735
737
} else if let Some ( ref dict) = obj. dict {
736
738
dict. borrow_mut ( ) . insert ( attr_name. to_string ( ) , value) ;
@@ -850,15 +852,14 @@ impl AttributeProtocol for PyObjectRef {
850
852
return None ;
851
853
}
852
854
853
- match self . payload {
854
- PyObjectPayload :: Module { ref scope, .. } => scope. locals . get_item ( attr_name) ,
855
- _ => {
856
- if let Some ( ref dict) = self . dict {
857
- dict. borrow ( ) . get ( attr_name) . cloned ( )
858
- } else {
859
- None
860
- }
861
- }
855
+ if let Some ( PyModule { ref scope, .. } ) = self . payload :: < PyModule > ( ) {
856
+ return scope. locals . get_item ( attr_name) ;
857
+ }
858
+
859
+ if let Some ( ref dict) = self . dict {
860
+ dict. borrow ( ) . get ( attr_name) . cloned ( )
861
+ } else {
862
+ None
862
863
}
863
864
}
864
865
@@ -868,15 +869,14 @@ impl AttributeProtocol for PyObjectRef {
868
869
|| mro. iter ( ) . any ( |d| class_has_item ( d, attr_name) ) ;
869
870
}
870
871
871
- match self . payload {
872
- PyObjectPayload :: Module { ref scope, .. } => scope. locals . contains_key ( attr_name) ,
873
- _ => {
874
- if let Some ( ref dict) = self . dict {
875
- dict. borrow ( ) . contains_key ( attr_name)
876
- } else {
877
- false
878
- }
879
- }
872
+ if let Some ( PyModule { ref scope, .. } ) = self . payload :: < PyModule > ( ) {
873
+ return scope. locals . contains_key ( attr_name) ;
874
+ }
875
+
876
+ if let Some ( ref dict) = self . dict {
877
+ dict. borrow ( ) . contains_key ( attr_name)
878
+ } else {
879
+ false
880
880
}
881
881
}
882
882
}
@@ -900,22 +900,20 @@ impl DictProtocol for PyObjectRef {
900
900
fn get_item ( & self , k : & str ) -> Option < PyObjectRef > {
901
901
if let Some ( dict) = self . payload :: < PyDict > ( ) {
902
902
objdict:: content_get_key_str ( & dict. entries . borrow ( ) , k)
903
+ } else if let Some ( PyModule { ref scope, .. } ) = self . payload :: < PyModule > ( ) {
904
+ scope. locals . get_item ( k)
903
905
} else {
904
- match self . payload {
905
- PyObjectPayload :: Module { ref scope, .. } => scope. locals . get_item ( k) ,
906
- ref k => panic ! ( "TODO {:?}" , k) ,
907
- }
906
+ panic ! ( "TODO {:?}" , k)
908
907
}
909
908
}
910
909
911
910
fn get_key_value_pairs ( & self ) -> Vec < ( PyObjectRef , PyObjectRef ) > {
912
911
if let Some ( _) = self . payload :: < PyDict > ( ) {
913
912
objdict:: get_key_value_pairs ( self )
913
+ } else if let Some ( PyModule { ref scope, .. } ) = self . payload :: < PyModule > ( ) {
914
+ scope. locals . get_key_value_pairs ( )
914
915
} else {
915
- match self . payload {
916
- PyObjectPayload :: Module { ref scope, .. } => scope. locals . get_key_value_pairs ( ) ,
917
- _ => panic ! ( "TODO" ) ,
918
- }
916
+ panic ! ( "TODO" )
919
917
}
920
918
}
921
919
@@ -924,13 +922,10 @@ impl DictProtocol for PyObjectRef {
924
922
if let Some ( dict) = self . payload :: < PyDict > ( ) {
925
923
let key = ctx. new_str ( key. to_string ( ) ) ;
926
924
objdict:: set_item_in_content ( & mut dict. entries . borrow_mut ( ) , & key, & v) ;
925
+ } else if let Some ( PyModule { ref scope, .. } ) = self . payload :: < PyModule > ( ) {
926
+ scope. locals . set_item ( ctx, key, v) ;
927
927
} else {
928
- match & self . payload {
929
- PyObjectPayload :: Module { scope, .. } => {
930
- scope. locals . set_item ( ctx, key, v) ;
931
- }
932
- ref k => panic ! ( "TODO {:?}" , k) ,
933
- } ;
928
+ panic ! ( "TODO {:?}" , self ) ;
934
929
}
935
930
}
936
931
}
@@ -1542,10 +1537,6 @@ pub enum PyObjectPayload {
1542
1537
function : PyObjectRef ,
1543
1538
object : PyObjectRef ,
1544
1539
} ,
1545
- Module {
1546
- name : String ,
1547
- scope : ScopeRef ,
1548
- } ,
1549
1540
WeakRef {
1550
1541
referent : PyObjectWeakRef ,
1551
1542
} ,
@@ -1582,7 +1573,6 @@ impl fmt::Debug for PyObjectPayload {
1582
1573
ref function,
1583
1574
ref object,
1584
1575
} => write ! ( f, "bound-method: {:?} of {:?}" , function, object) ,
1585
- PyObjectPayload :: Module { .. } => write ! ( f, "module" ) ,
1586
1576
PyObjectPayload :: RustFunction { .. } => write ! ( f, "rust function" ) ,
1587
1577
PyObjectPayload :: Frame { .. } => write ! ( f, "frame" ) ,
1588
1578
PyObjectPayload :: AnyRustValue { value } => value. fmt ( f) ,
0 commit comments