MCPcopy Create free account
hub / github.com/python/mypy / transform_operator_assignment_stmt

Function transform_operator_assignment_stmt

mypyc/irbuild/statement.py:285–307  ·  view source on GitHub ↗

Operator assignment statement such as x += 1

(builder: IRBuilder, stmt: OperatorAssignmentStmt)

Source from the content-addressed store, hash-verified

283
284
285def 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
310def import_globals_id_and_name(module_id: str, as_name: str | None) -> tuple[str, str]:

Callers 1

Calls 10

is_taggedFunction · 0.90
is_borrow_friendly_exprFunction · 0.90
node_typeMethod · 0.80
get_assignment_targetMethod · 0.80
readMethod · 0.45
acceptMethod · 0.45
binary_opMethod · 0.45
assignMethod · 0.45
flush_keep_alivesMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…