@@ -186,8 +186,14 @@ mod builtins {
186186 }
187187
188188 #[ pyfunction]
189- fn delattr ( obj : PyObjectRef , attr : PyStrRef , vm : & VirtualMachine ) -> PyResult < ( ) > {
190- obj. del_attr ( & attr, vm)
189+ fn delattr ( obj : PyObjectRef , attr : PyObjectRef , vm : & VirtualMachine ) -> PyResult < ( ) > {
190+ let attr = attr. try_to_ref :: < PyStr > ( vm) . map_err ( |_e| {
191+ vm. new_type_error ( format ! (
192+ "attribute name must be string, not '{}'" ,
193+ attr. class( ) . name( )
194+ ) )
195+ } ) ?;
196+ obj. del_attr ( attr, vm)
191197 }
192198
193199 #[ pyfunction]
@@ -321,14 +327,21 @@ mod builtins {
321327 #[ pyfunction]
322328 fn getattr (
323329 obj : PyObjectRef ,
324- attr : PyStrRef ,
330+ attr : PyObjectRef ,
325331 default : OptionalArg < PyObjectRef > ,
326332 vm : & VirtualMachine ,
327333 ) -> PyResult {
334+ let attr = attr. try_to_ref :: < PyStr > ( vm) . map_err ( |_e| {
335+ vm. new_type_error ( format ! (
336+ "attribute name must be string, not '{}'" ,
337+ attr. class( ) . name( )
338+ ) )
339+ } ) ?;
340+
328341 if let OptionalArg :: Present ( default) = default {
329- Ok ( vm. get_attribute_opt ( obj, & attr) ?. unwrap_or ( default) )
342+ Ok ( vm. get_attribute_opt ( obj, attr) ?. unwrap_or ( default) )
330343 } else {
331- obj. get_attr ( & attr, vm)
344+ obj. get_attr ( attr, vm)
332345 }
333346 }
334347
@@ -338,8 +351,14 @@ mod builtins {
338351 }
339352
340353 #[ pyfunction]
341- fn hasattr ( obj : PyObjectRef , attr : PyStrRef , vm : & VirtualMachine ) -> PyResult < bool > {
342- Ok ( vm. get_attribute_opt ( obj, & attr) ?. is_some ( ) )
354+ fn hasattr ( obj : PyObjectRef , attr : PyObjectRef , vm : & VirtualMachine ) -> PyResult < bool > {
355+ let attr = attr. try_to_ref :: < PyStr > ( vm) . map_err ( |_e| {
356+ vm. new_type_error ( format ! (
357+ "attribute name must be string, not '{}'" ,
358+ attr. class( ) . name( )
359+ ) )
360+ } ) ?;
361+ Ok ( vm. get_attribute_opt ( obj, attr) ?. is_some ( ) )
343362 }
344363
345364 #[ pyfunction]
@@ -742,11 +761,17 @@ mod builtins {
742761 #[ pyfunction]
743762 fn setattr (
744763 obj : PyObjectRef ,
745- attr : PyStrRef ,
764+ attr : PyObjectRef ,
746765 value : PyObjectRef ,
747766 vm : & VirtualMachine ,
748767 ) -> PyResult < ( ) > {
749- obj. set_attr ( & attr, value, vm) ?;
768+ let attr = attr. try_to_ref :: < PyStr > ( vm) . map_err ( |_e| {
769+ vm. new_type_error ( format ! (
770+ "attribute name must be string, not '{}'" ,
771+ attr. class( ) . name( )
772+ ) )
773+ } ) ?;
774+ obj. set_attr ( attr, value, vm) ?;
750775 Ok ( ( ) )
751776 }
752777
0 commit comments