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