@@ -18,7 +18,7 @@ use crate::obj::objbytearray;
18
18
use crate :: obj:: objbytes;
19
19
use crate :: obj:: objcode;
20
20
use crate :: obj:: objcomplex:: { self , PyComplex } ;
21
- use crate :: obj:: objdict;
21
+ use crate :: obj:: objdict:: { self , PyDict } ;
22
22
use crate :: obj:: objenumerate;
23
23
use crate :: obj:: objfilter;
24
24
use crate :: obj:: objfloat:: { self , PyFloat } ;
@@ -545,8 +545,8 @@ impl PyContext {
545
545
546
546
pub fn new_dict ( & self ) -> PyObjectRef {
547
547
PyObject :: new (
548
- PyObjectPayload :: Dict {
549
- elements : RefCell :: new ( HashMap :: new ( ) ) ,
548
+ PyObjectPayload :: AnyRustValue {
549
+ value : Box :: new ( PyDict :: default ( ) ) ,
550
550
} ,
551
551
self . dict_type ( ) ,
552
552
)
@@ -654,12 +654,11 @@ impl PyContext {
654
654
655
655
// Item set/get:
656
656
pub fn set_item ( & self , obj : & PyObjectRef , key : & str , v : PyObjectRef ) {
657
- match obj. payload {
658
- PyObjectPayload :: Dict { ref elements } => {
659
- let key = self . new_str ( key. to_string ( ) ) ;
660
- objdict:: set_item_in_content ( & mut elements. borrow_mut ( ) , & key, & v) ;
661
- }
662
- ref k => panic ! ( "TODO {:?}" , k) ,
657
+ if let Some ( dict) = obj. payload :: < PyDict > ( ) {
658
+ let key = self . new_str ( key. to_string ( ) ) ;
659
+ objdict:: set_item_in_content ( & mut dict. entries . borrow_mut ( ) , & key, & v) ;
660
+ } else {
661
+ unimplemented ! ( )
663
662
} ;
664
663
}
665
664
@@ -816,44 +815,48 @@ pub trait DictProtocol {
816
815
817
816
impl DictProtocol for PyObjectRef {
818
817
fn contains_key ( & self , k : & str ) -> bool {
819
- match self . payload {
820
- PyObjectPayload :: Dict { ref elements } => {
821
- objdict:: content_contains_key_str ( & elements. borrow ( ) , k)
822
- }
823
- ref payload => unimplemented ! ( "TODO {:?}" , payload) ,
818
+ if let Some ( dict) = self . payload :: < PyDict > ( ) {
819
+ objdict:: content_contains_key_str ( & dict. entries . borrow ( ) , k)
820
+ } else {
821
+ unimplemented ! ( )
824
822
}
825
823
}
826
824
827
825
fn get_item ( & self , k : & str ) -> Option < PyObjectRef > {
828
- match self . payload {
829
- PyObjectPayload :: Dict { ref elements } => {
830
- objdict:: content_get_key_str ( & elements. borrow ( ) , k)
826
+ if let Some ( dict) = self . payload :: < PyDict > ( ) {
827
+ objdict:: content_get_key_str ( & dict. entries . borrow ( ) , k)
828
+ } else {
829
+ match self . payload {
830
+ PyObjectPayload :: Module { ref scope, .. } => scope. locals . get_item ( k) ,
831
+ ref k => panic ! ( "TODO {:?}" , k) ,
831
832
}
832
- PyObjectPayload :: Module { ref scope, .. } => scope. locals . get_item ( k) ,
833
- ref k => panic ! ( "TODO {:?}" , k) ,
834
833
}
835
834
}
836
835
837
836
fn get_key_value_pairs ( & self ) -> Vec < ( PyObjectRef , PyObjectRef ) > {
838
- match self . payload {
839
- PyObjectPayload :: Dict { .. } => objdict:: get_key_value_pairs ( self ) ,
840
- PyObjectPayload :: Module { ref scope, .. } => scope. locals . get_key_value_pairs ( ) ,
841
- _ => panic ! ( "TODO" ) ,
837
+ if let Some ( _) = self . payload :: < PyDict > ( ) {
838
+ objdict:: get_key_value_pairs ( self )
839
+ } else {
840
+ match self . payload {
841
+ PyObjectPayload :: Module { ref scope, .. } => scope. locals . get_key_value_pairs ( ) ,
842
+ _ => panic ! ( "TODO" ) ,
843
+ }
842
844
}
843
845
}
844
846
845
847
// Item set/get:
846
848
fn set_item ( & self , ctx : & PyContext , key : & str , v : PyObjectRef ) {
847
- match & self . payload {
848
- PyObjectPayload :: Dict { elements } => {
849
- let key = ctx. new_str ( key. to_string ( ) ) ;
850
- objdict:: set_item_in_content ( & mut elements. borrow_mut ( ) , & key, & v) ;
851
- }
852
- PyObjectPayload :: Module { scope, .. } => {
853
- scope. locals . set_item ( ctx, key, v) ;
854
- }
855
- ref k => panic ! ( "TODO {:?}" , k) ,
856
- } ;
849
+ if let Some ( dict) = self . payload :: < PyDict > ( ) {
850
+ let key = ctx. new_str ( key. to_string ( ) ) ;
851
+ objdict:: set_item_in_content ( & mut dict. entries . borrow_mut ( ) , & key, & v) ;
852
+ } else {
853
+ match & self . payload {
854
+ PyObjectPayload :: Module { scope, .. } => {
855
+ scope. locals . set_item ( ctx, key, v) ;
856
+ }
857
+ ref k => panic ! ( "TODO {:?}" , k) ,
858
+ } ;
859
+ }
857
860
}
858
861
}
859
862
@@ -1417,9 +1420,6 @@ pub enum PyObjectPayload {
1417
1420
Sequence {
1418
1421
elements : RefCell < Vec < PyObjectRef > > ,
1419
1422
} ,
1420
- Dict {
1421
- elements : RefCell < objdict:: DictContentType > ,
1422
- } ,
1423
1423
Iterator {
1424
1424
position : Cell < usize > ,
1425
1425
iterated_obj : PyObjectRef ,
@@ -1496,7 +1496,6 @@ impl fmt::Debug for PyObjectPayload {
1496
1496
PyObjectPayload :: Integer { ref value } => write ! ( f, "int {}" , value) ,
1497
1497
PyObjectPayload :: MemoryView { ref obj } => write ! ( f, "bytes/bytearray {:?}" , obj) ,
1498
1498
PyObjectPayload :: Sequence { .. } => write ! ( f, "list or tuple" ) ,
1499
- PyObjectPayload :: Dict { .. } => write ! ( f, "dict" ) ,
1500
1499
PyObjectPayload :: WeakRef { .. } => write ! ( f, "weakref" ) ,
1501
1500
PyObjectPayload :: Iterator { .. } => write ! ( f, "iterator" ) ,
1502
1501
PyObjectPayload :: EnumerateIterator { .. } => write ! ( f, "enumerate" ) ,
0 commit comments