(self, target: Register | AssignmentTarget, rvalue_reg: Value, line: int)
| 822 | return self.add(GetAttr(obj, attr, line, allow_error_value=True)) |
| 823 | |
| 824 | def assign(self, target: Register | AssignmentTarget, rvalue_reg: Value, line: int) -> None: |
| 825 | if isinstance(target, Register): |
| 826 | self.add(Assign(target, self.coerce_rvalue(rvalue_reg, target.type, line), line)) |
| 827 | elif isinstance(target, AssignmentTargetRegister): |
| 828 | rvalue_reg = self.coerce_rvalue(rvalue_reg, target.type, line) |
| 829 | self.add(Assign(target.register, rvalue_reg, line)) |
| 830 | elif isinstance(target, AssignmentTargetAttr): |
| 831 | if isinstance(target.obj_type, RInstance): |
| 832 | setattr = target.obj_type.class_ir.get_method("__setattr__") |
| 833 | if setattr: |
| 834 | key = self.load_str(target.attr, line) |
| 835 | boxed_reg = self.builder.box(rvalue_reg) |
| 836 | call = MethodCall(target.obj, setattr.name, [key, boxed_reg], line) |
| 837 | self.add(call) |
| 838 | else: |
| 839 | rvalue_reg = self.coerce_rvalue(rvalue_reg, target.type, line) |
| 840 | self.add(SetAttr(target.obj, target.attr, rvalue_reg, line)) |
| 841 | else: |
| 842 | key = self.load_str(target.attr, line) |
| 843 | boxed_reg = self.builder.box(rvalue_reg) |
| 844 | self.primitive_op(py_setattr_op, [target.obj, key, boxed_reg], line) |
| 845 | elif isinstance(target, AssignmentTargetIndex): |
| 846 | if isinstance(target.base.type, RVec): |
| 847 | vec_set_item(self.builder, target.base, target.index, rvalue_reg, line) |
| 848 | else: |
| 849 | target_reg2 = self.gen_method_call( |
| 850 | target.base, "__setitem__", [target.index, rvalue_reg], None, line |
| 851 | ) |
| 852 | assert target_reg2 is not None, target.base.type |
| 853 | elif isinstance(target, AssignmentTargetTuple): |
| 854 | if isinstance(rvalue_reg.type, RTuple) and target.star_idx is None: |
| 855 | rtypes = rvalue_reg.type.types |
| 856 | assert len(rtypes) == len(target.items) |
| 857 | for i in range(len(rtypes)): |
| 858 | item_value = self.add(TupleGet(rvalue_reg, i, line)) |
| 859 | self.assign(target.items[i], item_value, line) |
| 860 | elif ( |
| 861 | is_list_rprimitive(rvalue_reg.type) or is_tuple_rprimitive(rvalue_reg.type) |
| 862 | ) and target.star_idx is None: |
| 863 | self.process_sequence_assignment(target, rvalue_reg, line) |
| 864 | else: |
| 865 | self.process_iterator_tuple_assignment(target, rvalue_reg, line) |
| 866 | else: |
| 867 | assert False, "Unsupported assignment target" |
| 868 | |
| 869 | def coerce_rvalue(self, rvalue: Value, rtype: RType, line: int) -> Value: |
| 870 | if is_float_rprimitive(rtype) and is_tagged(rvalue.type): |
no test coverage detected