76
76
Integer ,
77
77
IntOp ,
78
78
LoadStatic ,
79
+ MethodCall ,
79
80
Op ,
80
81
PrimitiveDescription ,
81
82
RaiseStandardError ,
@@ -700,7 +701,12 @@ def get_assignment_target(
700
701
assert False , "Unsupported lvalue: %r" % lvalue
701
702
702
703
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 ,
704
710
) -> Value :
705
711
if isinstance (target , Value ):
706
712
return target
@@ -716,7 +722,15 @@ def read(
716
722
if isinstance (target , AssignmentTargetAttr ):
717
723
if isinstance (target .obj .type , RInstance ) and target .obj .type .class_ir .is_ext_class :
718
724
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
+ )
720
734
else :
721
735
return self .py_get_attr (target .obj , target .attr , line )
722
736
@@ -735,8 +749,15 @@ def assign(self, target: Register | AssignmentTarget, rvalue_reg: Value, line: i
735
749
self .add (Assign (target .register , rvalue_reg ))
736
750
elif isinstance (target , AssignmentTargetAttr ):
737
751
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 ))
740
761
else :
741
762
key = self .load_str (target .attr )
742
763
boxed_reg = self .builder .box (rvalue_reg )
0 commit comments