@@ -9,6 +9,7 @@ use super::obj::objint;
99use super :: obj:: objiter;
1010use super :: obj:: objlist;
1111use super :: obj:: objobject;
12+ use super :: obj:: objset;
1213use super :: obj:: objstr;
1314use super :: obj:: objtuple;
1415use super :: obj:: objtype;
@@ -61,6 +62,7 @@ pub struct PyContext {
6162 pub false_value : PyObjectRef ,
6263 pub list_type : PyObjectRef ,
6364 pub tuple_type : PyObjectRef ,
65+ pub set_type : PyObjectRef ,
6466 pub iter_type : PyObjectRef ,
6567 pub str_type : PyObjectRef ,
6668 pub function_type : PyObjectRef ,
@@ -122,6 +124,7 @@ impl PyContext {
122124 create_type ( "member_descriptor" , & type_type, & object_type, & dict_type) ;
123125 let str_type = create_type ( "str" , & type_type, & object_type, & dict_type) ;
124126 let list_type = create_type ( "list" , & type_type, & object_type, & dict_type) ;
127+ let set_type = create_type ( "set" , & type_type, & object_type, & dict_type) ;
125128 let int_type = create_type ( "int" , & type_type, & object_type, & dict_type) ;
126129 let float_type = create_type ( "float" , & type_type, & object_type, & dict_type) ;
127130 let bytes_type = create_type ( "bytes" , & type_type, & object_type, & dict_type) ;
@@ -142,6 +145,7 @@ impl PyContext {
142145 float_type : float_type,
143146 bytes_type : bytes_type,
144147 list_type : list_type,
148+ set_type : set_type,
145149 bool_type : bool_type,
146150 true_value : true_value,
147151 false_value : false_value,
@@ -160,6 +164,7 @@ impl PyContext {
160164 } ;
161165 objtype:: init ( & context) ;
162166 objlist:: init ( & context) ;
167+ objset:: init ( & context) ;
163168 objtuple:: init ( & context) ;
164169 objobject:: init ( & context) ;
165170 objdict:: init ( & context) ;
@@ -190,6 +195,11 @@ impl PyContext {
190195 pub fn list_type ( & self ) -> PyObjectRef {
191196 self . list_type . clone ( )
192197 }
198+
199+ pub fn set_type ( & self ) -> PyObjectRef {
200+ self . set_type . clone ( )
201+ }
202+
193203 pub fn bool_type ( & self ) -> PyObjectRef {
194204 self . bool_type . clone ( )
195205 }
@@ -269,6 +279,11 @@ impl PyContext {
269279 PyObject :: new ( PyObjectKind :: List { elements : elements } , self . list_type ( ) )
270280 }
271281
282+ pub fn new_set ( & self , elements : Vec < PyObjectRef > ) -> PyObjectRef {
283+ let elements = objset:: sequence_to_hashmap ( & elements) ;
284+ PyObject :: new ( PyObjectKind :: Set { elements : elements } , self . set_type ( ) )
285+ }
286+
272287 pub fn new_dict ( & self ) -> PyObjectRef {
273288 PyObject :: new (
274289 PyObjectKind :: Dict {
@@ -611,6 +626,9 @@ pub enum PyObjectKind {
611626 Dict {
612627 elements : HashMap < String , PyObjectRef > ,
613628 } ,
629+ Set {
630+ elements : HashMap < usize , PyObjectRef > ,
631+ } ,
614632 Iterator {
615633 position : usize ,
616634 iterated_obj : PyObjectRef ,
@@ -663,6 +681,7 @@ impl fmt::Debug for PyObjectKind {
663681 & PyObjectKind :: List { elements : _ } => write ! ( f, "list" ) ,
664682 & PyObjectKind :: Tuple { elements : _ } => write ! ( f, "tuple" ) ,
665683 & PyObjectKind :: Dict { elements : _ } => write ! ( f, "dict" ) ,
684+ & PyObjectKind :: Set { elements : _ } => write ! ( f, "set" ) ,
666685 & PyObjectKind :: Iterator {
667686 position : _,
668687 iterated_obj : _,
@@ -738,6 +757,14 @@ impl PyObject {
738757 . collect:: <Vec <_>>( )
739758 . join( ", " )
740759 ) ,
760+ PyObjectKind :: Set { ref elements } => format ! (
761+ "{{ {} }}" ,
762+ elements
763+ . iter( )
764+ . map( |elem| elem. 1 . borrow( ) . str ( ) )
765+ . collect:: <Vec <_>>( )
766+ . join( ", " )
767+ ) ,
741768 PyObjectKind :: None => String :: from ( "None" ) ,
742769 PyObjectKind :: Class {
743770 ref name,
0 commit comments