Skip to content

Commit e54d9f1

Browse files
committed
Add an update_sources method to all Values
1 parent a3af87b commit e54d9f1

File tree

1 file changed

+106
-1
lines changed

1 file changed

+106
-1
lines changed

mypyc/ir/ops.py

Lines changed: 106 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,10 @@ def can_raise(self) -> bool:
235235
def sources(self) -> list[Value]:
236236
"""All the values the op may read."""
237237

238+
@abstractmethod
239+
def set_sources(self, new: list[Value]) -> None:
240+
"""Rewrite the soruces of an op"""
241+
238242
def stolen(self) -> list[Value]:
239243
"""Return arguments that have a reference count stolen by this op"""
240244
return []
@@ -271,6 +275,9 @@ def __init__(self, dest: Register, src: Value, line: int = -1) -> None:
271275
def sources(self) -> list[Value]:
272276
return [self.src]
273277

278+
def set_sources(self, new: list[Value]) -> None:
279+
(self.src,) = new
280+
274281
def stolen(self) -> list[Value]:
275282
return [self.src]
276283

@@ -301,6 +308,9 @@ def __init__(self, dest: Register, src: list[Value], line: int = -1) -> None:
301308
def sources(self) -> list[Value]:
302309
return self.src.copy()
303310

311+
def set_sources(self, new: list[Value]) -> None:
312+
self.src = new[:]
313+
304314
def stolen(self) -> list[Value]:
305315
return []
306316

@@ -342,6 +352,9 @@ def __repr__(self) -> str:
342352
def sources(self) -> list[Value]:
343353
return []
344354

355+
def set_sources(self, new: list[Value]) -> None:
356+
assert not new
357+
345358
def accept(self, visitor: OpVisitor[T]) -> T:
346359
return visitor.visit_goto(self)
347360

@@ -402,6 +415,9 @@ def set_target(self, i: int, new: BasicBlock) -> None:
402415
def sources(self) -> list[Value]:
403416
return [self.value]
404417

418+
def set_sources(self, new: list[Value]) -> None:
419+
(self.value,) = new
420+
405421
def invert(self) -> None:
406422
self.negated = not self.negated
407423

@@ -421,6 +437,9 @@ def __init__(self, value: Value, line: int = -1) -> None:
421437
def sources(self) -> list[Value]:
422438
return [self.value]
423439

440+
def set_sources(self, new: list[Value]) -> None:
441+
(self.value,) = new
442+
424443
def stolen(self) -> list[Value]:
425444
return [self.value]
426445

@@ -452,6 +471,9 @@ def __init__(self, line: int = -1) -> None:
452471
def sources(self) -> list[Value]:
453472
return []
454473

474+
def set_sources(self, new: list[Value]) -> None:
475+
assert not new
476+
455477
def accept(self, visitor: OpVisitor[T]) -> T:
456478
return visitor.visit_unreachable(self)
457479

@@ -494,6 +516,9 @@ def __init__(self, src: Value, line: int = -1) -> None:
494516
def sources(self) -> list[Value]:
495517
return [self.src]
496518

519+
def set_sources(self, new: list[Value]) -> None:
520+
(self.src,) = new
521+
497522
def accept(self, visitor: OpVisitor[T]) -> T:
498523
return visitor.visit_inc_ref(self)
499524

@@ -519,6 +544,9 @@ def __repr__(self) -> str:
519544
def sources(self) -> list[Value]:
520545
return [self.src]
521546

547+
def set_sources(self, new: list[Value]) -> None:
548+
(self.src,) = new
549+
522550
def accept(self, visitor: OpVisitor[T]) -> T:
523551
return visitor.visit_dec_ref(self)
524552

@@ -544,6 +572,9 @@ def __init__(self, fn: FuncDecl, args: Sequence[Value], line: int) -> None:
544572
def sources(self) -> list[Value]:
545573
return list(self.args.copy())
546574

575+
def set_sources(self, new: list[Value]) -> None:
576+
self.args = new[:]
577+
547578
def accept(self, visitor: OpVisitor[T]) -> T:
548579
return visitor.visit_call(self)
549580

@@ -572,6 +603,9 @@ def __init__(self, obj: Value, method: str, args: list[Value], line: int = -1) -
572603
def sources(self) -> list[Value]:
573604
return self.args.copy() + [self.obj]
574605

606+
def set_sources(self, new: list[Value]) -> None:
607+
*self.args, self.obj = new
608+
575609
def accept(self, visitor: OpVisitor[T]) -> T:
576610
return visitor.visit_method_call(self)
577611

