Operator assignment statement such as x += 1
(builder: IRBuilder, stmt: OperatorAssignmentStmt)
| 283 | |
| 284 | |
| 285 | def transform_operator_assignment_stmt(builder: IRBuilder, stmt: OperatorAssignmentStmt) -> None: |
| 286 | """Operator assignment statement such as x += 1""" |
| 287 | builder.disallow_class_assignments([stmt.lvalue], stmt.line) |
| 288 | if ( |
| 289 | is_tagged(builder.node_type(stmt.lvalue)) |
| 290 | and is_tagged(builder.node_type(stmt.rvalue)) |
| 291 | and stmt.op in int_borrow_friendly_op |
| 292 | ): |
| 293 | can_borrow = is_borrow_friendly_expr(builder, stmt.rvalue) and is_borrow_friendly_expr( |
| 294 | builder, stmt.lvalue |
| 295 | ) |
| 296 | else: |
| 297 | can_borrow = False |
| 298 | target = builder.get_assignment_target(stmt.lvalue) |
| 299 | target_value = builder.read(target, stmt.line, can_borrow=can_borrow) |
| 300 | rreg = builder.accept(stmt.rvalue, can_borrow=can_borrow) |
| 301 | # the Python parser strips the '=' from operator assignment statements, so re-add it |
| 302 | op = stmt.op + "=" |
| 303 | res = builder.binary_op(target_value, rreg, op, stmt.line) |
| 304 | # usually operator assignments are done in-place |
| 305 | # but when target doesn't support that we need to manually assign |
| 306 | builder.assign(target, res, res.line) |
| 307 | builder.flush_keep_alives(res.line) |
| 308 | |
| 309 | |
| 310 | def import_globals_id_and_name(module_id: str, as_name: str | None) -> tuple[str, str]: |
no test coverage detected
searching dependent graphs…