@@ -105,7 +105,7 @@ func TestObjectDelAttr(t *testing.T) {
105105 })
106106 dellerType := newTestClass ("Deller" , []* Type {ObjectType }, newStringDict (map [string ]* Object {
107107 "__get__" : newBuiltinFunction ("__get__" , func (f * Frame , args Args , kwargs KWArgs ) (* Object , * BaseException ) {
108- attr , raised := args [1 ].dict .GetItemString (f , "attr" )
108+ attr , raised := args [1 ].Dict () .GetItemString (f , "attr" )
109109 if raised != nil {
110110 return nil , raised
111111 }
@@ -115,7 +115,7 @@ func TestObjectDelAttr(t *testing.T) {
115115 return attr , nil
116116 }).ToObject (),
117117 "__delete__" : newBuiltinFunction ("__delete__" , func (f * Frame , args Args , kwargs KWArgs ) (* Object , * BaseException ) {
118- deleted , raised := args [1 ].dict .DelItemString (f , "attr" )
118+ deleted , raised := args [1 ].Dict () .DelItemString (f , "attr" )
119119 if raised != nil {
120120 return nil , raised
121121 }
@@ -127,7 +127,7 @@ func TestObjectDelAttr(t *testing.T) {
127127 }))
128128 fooType := newTestClass ("Foo" , []* Type {ObjectType }, newStringDict (map [string ]* Object {"deller" : newObject (dellerType )}))
129129 foo := newObject (fooType )
130- if raised := foo .dict .SetItemString (NewRootFrame (), "attr" , NewInt (123 ).ToObject ()); raised != nil {
130+ if raised := foo .Dict () .SetItemString (NewRootFrame (), "attr" , NewInt (123 ).ToObject ()); raised != nil {
131131 t .Fatal (raised )
132132 }
133133 cases := []invokeTestCase {
@@ -180,13 +180,13 @@ func TestObjectGetAttribute(t *testing.T) {
180180 "barsetter" : setter ,
181181 }))
182182 foo := newObject (fooType )
183- if raised := foo .dict .SetItemString (NewRootFrame (), "fooattr" , True .ToObject ()); raised != nil {
183+ if raised := foo .Dict () .SetItemString (NewRootFrame (), "fooattr" , True .ToObject ()); raised != nil {
184184 t .Fatal (raised )
185185 }
186- if raised := foo .dict .SetItemString (NewRootFrame (), "barattr" , NewInt (- 1 ).ToObject ()); raised != nil {
186+ if raised := foo .Dict () .SetItemString (NewRootFrame (), "barattr" , NewInt (- 1 ).ToObject ()); raised != nil {
187187 t .Fatal (raised )
188188 }
189- if raised := foo .dict .SetItemString (NewRootFrame (), "barsetter" , NewStr ("NOT setter" ).ToObject ()); raised != nil {
189+ if raised := foo .Dict () .SetItemString (NewRootFrame (), "barsetter" , NewStr ("NOT setter" ).ToObject ()); raised != nil {
190190 t .Fatal (raised )
191191 }
192192 cases := []invokeTestCase {
@@ -205,6 +205,52 @@ func TestObjectGetAttribute(t *testing.T) {
205205 }
206206}
207207
208+ func TestObjectGetDict (t * testing.T ) {
209+ fooType := newTestClass ("Foo" , []* Type {ObjectType }, NewDict ())
210+ foo := newObject (fooType )
211+ if raised := SetAttr (NewRootFrame (), foo , NewStr ("bar" ), NewInt (123 ).ToObject ()); raised != nil {
212+ panic (raised )
213+ }
214+ fun := wrapFuncForTest (func (f * Frame , o * Object ) (* Object , * BaseException ) {
215+ return GetAttr (f , o , NewStr ("__dict__" ), nil )
216+ })
217+ cases := []invokeTestCase {
218+ {args : wrapArgs (newObject (ObjectType )), wantExc : mustCreateException (AttributeErrorType , "'object' object has no attribute '__dict__'" )},
219+ {args : wrapArgs (newObject (fooType )), want : NewDict ().ToObject ()},
220+ {args : wrapArgs (foo ), want : newStringDict (map [string ]* Object {"bar" : NewInt (123 ).ToObject ()}).ToObject ()},
221+ }
222+ for _ , cas := range cases {
223+ if err := runInvokeTestCase (fun , & cas ); err != "" {
224+ t .Error (err )
225+ }
226+ }
227+ }
228+
229+ func TestObjectSetDict (t * testing.T ) {
230+ fooType := newTestClass ("Foo" , []* Type {ObjectType }, NewDict ())
231+ testDict := newStringDict (map [string ]* Object {"bar" : NewInt (123 ).ToObject ()})
232+ fun := wrapFuncForTest (func (f * Frame , o , val * Object ) (* Object , * BaseException ) {
233+ if raised := SetAttr (f , o , NewStr ("__dict__" ), val ); raised != nil {
234+ return nil , raised
235+ }
236+ d := o .Dict ()
237+ if d == nil {
238+ return None , nil
239+ }
240+ return d .ToObject (), nil
241+ })
242+ cases := []invokeTestCase {
243+ {args : wrapArgs (newObject (ObjectType ), NewDict ()), wantExc : mustCreateException (AttributeErrorType , "'object' object has no attribute '__dict__'" )},
244+ {args : wrapArgs (newObject (fooType ), testDict ), want : testDict .ToObject ()},
245+ {args : wrapArgs (newObject (fooType ), 123 ), wantExc : mustCreateException (TypeErrorType , "'_set_dict' requires a 'dict' object but received a 'int'" )},
246+ }
247+ for _ , cas := range cases {
248+ if err := runInvokeTestCase (fun , & cas ); err != "" {
249+ t .Error (err )
250+ }
251+ }
252+ }
253+
208254func TestObjectNew (t * testing.T ) {
209255 foo := makeTestType ("Foo" , ObjectType )
210256 foo .flags &= ^ typeFlagInstantiable
@@ -335,7 +381,7 @@ func TestObjectSetAttr(t *testing.T) {
335381 })
336382 setterType := newTestClass ("Setter" , []* Type {ObjectType }, newStringDict (map [string ]* Object {
337383 "__get__" : newBuiltinFunction ("__get__" , func (f * Frame , args Args , kwargs KWArgs ) (* Object , * BaseException ) {
338- item , raised := args [1 ].dict .GetItemString (f , "attr" )
384+ item , raised := args [1 ].Dict () .GetItemString (f , "attr" )
339385 if raised != nil {
340386 return nil , raised
341387 }
@@ -345,7 +391,7 @@ func TestObjectSetAttr(t *testing.T) {
345391 return item , nil
346392 }).ToObject (),
347393 "__set__" : newBuiltinFunction ("__set__" , func (f * Frame , args Args , kwargs KWArgs ) (* Object , * BaseException ) {
348- if raised := args [1 ].dict .SetItemString (f , "attr" , NewTuple (args .makeCopy ()... ).ToObject ()); raised != nil {
394+ if raised := args [1 ].Dict () .SetItemString (f , "attr" , NewTuple (args .makeCopy ()... ).ToObject ()); raised != nil {
349395 return nil , raised
350396 }
351397 return None , nil
0 commit comments