@@ -599,6 +633,9 @@ def __init__(
599633
def sources(self) -> list[Value]:
600634
return []
601635

636+
def set_sources(self, new: list[Value]) -> None:
637+
assert not new
638+
602639
def accept(self, visitor: OpVisitor[T]) -> T:
603640
return visitor.visit_load_error_value(self)
604641

@@ -631,6 +668,9 @@ def __init__(self, value: LiteralValue, rtype: RType) -> None:
631668
def sources(self) -> list[Value]:
632669
return []
633670

671+
def set_sources(self, new: list[Value]) -> None:
672+
assert not new
673+
634674
def accept(self, visitor: OpVisitor[T]) -> T:
635675
return visitor.visit_load_literal(self)
636676

@@ -655,6 +695,9 @@ def __init__(self, obj: Value, attr: str, line: int, *, borrow: bool = False) ->
655695
def sources(self) -> list[Value]:
656696
return [self.obj]
657697

698+
def set_sources(self, new: list[Value]) -> None:
699+
(self.obj,) = new
700+
658701
def accept(self, visitor: OpVisitor[T]) -> T:
659702
return visitor.visit_get_attr(self)
660703

@@ -687,6 +730,9 @@ def mark_as_initializer(self) -> None:
687730
def sources(self) -> list[Value]:
688731
return [self.obj, self.src]
689732

733+
def set_sources(self, new: list[Value]) -> None:
734+
self.obj, self.src = new
735+
690736
def stolen(self) -> list[Value]:
691737
return [self.src]
692738

@@ -737,6 +783,9 @@ def __init__(
737783
def sources(self) -> list[Value]:
738784
return []
739785

786+
def set_sources(self, new: list[Value]) -> None:
787+
assert not new
788+
740789
def accept(self, visitor: OpVisitor[T]) -> T:
741790
return visitor.visit_load_static(self)
742791

@@ -766,6 +815,9 @@ def __init__(
766815
def sources(self) -> list[Value]:
767816
return [self.value]
768817

818+
def set_sources(self, new: list[Value]) -> None:
819+
(self.value,) = new
820+
769821
def accept(self, visitor: OpVisitor[T]) -> T:
770822
return visitor.visit_init_static(self)
771823

@@ -795,6 +847,9 @@ def sources(self) -> list[Value]:
795847
def stolen(self) -> list[Value]:
796848
return self.items.copy()
797849

850+
def set_sources(self, new: list[Value]) -> None:
851+
self.items = new[:]
852+
798853
def accept(self, visitor: OpVisitor[T]) -> T:
799854
return visitor.visit_tuple_set(self)
800855

@@ -816,6 +871,9 @@ def __init__(self, src: Value, index: int, line: int = -1, *, borrow: bool = Fal
816871
def sources(self) -> list[Value]:
817872
return [self.src]
818873

874+
def set_sources(self, new: list[Value]) -> None:
875+
(self.src,) = new
876+
819877
def accept(self, visitor: OpVisitor[T]) -> T:
820878
return visitor.visit_tuple_get(self)
821879

@@ -839,6 +897,9 @@ def __init__(self, src: Value, typ: RType, line: int, *, borrow: bool = False) -
839897
def sources(self) -> list[Value]:
840898
return [self.src]
841899

900+
def set_sources(self, new: list[Value]) -> None:
901+
(self.src,) = new
902+
842903
def stolen(self) -> list[Value]:
843904
if self.is_borrowed:
844905
return []
@@ -872,6 +933,9 @@ def __init__(self, src: Value, line: int = -1) -> None:
872933
def sources(self) -> list[Value]:
873934
return [self.src]
874935

936+
def set_sources(self, new: list[Value]) -> None:
937+
(self.src,) = new
938+
875939
def stolen(self) -> list[Value]:
876940
return [self.src]
877941

@@ -898,6 +962,9 @@ def __init__(self, src: Value, typ: RType, line: int) -> None:
898962
def sources(self) -> list[Value]:
899963
return [self.src]
900964

965+
def set_sources(self, new: list[Value]) -> None:
966+
(self.src,) = new
967+
901968
def accept(self, visitor: OpVisitor[T]) -> T:
902969
return visitor.visit_unbox(self)
903970

@@ -930,6 +997,9 @@ def __init__(self, class_name: str, value: str | Value | None, line: int) -> Non
930997
def sources(self) -> list[Value]:
931998
return []
932999

1000+
def set_sources(self, new: list[Value]) -> None:
1001+
assert not new
1002+
9331003
def accept(self, visitor: OpVisitor[T]) -> T:
9341004
return visitor.visit_raise_standard_error(self)
9351005

@@ -968,7 +1038,10 @@ def __init__(
9681038
self.var_arg_idx = var_arg_idx
9691039

9701040
def sources(self) -> list[Value]:
971-
return self.args
1041+
return self.args[:]
1042+
1043+
def set_sources(self, new: list[Value]) -> None:
1044+
self.args = new[:]
9721045

9731046
def stolen(self) -> list[Value]:
9741047
if isinstance(self.steals, list):
@@ -1001,6 +1074,9 @@ def __init__(self, src: Value, dst_type: RType, line: int = -1) -> None:
10011074
def sources(self) -> list[Value]:
10021075
return [self.src]
10031076

1077+
def set_sources(self, new: list[Value]) -> None:
1078+
(self.src,) = new
1079+
10041080
def stolen(self) -> list[Value]:
10051081
return []
10061082

@@ -1032,6 +1108,9 @@ def __init__(self, src: Value, dst_type: RType, signed: bool, line: int = -1) ->
10321108
def sources(self) -> list[Value]:
10331109
return [self.src]
10341110

1111+
def set_sources(self, new: list[Value]) -> None:
1112+
(self.src,) = new
1113+
10351114
def stolen(self) -> list[Value]:
10361115
return []
10371116

@@ -1059,6 +1138,9 @@ def __init__(self, type: RType, identifier: str, line: int = -1, ann: object = N
10591138
def sources(self) -> list[Value]:
10601139
return []
10611140

1141+
def set_sources(self, new: list[Value]) -> None:
1142+
(self.src,) = new
1143+
10621144
def accept(self, visitor: OpVisitor[T]) -> T:
10631145
return visitor.visit_load_global(self)
10641146

@@ -1115,6 +1197,9 @@ def __init__(self, type: RType, lhs: Value, rhs: Value, op: int, line: int = -1)
11151197
def sources(self) -> list[Value]:
11161198
return [self.lhs, self.rhs]
11171199

1200+
def set_sources(self, new: list[Value]) -> None:
1201+
self.lhs, self.rhs = new
1202+
11181203
def accept(self, visitor: OpVisitor[T]) -> T:
11191204
return visitor.visit_int_op(self)
11201205

@@ -1178,6 +1263,9 @@ def __init__(self, lhs: Value, rhs: Value, op: int, line: int = -1) -> None:
11781263
def sources(self) -> list[Value]:
11791264
return [self.lhs, self.rhs]
11801265

1266+
def set_sources(self, new: list[Value]) -> None:
1267+
self.lhs, self.rhs = new
1268+
11811269
def accept(self, visitor: OpVisitor[T]) -> T:
11821270
return visitor.visit_comparison_op(self)
11831271

@@ -1292,6 +1380,9 @@ def __init__(self, type: RType, src: Value, line: int = -1) -> None:
12921380
def sources(self) -> list[Value]:
12931381
return [self.src]
12941382

1383+
def set_sources(self, new: list[Value]) -> None:
1384+
(self.src,) = new
1385+
12951386
def accept(self, visitor: OpVisitor[T]) -> T:
12961387
return visitor.visit_load_mem(self)
12971388

@@ -1317,6 +1408,9 @@ def __init__(self, type: RType, dest: Value, src: Value, line: int = -1) -> None
13171408
def sources(self) -> list[Value]:
13181409
return [self.src, self.dest]
13191410

1411+
def set_sources(self, new: list[Value]) -> None:
1412+
self.src, self.dest = new
1413+
13201414
def stolen(self) -> list[Value]:
13211415
return [self.src]
13221416

@@ -1343,6 +1437,9 @@ def __init__(self, src: Value, src_type: RType, field: str, line: int = -1) -> N
13431437
def sources(self) -> list[Value]:
13441438
return [self.src]
13451439

1440+
def set_sources(self, new: list[Value]) -> None:
1441+
(self.src,) = new
1442+
13461443
def accept(self, visitor: OpVisitor[T]) -> T:
13471444
return visitor.visit_get_element_ptr(self)
13481445

@@ -1371,6 +1468,11 @@ def sources(self) -> list[Value]:
13711468
else:
13721469
return []
13731470

1471+
def set_sources(self, new: list[Value]) -> None:
1472+
if new:
1473+
assert isinstance(new[0], Register)
1474+
self.src = new[0]
1475+
13741476
def accept(self, visitor: OpVisitor[T]) -> T:
13751477
return visitor.visit_load_address(self)
13761478

@@ -1415,6 +1517,9 @@ def stolen(self) -> list[Value]:
14151517
return self.src.copy()
14161518
return []
14171519

1520+
def set_sources(self, new: list[Value]) -> None:
1521+
self.src = new[:]
1522+
14181523
def accept(self, visitor: OpVisitor[T]) -> T:
14191524
return visitor.visit_keep_alive(self)
14201525

0 commit comments

Comments
 (0)