7676    Integer ,
7777    IntOp ,
7878    LoadStatic ,
79+     MethodCall ,
7980    Op ,
8081    PrimitiveDescription ,
8182    RaiseStandardError ,
@@ -700,7 +701,12 @@ def get_assignment_target(
700701        assert  False , "Unsupported lvalue: %r"  %  lvalue 
701702
702703    def  read (
703-         self , target : Value  |  AssignmentTarget , line : int  =  - 1 , can_borrow : bool  =  False 
704+         self ,
705+         target : Value  |  AssignmentTarget ,
706+         line : int  =  - 1 ,
707+         * ,
708+         can_borrow : bool  =  False ,
709+         allow_error_value : bool  =  False ,
704710    ) ->  Value :
705711        if  isinstance (target , Value ):
706712            return  target 
@@ -716,7 +722,15 @@ def read(
716722        if  isinstance (target , AssignmentTargetAttr ):
717723            if  isinstance (target .obj .type , RInstance ) and  target .obj .type .class_ir .is_ext_class :
718724                borrow  =  can_borrow  and  target .can_borrow 
719-                 return  self .add (GetAttr (target .obj , target .attr , line , borrow = borrow ))
725+                 return  self .add (
726+                     GetAttr (
727+                         target .obj ,
728+                         target .attr ,
729+                         line ,
730+                         borrow = borrow ,
731+                         allow_error_value = allow_error_value ,
732+                     )
733+                 )
720734            else :
721735                return  self .py_get_attr (target .obj , target .attr , line )
722736
@@ -735,8 +749,15 @@ def assign(self, target: Register | AssignmentTarget, rvalue_reg: Value, line: i
735749            self .add (Assign (target .register , rvalue_reg ))
736750        elif  isinstance (target , AssignmentTargetAttr ):
737751            if  isinstance (target .obj_type , RInstance ):
738-                 rvalue_reg  =  self .coerce_rvalue (rvalue_reg , target .type , line )
739-                 self .add (SetAttr (target .obj , target .attr , rvalue_reg , line ))
752+                 setattr  =  target .obj_type .class_ir .get_method ("__setattr__" )
753+                 if  setattr :
754+                     key  =  self .load_str (target .attr )
755+                     boxed_reg  =  self .builder .box (rvalue_reg )
756+                     call  =  MethodCall (target .obj , setattr .name , [key , boxed_reg ], line )
757+                     self .add (call )
758+                 else :
759+                     rvalue_reg  =  self .coerce_rvalue (rvalue_reg , target .type , line )
760+                     self .add (SetAttr (target .obj , target .attr , rvalue_reg , line ))
740761            else :
741762                key  =  self .load_str (target .attr )
742763                boxed_reg  =  self .builder .box (rvalue_reg )
0 commit comments